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, fsck
dass 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 -l
die 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 test
oder 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 -i
Flag ls
zeigt Ihnen Inode-Nummern am Anfang der Zeile. Beachten Sie, wie test
und test2
haben die gleiche Inode-Nummer, aber test3
eine 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 du
Befehl, der durch Unterverzeichnisse wiederholt werden muss, um Informationen zur Datenträgerverwendung zu erhalten. Wie würde es du
wissen, wenn es eine Schleife traf? Es ist fehleranfällig und eine Menge Buchhaltung du
mü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 du
sich 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!
du
stellt 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 .
..
es gehen? Vor allem nach dem Entfernen des festen Links zu diesem Verzeichnis, in dem Verzeichnis, auf das von..
? Es muss irgendwo hinweisen.