Ich habe in Lehrbüchern gelesen, dass Unix/Linux keine harten Links zu Verzeichnissen zulässt, aber weiche Links. Liegt es daran, dass, wenn wir Zyklen haben und wenn wir harte Links erstellen, und wir nach einiger Zeit die Originaldatei löschen, dies auf einen Müllwert verweist?
Wenn Zyklen der einzige Grund dafür waren, harte Links nicht zuzulassen, warum sind dann weiche Links zu Verzeichnissen erlaubt?
Akzeptierte Antwort:
Dies ist nur eine schlechte Idee, da es keine Möglichkeit gibt, den Unterschied zwischen einem festen Link und einem Originalnamen zu erkennen.
Feste Links zu Verzeichnissen zuzulassen würde die gerichtete azyklische Graphstruktur des Dateisystems unterbrechen, möglicherweise Verzeichnisschleifen und baumelnde Verzeichnisunterbäume erzeugen, was zu fsck
führen würde und alle anderen fehleranfälligen Dateibaum-Walker.
Um dies zu verstehen, lassen Sie uns zunächst über Inodes sprechen. Die Daten im Dateisystem werden in Blöcken auf der Festplatte gespeichert, und diese Blöcke werden von einem Inode zusammengeführt. Sie können sich den Inode als DIE Datei vorstellen.
Inodes haben jedoch keine Dateinamen. Hier kommen Links ins Spiel.
Ein Link ist nur ein Zeiger auf einen Inode. Ein Verzeichnis ist ein Inode, der Links enthält. Jeder Dateiname in einem Verzeichnis ist nur ein Link zu einem Inode. Das Öffnen einer Datei in Unix erstellt ebenfalls einen Link, aber es ist eine andere Art von Link (es ist kein benannter Link).
Ein fester Link ist nur ein zusätzlicher Verzeichniseintrag, der auf diesen Inode zeigt. Wenn Sie ls -l
, die Zahl nach den Berechtigungen ist die Anzahl der benannten Links. Die meisten regulären Dateien haben einen Link. Durch das Erstellen eines neuen Hardlinks zu einer Datei 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 deutlich sehen, dass es so etwas wie einen festen Link nicht gibt. Ein fester Link ist dasselbe wie ein normaler Name. Im obigen Beispiel test
oder test2
, was ist die Originaldatei und was ist der Hardlink? Am Ende können Sie 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 -i
Flag zu ls
zeigt Ihnen die Inode-Nummern am Anfang der Zeile. Beachten Sie, wie test
und test2
dieselbe Inode-Nummer haben,
aber test3
hat eine andere.
Wenn Sie dies nun für Verzeichnisse tun dürften, könnten zwei verschiedene Verzeichnisse an verschiedenen Stellen im Dateisystem auf dasselbe verweisen. Tatsächlich könnte ein Unterverzeichnis auf sein Großelternelement zurückverweisen und eine Schleife erzeugen.
Warum ist diese Schleife ein Problem? Denn wenn Sie traversieren, gibt es keine Möglichkeit zu erkennen, dass Sie sich in einer Schleife befinden (ohne die Inode-Nummern zu verfolgen, während Sie traversieren). Stellen Sie sich vor, Sie schreiben den du
Befehl, der die Unterverzeichnisse rekursiv durchlaufen muss, um die Festplattennutzung herauszufinden. Wie würde du
wissen, wann es eine Schleife traf? Es ist fehleranfällig und viel Buchhaltung, die du
tun müssten, nur um diese einfache Aufgabe zu erledigen.
Symlinks sind ein ganz anderes Biest, da sie eine spezielle Art von „Datei“ sind, der viele Dateisystem-APIs automatisch folgen. Beachten Sie, dass ein Symlink auf ein nicht vorhandenes Ziel verweisen kann, da er namentlich und nicht direkt auf einen Inode verweist. Dieses Konzept ergibt bei Hardlinks keinen Sinn, da die bloße Existenz eines „Hardlinks“ bedeutet, dass die Datei existiert.
Warum also kann du
Umgang mit Symlinks einfach und nicht mit harten Links? Wir konnten oben sehen, dass Hardlinks nicht von normalen Verzeichniseinträgen zu unterscheiden sind. Symlinks sind jedoch speziell, erkennbar und überspringbar! du
bemerkt, dass der Symlink ein Symlink ist, und überspringt ihn komplett!
% 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 [email protected] -> test1
% du -ah
242M ./test1/bigfile
242M ./test1
4.0K ./test2
242M .