Eine Datei ist ein Inode mit Metadaten, unter denen sich eine Liste von Zeigern befindet, wo sich die Daten befinden.
Um auf eine Datei zugreifen zu können, müssen Sie sie mit einem Verzeichnis verknüpfen (Verzeichnisse als Telefonverzeichnisse, nicht als Ordner), dh einem oder mehreren Verzeichnissen einen oder mehrere Einträge hinzufügen, um einen Namen zuzuordnen dieser Datei zuzuweisen.
Alle diese Links, diese Dateinamen verweisen auf dieselbe Datei. Es gibt keine, die das Original ist und die anderen, die Links sind. Sie sind alle Zugriffspunkte auf dieselbe Datei (denselben Inode) im Verzeichnisbaum. Wenn Sie die Größe der Datei erhalten (lstat
abrufen Systemaufruf), rufen Sie Informationen (die oben genannten Metadaten) ab, die im Inode gespeichert sind. Dabei spielt es keine Rolle, unter welchem Dateinamen und mit welchem Link Sie auf diese Datei verweisen .
Im Gegensatz dazu sind Symlinks eine andere Datei (eine andere Inode), deren Inhalt ein Pfad zur Zieldatei ist. Wie jede andere Datei müssen diese Symlinks mit einem Verzeichnis verknüpft sein (müssen einen Namen haben), damit Sie darauf zugreifen können. Sie können auch mehrere Links zu Symlinks haben, oder mit anderen Worten, Symlinks können mehrere Namen erhalten (in einem oder mehreren Verzeichnissen).
$ touch a
$ ln a b
$ ln -s a c
$ ln c d
$ ls -li [a-d]
10486707 -rw-r--r-- 2 stephane stephane 0 Aug 27 17:05 a
10486707 -rw-r--r-- 2 stephane stephane 0 Aug 27 17:05 b
10502404 lrwxrwxrwx 2 stephane stephane 1 Aug 27 17:05 c -> a
10502404 lrwxrwxrwx 2 stephane stephane 1 Aug 27 17:05 d -> a
Oberhalb der Dateinummer 10486707 befindet sich eine reguläre Datei. Zwei Einträge im aktuellen Verzeichnis (einer mit Name a
, einer mit Name b
) verlinken darauf. Weil die Verbindung zählt 2 ist, wissen wir, dass sich im aktuellen Verzeichnis oder in einem anderen Verzeichnis kein anderer Name dieser Datei befindet. Die Dateinummer 10502404 ist eine weitere Datei, die dieses Mal vom Typ symlink ist und zweimal mit dem aktuellen Verzeichnis verknüpft ist. Sein Inhalt (Ziel) ist der relative Pfad "a".
Beachten Sie, dass 10502404, wenn es mit einem anderen als dem aktuellen Verzeichnis verknüpft ist, in der Regel auf eine andere Datei verweist, je nachdem, wie darauf zugegriffen wurde.
$ mkdir 1 2
$ echo foo > 1/a
$ echo bar > 2/a
$ ln -s a 1/b
$ ln 1/b 2/b
$ ls -lia 1 2
1:
total 92
10608644 drwxr-xr-x 2 stephane stephane 4096 Aug 27 17:26 ./
10485761 drwxrwxr-x 443 stephane stephane 81920 Aug 27 17:26 ../
10504186 -rw-r--r-- 1 stephane stephane 4 Aug 27 17:24 a
10539259 lrwxrwxrwx 2 stephane stephane 1 Aug 27 17:26 b -> a
2:
total 92
10608674 drwxr-xr-x 2 stephane stephane 4096 Aug 27 17:26 ./
10485761 drwxrwxr-x 443 stephane stephane 81920 Aug 27 17:26 ../
10539044 -rw-r--r-- 1 stephane stephane 4 Aug 27 17:24 a
10539259 lrwxrwxrwx 2 stephane stephane 1 Aug 27 17:26 b -> a
$ cat 1/b
foo
$ cat 2/b
bar
Dateien sind nur in den Verzeichnissen mit Namen verknüpft, die sie verknüpfen. Der von ihren Namen belegte Speicherplatz entspricht den Einträgen in diesen Verzeichnissen. Dies ist in der Dateigröße / Festplattennutzung der Verzeichnisse berücksichtigt.
Sie werden feststellen, dass der Systemaufruf zum Entfernen einer Datei lautet unlink
. Das heißt, Sie entfernen keine Dateien, sondern heben die Verknüpfung zu den Verzeichnissen auf, auf die verwiesen wird. Sobald die Verknüpfung zum letzten Verzeichnis, in dem ein Eintrag zu einer bestimmten Datei vorhanden war, aufgehoben wurde, wird diese Datei zerstört (solange kein Prozess über sie verfügt) geöffnet).
lstat
Systemaufruf zählen, der ihre Größe erhält.