Warum sind feste Verknüpfungen zu Verzeichnissen unter UNIX / Linux nicht zulässig?


130

Ich habe in Lehrbüchern gelesen, dass Unix / Linux keine festen Links zu Verzeichnissen zulässt, aber weiche Links zulässt. Liegt es daran, dass, wenn wir Zyklen haben und wenn wir feste Verknüpfungen erstellen und nach einiger Zeit die Originaldatei löschen, dies auf einen Abfallwert hinweist?

Wenn Zyklen der einzige Grund dafür waren, dass harte Links nicht zugelassen wurden, warum sind dann weiche Links zu Verzeichnissen zulässig?


2
Wohin soll ..es gehen? Vor allem nach dem Entfernen des festen Links zu diesem Verzeichnis, in dem Verzeichnis, auf das von ..? Es muss irgendwo hinweisen.
Thorbjørn Ravn Andersen

2
..muss auf keinem Laufwerk physisch vorhanden sein. Es ist ohnehin Aufgabe des Betriebssystems, das aktuelle Arbeitsverzeichnis im Auge zu behalten. Daher sollte es relativ einfach sein, auch eine Liste der Inodes zu führen, die mit jedem Prozess-cwd verknüpft sind, und auf diese zu verweisen, wenn eine Verwendung von festgestellt wird ... Das würde natürlich bedeuten, dass Symlinks in diesem Sinne erstellt werden müssten, aber Sie müssen bereits darauf achten, Symlinks nicht zu beschädigen, und ich denke nicht, dass zusätzliche Regeln sie unbrauchbar machen würden.
Parthian Shot

Ich mag diese Erklärung . Kurz und leicht zu lesen und / oder zu überfliegen.
Trevor Boyd Smith

Antworten:


143

Dies ist nur eine schlechte Idee, da es keine Möglichkeit gibt, den Unterschied zwischen einem festen Link und einem ursprünglichen Namen zu erkennen.

Das Zulassen fester Verknüpfungen zu Verzeichnissen würde die gerichtete azyklische Graphstruktur des Dateisystems unterbrechen und möglicherweise Verzeichnisschleifen und baumelnde Verzeichnis-Teilbäume erzeugen, was dazu führen würde, fsckdass andere Dateibaumwanderer fehleranfällig werden.

Lassen Sie uns zunächst über Inodes sprechen, um dies zu verstehen. Die Daten im Dateisystem werden in Blöcken auf der Festplatte gespeichert, und diese Blöcke werden von einem Inode zusammengefasst. Sie können sich die Inode als DIE Datei vorstellen. Inodes fehlen jedoch Dateinamen. Hier kommen Links ins Spiel.

Ein Link ist nur ein Zeiger auf eine Inode. Ein Verzeichnis ist eine Inode, die Links enthält. Jeder Dateiname in einem Verzeichnis ist nur eine Verknüpfung zu einer Inode. Beim Öffnen einer Datei in Unix wird auch ein Link erstellt, es handelt sich jedoch um eine andere Art von Link (es handelt sich nicht um einen benannten Link).

Ein fester Link ist nur ein zusätzlicher Verzeichniseintrag, der auf diese Inode verweist. Bei Ihnen entspricht ls -ldie Zahl nach den Berechtigungen der Anzahl der benannten Links. Die meisten regulären Dateien haben einen Link. Wenn Sie eine neue feste Verknüpfung zu einer Datei erstellen, verweisen beide Dateinamen auf denselben Inode. Hinweis:

% ls -l test
ls: test: No such file or directory
% touch test
% ls -l test
-rw-r--r--  1 danny  staff  0 Oct 13 17:58 test
% ln test test2
% ls -l test*
-rw-r--r--  2 danny  staff  0 Oct 13 17:58 test
-rw-r--r--  2 danny  staff  0 Oct 13 17:58 test2
% touch test3
% ls -l test*
-rw-r--r--  2 danny  staff  0 Oct 13 17:58 test
-rw-r--r--  2 danny  staff  0 Oct 13 17:58 test2
-rw-r--r--  1 danny  staff  0 Oct 13 17:59 test3
            ^
            ^ this is the link count

Jetzt können Sie klar erkennen, dass es keine harte Verbindung gibt. Ein fester Link entspricht einem normalen Namen. Im obigen Beispiel testoder test2, welches ist die Originaldatei und welches ist die feste Verbindung? Am Ende kann man es nicht wirklich sagen (auch nicht anhand von Zeitstempeln), da beide Namen auf denselben Inhalt verweisen, denselben Inode:

% ls -li test*  
14445750 -rw-r--r--  2 danny  staff  0 Oct 13 17:58 test
14445750 -rw-r--r--  2 danny  staff  0 Oct 13 17:58 test2
14445892 -rw-r--r--  1 danny  staff  0 Oct 13 17:59 test3

Das -iFlag lszeigt Ihnen Inode-Nummern am Anfang der Zeile. Beachten Sie, wie testund test2haben die gleiche Inode-Nummer, aber test3eine andere.

Wenn Sie dies für Verzeichnisse tun könnten, könnten zwei verschiedene Verzeichnisse an verschiedenen Stellen im Dateisystem auf dasselbe verweisen. Tatsächlich könnte ein Unterverzeichnis auf seine Großeltern verweisen und eine Schleife erstellen.

Warum ist diese Schleife ein Problem? Denn wenn Sie überqueren, gibt es keine Möglichkeit zu erkennen, dass Sie sich in einer Schleife befinden (ohne die Inode-Nummern zu verfolgen, während Sie überqueren). Stellen Sie sich vor, Sie schreiben den duBefehl, der durch Unterverzeichnisse wiederholt werden muss, um Informationen zur Datenträgerverwendung zu erhalten. Wie würde es duwissen, wenn es eine Schleife traf? Es ist fehleranfällig und eine Menge Buchhaltung dumüssten, nur um diese einfache Aufgabe zu erledigen.

Symlinks sind eine ganz andere Bestie, da sie eine spezielle Art von "Datei" sind, der viele Dateisystem-APIs normalerweise automatisch folgen. Beachten Sie, dass ein Symlink auf ein nicht vorhandenes Ziel verweisen kann, da er auf einen Namen und nicht direkt auf einen Inode verweist. Dieses Konzept macht bei Hardlinks keinen Sinn, da das bloße Vorhandensein eines "Hardlinks" bedeutet, dass die Datei existiert.

Warum kann man dusich also leicht mit Symlinks und nicht mit harten Links befassen? Wir haben oben gesehen, dass harte Links nicht von normalen Verzeichniseinträgen zu unterscheiden sind. Symlinks sind jedoch speziell, erkennbar und überspringbar!  dustellt fest, dass der Symlink ein Symlink ist, und überspringt ihn vollständig!

% ls -l 
total 4
drwxr-xr-x  3 danny  staff  102 Oct 13 18:14 test1/
lrwxr-xr-x  1 danny  staff    5 Oct 13 18:13 test2@ -> test1
% du -ah
242M    ./test1/bigfile
242M    ./test1
4.0K    ./test2
242M    .

7
Allowing hard links to directories would break the directed acyclic graph structure of the filesystem. Können Sie bitte mehr über das Problem mit Zyklen unter Verwendung von Hardlinks erklären? Warum ist es in
Ordnung

33
Sie scheinen es auf Macs zugelassen zu haben, indem sie dem link () - Systemaufruf eine Zykluserkennung hinzugefügt haben und sich geweigert haben, einen Verzeichnis-Hardlink zu erstellen, wenn dadurch ein Zyklus erstellt würde. Scheint eine vernünftige Lösung zu sein.
Psusi

10
@psusi mkdir -pa / b; nocheckln ca; mv ca / ​​b; - die nocheckln gibt es eine theoretische ln, die nicht auf verzeichnis args prüft und nur auf link übergeht, und da kein zyklus gemacht wird, sind wir alle gut in der schaffung von 'c'. dann bewegen wir 'c' in 'a / b' und ein Zyklus wird aus a / b / c erstellt -> a / - das Einchecken von link () ist nicht gut genug
Danny Dulai

3
Fahrräder sind sehr schlecht. Windows hat dieses Problem mit "Junctions", bei denen es sich um Hardlink-Verzeichnisse handelt. Wenn Sie versehentlich Berechtigungen auf Ihr gesamtes Profil anwenden, werden eine Reihe von Verknüpfungen aufgedeckt, die einen unendlichen Zyklus erzeugen. Das Durchsuchen der Verzeichnisse wird solange wiederholt, bis die Pfadlängenbeschränkungen dies beenden.
Doug65536

4
@WhiteWinterWolf, nach diesem Link, fügten sie hinzu speziell Unterstützung für Zeitmaschine, aber nur root erlaubt ist , es zu tun: superuser.com/questions/360926/...
psusi

14

Mit Ausnahme der Mount - Punkte, jedes Verzeichnis hat einen und nur parent: ...

Eine Möglichkeit pwdbesteht darin, das Gerät zu überprüfen: inode auf '.' und '..'. Wenn sie identisch sind, haben Sie das Stammverzeichnis des Dateisystems erreicht. Suchen Sie andernfalls den Namen des aktuellen Verzeichnisses im übergeordneten Verzeichnis, verschieben Sie ihn auf einen Stapel, und vergleichen Sie '../.' mit '../ ..', dann '../../.' mit '../../ ..' usw. Sobald Sie die Wurzel erreicht haben, beginnen Sie, die Namen vom Stapel zu kopieren und auszudrucken. Dieser Algorithmus basiert auf der Tatsache, dass jedes Verzeichnis ein und nur ein übergeordnetes Verzeichnis hat.

Wenn feste Verknüpfungen zu Verzeichnissen zulässig sind, auf welches der mehreren übergeordneten Elemente sollte der Verweis lauten ..? Das ist ein zwingender Grund, warum Hardlinks zu Verzeichnissen nicht erlaubt sind.

Symlinks zu Verzeichnissen verursachen dieses Problem nicht. Wenn ein Programm dies wünscht, kann es lstat()für jeden Teil des Pfadnamens ein Häkchen setzen und feststellen, wenn ein Symlink gefunden wird. Der pwdAlgorithmus gibt den wahren absoluten Pfadnamen für ein Zielverzeichnis zurück. Die Tatsache, dass es irgendwo einen Text gibt (den Symlink), der auf das Zielverzeichnis verweist, ist so ziemlich irrelevant. Das Vorhandensein eines solchen Symlinks erzeugt keine Schleife im Diagramm.


3
Da bin ich mir nicht so sicher. Wenn wir uns ..eine Art virtuellen Hardlink zum übergeordneten Element vorstellen, gibt es keinen technischen Grund dafür, dass das Ziel des Links nur einen weiteren Link haben kann. pwdMüsste nur einen anderen Algorithmus verwenden, um den Pfad aufzulösen.
Benubird

13

Sie können bind mount verwenden, um fest verknüpfte Verzeichnisse zu simulieren

sudo mount --bind /some/existing_real_contents /else/dummy_but_existing_directory
sudo umount /else/dummy_but_existing_directory

7

Ich möchte noch einige Punkte zu dieser Frage hinzufügen. Harte Links für Verzeichnisse sind unter Linux erlaubt, jedoch auf eingeschränkte Weise.

Eine Möglichkeit, dies zu testen, besteht darin, den Inhalt eines Verzeichnisses aufzulisten und zwei spezielle Verzeichnisse zu finden "." und "..". Wie wir wissen "." verweist auf dasselbe Verzeichnis und ".." verweist auf das übergeordnete Verzeichnis.

Erstellen wir also einen Verzeichnisbaum, in dem "a" das übergeordnete Verzeichnis ist, dessen untergeordnetes Verzeichnis "b" ist.

 a
 `-- b

Notieren Sie sich den Inode des Verzeichnisses "a". Und wenn wir ein ls -lafrom-Verzeichnis "a" machen, können wir das sehen. " Verzeichnis verweist auch auf den gleichen Inode.

797358 drwxr-xr-x 3 mkannan mkannan 4096 Sep 17 19:13 a

Und hier können wir feststellen, dass das Verzeichnis "a" drei feste Links hat. Dies liegt daran, dass die Inode 797358 drei Hardlinks im Namen von "." in "a" Verzeichnis und Name als ".." in Verzeichnis "b" und eines mit dem Namen "a" itslef.

$ ls -ali a/
797358 drwxr-xr-x 3 mkannan mkannan 4096 Sep 17 19:13 .

$ ls -ali a/b/
797358 drwxr-xr-x 3 mkannan mkannan 4096 Sep 17 19:13 ..

Hier können wir verstehen, dass Hardlinks nur für Verzeichnisse vorhanden sind, die eine Verbindung zu ihren übergeordneten und untergeordneten Verzeichnissen herstellen. Und so hat ein Verzeichnis ohne ein Kind nur zwei Hardlinks, und so hat das Verzeichnis "b" nur zwei Hardlinks.

Ein Grund, warum das feste Verknüpfen von Verzeichnissen frei verhindert wurde, wäre, unendliche Referenzschleifen zu vermeiden, die Programme verwirren, die das Dateisystem durchlaufen.

Da das Dateisystem als Baum organisiert ist und der Baum keinen zyklischen Bezug haben kann, sollte dies vermieden werden.


1
Gutes Beispiel. Es hat meine Zweifel ausgeräumt. Daher werden diese Fälle auf besondere Weise behandelt, um Endlosschleifen zu vermeiden. richtig?
G Gill

1
Da wir nur eingeschränkte Möglichkeiten haben, Hardlinks für Verzeichnisse zuzulassen, zB ".." und "." Wir werden keine Endlosschleife erreichen und daher keine besonderen Möglichkeiten benötigen, um diese zu vermeiden, da sie nicht passieren werden :)
Kannan Mohan

6

Keiner der folgenden Gründe ist der wahre Grund dafür, harte Links zu Verzeichnissen zu verbieten. Jedes Problem ist ziemlich einfach zu lösen:

  • Zyklen in der Baumstruktur verursachen ein schwieriges Überqueren
  • mehrere eltern, also welche ist die "echte"?
  • Dateisystem Garbage Collection

Der eigentliche Grund (wie von @ Thorbjørn Ravn Andersen angedeutet) liegt darin, dass Sie ein Verzeichnis mit mehreren übergeordneten Elementen aus dem Verzeichnis löschen , auf das durch Folgendes verwiesen wird ..:

Worauf sollte ..jetzt hingewiesen werden?

Wenn das Verzeichnis aus dem übergeordneten Verzeichnis gelöscht wird, die Anzahl der Verknüpfungen jedoch immer noch größer 0ist, muss irgendwo noch etwas darauf verweisen. Sie können nicht ..auf nichts zeigen lassen; Viele Programme sind darauf angewiesen .., sodass das System das gesamte Dateisystem durchlaufen muss , bis es das erste findet, das auf das gelöschte Verzeichnis verweist, um es zu aktualisieren ... Entweder das, oder das Dateisystem müsste eine Liste aller Verzeichnisse führen, die auf ein fest verknüpftes Verzeichnis verweisen.

In jedem Fall wäre dies ein Mehraufwand für die Leistung und eine zusätzliche Komplikation für die Metadaten und / oder den Code des Dateisystems, sodass die Designer beschlossen, dies nicht zuzulassen.


3
Auch das lässt sich leicht lösen: Führen Sie eine Liste der Eltern eines Kinderverzeichnisses, die Sie aktualisieren, wenn Sie einen Link zum Kind hinzufügen oder entfernen. Wenn Sie das kanonische Elternteil (das Ziel des Kindes ..) löschen , aktualisieren Sie .., um auf eines der anderen Elternteile in der Liste zu verweisen.
Jathd

2
Genau. Keine Raketenwissenschaft zu lösen. Ein zusätzlicher Aufwand für die Leistung würde jedoch ein wenig zusätzlichen Speicherplatz in den Metadaten des Dateisystems beanspruchen und zusätzliche Komplikationen verursachen. Und so entschieden sich die Designer für den einfachen, schnellen Ansatz - lassen Sie keine Links zu festen Verzeichnissen zu.
Lqueryvg

1
Sym-Links zu dirs "verletzen festgelegte Semantiken und Verhaltensweisen" sind jedoch weiterhin zulässig. Einige Befehle benötigen daher Optionen, um zu steuern, ob Sym-Links befolgt werden (z. B. -L in find und cp). Wenn ein Programm auf '..' folgt, gibt es weitere Verwirrung, daher der Unterschied in der Ausgabe von pwd und / bin / pwd nach dem Überqueren eines Sym-Links. Es gibt keine "Unix-Antworten"; Entwerfen Sie einfach Entscheidungen. Diese dreht sich um das, was aus ".." wird, wie ich in meiner Antwort angegeben habe. Leider wird '..' nicht einmal in der Antwort erwähnt, für die alle anderen so verlegen stimmen.
Lqueryvg

Übrigens sage ich nicht, dass ich harte Links zu dirs befürworte. Überhaupt nicht. Ich möchte nicht, dass mein Tagesjob schwieriger wird als bisher.
Lqueryvg

Es ist nicht das, was POSIX sagt, aber IMO '..' hätte niemals ein Dateisystem-Konzept sein dürfen, sondern sollte syntaktisch auf den Pfaden aufgelöst werden, a/..was immer bedeuten würde .. So funktionieren URLs übrigens. Es ist der Browser, der ".." auflöst, bevor er überhaupt auf den Server gelangt. Und es funktioniert großartig.
ybungalobill

3

Die Erstellung von Hardlinks in Verzeichnissen ist nicht umkehrbar. Angenommen, wir haben:

/dir1
├──this.txt
├──directory
│  └──subfiles
└──etc

Ich verbinde es mit /dir2.

/dir2Enthält also jetzt auch alle diese Dateien und Verzeichnisse

Was ist, wenn ich es mir anders überlege? Ich kann nicht nur rmdir /dir2(weil es nicht leer ist)

Und wenn ich rekursiv lösche /dir2... wird es auch von gelöscht /dir1!

IMHO ist es ein weitgehend ausreichender Grund, dies zu vermeiden!

Bearbeiten:

In den Kommentaren wird empfohlen, das Verzeichnis zu entfernen, indem Sie dies tun rm. Aber rmauf einem nicht leeren Verzeichnis schlägt fehl, und dieses Verhalten muss bestehen bleiben, egal ob das Verzeichnis fest verbunden ist oder nicht. Man kann es also nicht einfach rmtrennen. Es würde ein neues Argument erfordern rm, um nur zu sagen "Wenn der Verzeichnis-Inode einen Referenzzähler> 1 hat, dann wird nur die Verknüpfung des Verzeichnisses aufgehoben".

Das wiederum verstößt gegen ein anderes Prinzip, das am wenigsten überrascht: Das Entfernen eines soeben erstellten Verzeichnis-Hardlinks ist nicht dasselbe wie das Entfernen eines normalen Datei-Hardlinks ...

Ich werde meinen Satz umformulieren: Ohne weitere Entwicklung wäre die Erstellung von Hardlinks nicht umkehrbar (da kein aktueller Befehl die Entfernung bewältigen könnte, ohne mit dem aktuellen Verhalten inkohärent zu sein).

Wenn wir mehr Entwicklung erlauben, um den Fall, die Anzahl der Fallstricke und das Risiko von Datenverlusten zu bewältigen, wenn Sie sich nicht genug darüber im Klaren sind, wie das System funktioniert, ist eine solche Entwicklung meiner Meinung nach ein ausreichender Grund, das Hardlinking für Verzeichnisse einzuschränken.


Das sollte kein Problem sein. Wenn wir in Ihrem Fall einen Hardlink zu dir2 erstellen, müssen wir einen Hardlink zu allen Inhalten in dir1 erstellen. Wenn wir dir2 also umbenennen oder löschen, wird nur ein zusätzlicher Link zu der Inode gelöscht. Und das sollte dir1 und seinen Inhalt nicht beeinflussen, da es mindestens einen Link (dir1) zur Inode gibt.
Kannan Mohan

3
Ihr Argument ist falsch. Sie würden nur die Verknüpfung aufheben, nicht rm -rf. Und wenn die Anzahl der Links 0 erreicht, weiß das System, dass auch alle Inhalte gelöscht werden können.
LtWorf

Das ist mehr oder weniger alles rm, was darunter liegt (Unlink). Siehe: unix.stackexchange.com/questions/151951/… Dies ist wirklich kein Problem, genauso wenig wie bei fest verknüpften Dateien. Durch das Aufheben der Verknüpfung wird lediglich die angegebene Referenz entfernt und die Anzahl der Verknüpfungen verringert. Die Tatsache, dass rmdirnicht leere Verzeichnisse nicht gelöscht werden, ist irrelevant - das würde es auch nicht tun dir1 . Hardlinks sind keine Kopien von Daten, sondern die gleiche Datei. Wenn Sie also die Datei dir2 löschen, wird die Verzeichnisliste für dir1 gelöscht. Sie müssten immer die Verbindung trennen.
BryKKan

Sie können die Verknüpfung nicht einfach wie eine normale Datei aufheben, da die Verknüpfung rmin einem Verzeichnis nicht aufgehoben wird, wenn es nicht leer ist. Siehe Bearbeiten.
Pierre-Olivier Vares

1

Das ist eine gute Erklärung. Zu "Auf welches der mehreren Elternteile soll .. hingewiesen werden?" Eine Lösung wäre, wenn ein Prozess seinen vollständigen Pfad beibehalten würde, entweder als Inodes oder als String. Inodes wären robuster, da Namen geändert werden können. Zumindest in früheren Zeiten gab es für jede geöffnete Datei einen In-Core-Inode, der beim Öffnen einer Datei inkrementiert und beim Schließen dekrementiert wurde. Wenn es Null erreichte und der Speicherplatz, auf den es zeigte, freigegeben wurde. Wenn die Datei von niemandem mehr geöffnet wurde, wurde sie (die In-Core-Kopie) aufgegeben. Auf diese Weise wird der Pfad als gültig beibehalten, wenn ein anderer Prozess ein Verzeichnis in ein anderes Verzeichnis verschoben hat, während sich das Unterverzeichnis im Pfad eines anderen Prozesses befand. Ähnlich wie Sie eine geöffnete Datei löschen können, diese jedoch einfach aus dem Verzeichnis entfernt wird,

Hardlinking-Verzeichnisse waren in Bell Labs UNIX (mindestens V6 und V7) bisher frei zulässig. Sie wissen nichts über Berkeley oder höher. Keine Flagge erforderlich. Könnten Sie Schleifen machen? Ja, mach das nicht. Es ist sehr klar, was Sie tun, wenn Sie eine Schleife machen. Nether sollten Sie Knotenknüpfen üben, während Sie darauf warten, dass Sie an der Reihe sind, aus einem Flugzeug zu springen, wenn Sie das andere Ende bequem an einem Haken am Schott hängen.

Was ich heute damit machen wollte, war, lhome fest mit home zu verknüpfen, damit ich / home / administ zur Verfügung haben konnte, unabhängig davon, ob / home mit einem automout über home verdeckt war oder nicht, wobei dieser automount einen Symlink namens administ zu / lhome hatte / administ. Auf diese Weise kann ich ein Administratorkonto einrichten, das unabhängig vom Status meines primären Home-Dateisystems funktioniert. Das IST ein Experiment für Linux, aber ich denke , zu einer Zeit für den UCB basierten SunOS gelernt , dass Autoaktivierungen auf der ASCII - String - Ebene getan werden. Es ist schwer zu erkennen, wie sie sonst als Schicht über einem beliebigen FS ausgeführt werden könnten.

Ich habe das woanders gelesen. und .. sind auch keine Dateien mehr im Verzeichnis. Ich bin sicher, dass es dafür gute Gründe gibt und dass vieles, was uns Spaß macht (wie zum Beispiel die Möglichkeit, NTFS zu mounten), aufgrund solcher Dinge möglich ist, aber ein Teil der Eleganz von UNIX lag in der Implementierung. Es sind die Vorteile wie Allgemeingültigkeit und Formbarkeit, die diese Eleganz ermöglichten, dass es so robust ist und vier Jahrzehnte lang Bestand hat. Wenn wir die eleganten Implementierungen verlieren, wird es irgendwann wie Windows (ich hoffe, ich irre mich!). Jemand würde dann ein neues Betriebssystem erstellen, das auf eleganten Prinzipien basiert. Etwas zum Nachdenken. Vielleicht irre ich mich, ich bin (offensichtlich) nicht mit der aktuellen Implementierung vertraut. Es ist erstaunlich, wie gut 30 Jahre altes Verständnis auf Linux zutrifft ... die meiste Zeit!


Ich denke, wenn ich falsch sein kann, dass .und ..sind nicht in harten Links Datei-System für moderne Dateisysteme. Der Dateisystemtreiber fälscht sie jedoch. Es ist dieses Dateisystem, das das feste Verknüpfen von Verzeichnissen stoppt. Für alte Dateisysteme war es möglich (aber gefährlich). Zu tun , was Sie versuchen, buchen mount --bind, auch mount --make…und vielleicht Container.
Strg-Alt-Delor

0

Nach meinem Dafürhalten ist der Hauptgrund, dass es nützlich ist, Verzeichnisnamen ändern zu können, ohne laufende Programme zu beschädigen, die ihr Arbeitsverzeichnis verwenden, um auf andere Dateien zu verweisen. Angenommen, Sie haben Wine zum Ausführen verwendet ~/.newwineprefix/drive_c/Program Files/Firefox/Firefox.exeund möchten ~/.winestattdessen das gesamte Präfix auf verschieben . Wenn Firefox aus irgendeinem Grund drive_c/windowsunter Bezugnahme auf zugegriffen hat , behält das ../../windowsUmbenennen ~/.newwineprefixvon ..Pausenimplementierungen das übergeordnete Verzeichnis als Textzeichenfolge anstelle einer Inode bei.

Das Speichern des Inodes eines einzelnen übergeordneten Verzeichnisses muss einfacher sein als der Versuch, jeden Pfad sowohl als Textzeichenfolge als auch als Reihe von Inodes zu verfolgen.

Ein weiterer Grund ist, dass fehlerhafte Anwendungen möglicherweise Schleifen erstellen können. Verhaltensanwendungen sollten in der Lage sein, zu überprüfen, ob der Inode des Verzeichnisses, in das verschoben wird, mit dem Inode eines der verschachtelten Verzeichnisse identisch ist, so wie Sie ein Verzeichnis nicht in sich selbst verschieben können, dies wird jedoch möglicherweise nicht erzwungen auf Dateisystemebene.

Ein weiterer Grund könnte sein, dass Sie, wenn Sie Verzeichnisse fest verknüpfen könnten, verhindern möchten, dass ein Verzeichnis fest verknüpft wird, das Sie nicht ändern können. findAus Sicherheitsgründen werden Dateien, die von anderen Benutzern erstellt wurden, aus temporären Verzeichnissen gelöscht. Dies kann zu Problemen führen, wenn ein Benutzer ein reales Verzeichnis für einen Symlink wechselt, während finder einen anderen Befehl aufruft. Die Möglichkeit, wichtige Verzeichnisse fest zu verknüpfen, würde einen Administrator zwingen, zusätzliche Tests hinzuzufügen find, um deren Beeinträchtigung zu vermeiden. (Ok, Sie können dies für Dateien bereits nicht tun, daher ist dieser Grund ungültig.)

Ein weiterer Grund ist, dass das Speichern des Inodes des übergeordneten Verzeichnisses im Falle einer Beschädigung oder Beschädigung des Dateisystems zusätzliche Redundanz bieten kann. Wenn Sie ..alle übergeordneten Verzeichnisse auflisten möchten, die einen Hardlink zu diesem Verzeichnis haben, so dass ein anderes, willkürliches übergeordnetes Verzeichnis leicht gefunden werden kann, wenn das aktuelle Verzeichnis einen Delink aufweist Dateisystem speichert und verwendet Inodes. Wenn Programme Pfade als eine (für jeden Hardlink eindeutige) Reihe von Verzeichnis-Inodes behandeln, wird dies vermieden, aber im Falle einer Beschädigung des Dateisystems wird die Redundanz nicht erreicht.

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.