Warum nehmen harte Links anscheinend den gleichen Platz ein wie die Originale?

14

Dank einiger guter Fragen und Antworten hier und auf dieser Seite verstehe ich jetzt Links. Ich sehe, dass harte Links denselben Inode mit einem anderen Namen referenzieren und Kopien unterschiedliche "Knoten mit unterschiedlichen Namen sind. Außerdem haben weiche Links den ursprünglichen Dateinamen und Pfad als Inode. Wenn die Datei also verschoben wird, bricht der Link.

Also habe ich getestet, was ich mit einer Datei gelernt habe ("saluton_mondo.cpp" unten), einen Hard- und einen Softlink erstellt und eine Kopie erstellt.

jmcf125@VMUbuntu:~$ ls -lh soft hard copy s*.cpp
-rw-rw-r-- 1 jmcf125 jmcf125 205 Aŭg 27 16:10 copy
-rw-rw-r-- 2 jmcf125 jmcf125 205 Aŭg 25 13:34 hard
-rw-rw-r-- 2 jmcf125 jmcf125 205 Aŭg 25 13:34 saluton_mondo.cpp
lrwxrwxrwx 1 jmcf125 jmcf125  17 Aŭg 27 16:09 soft -> saluton_mondo.cpp

Ich fand es unangenehm, dass der harte Link jedoch die gleiche Größe wie das Original und logischerweise die Kopie hat. Wenn die feste Verbindung und das Original den gleichen Inode haben, der die Daten enthält und sich nur durch den Dateinamen unterscheidet, sollte die feste Verbindung nicht nur den Platz ihres Namens anstelle von 205 Bytes einnehmen? Oder ist das die Größe der Originaldatei, die ls -lhzurückgegeben wird? Aber wie kann ich dann wissen, welchen Platz der Dateiname einnimmt? Hier steht , dass harte Links keine Größe haben. Wird der Dateiname neben dem ursprünglichen Dateinamen beibehalten? Wo ist der Dateiname von Hardlinks gespeichert?

JMCF125
quelle

Antworten:

16

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).

Stéphane Chazelas
quelle
Ahh ... Jetzt verstehe ich. Eine Datei mit dem Namen "hi" und die exakte Kopie mit dem Namen "ajhĝjdmjefsjmksgskgjkmŝŭna" beanspruchen genau dieselbe Menge Speicherplatz. weil ihre Namen nicht für den lstatSystemaufruf zählen, der ihre Größe erhält.
JMCF125
@ JMCF125, ja, die von ihren Namen genommene Größe ist der Eintrag in den entsprechenden Verzeichnissen. Sie wird in der Dateigröße der Verzeichnisse berücksichtigt.
Stéphane Chazelas
Vielen Dank. Können Sie das in Ihre Antwort aufnehmen? Warten Sie, ich werde zuerst meine Frage klären.
JMCF125
4

Die feste Verbindung ist im Wesentlichen die Originaldatei. Die angegebene Größe entspricht also der Größe der Datei, mit der ein Link erstellt wird. Es ist weich Links, die nur den Platz ihrer Namen einnehmen (irgendwie).

Was das Dateisystem angeht, so sind der Hardlink und das Original dasselbe. Sie verweisen auf denselben Inode, sodass dieselbe Größe gemeldet wird.

terdon
quelle
Aber der Name der festen Verbindung muss Leerzeichen enthalten, richtig?
JMCF125
Siehe @ stephans Antwort unten, er erklärt es besser.
Terdon
2
@ JMCF125 Ja, aber dieser Bereich befindet sich im Verzeichnis. Wenn Sie genügend Dateien erstellen, werden Sie feststellen, dass die Verzeichnisgrößen zunehmen. Die Größe einer Datei enthält keine Metadaten wie den Namen.
Gilles 'SO - hör auf böse zu sein'
@Gilles, danke, aber @Stephane hat seine Antwort bereits mit diesen Informationen aktualisiert. Auch, jetzt überlege ich es mir besser, der Name /muss in sich gespeichert werden, als ob du cd ..in /bleibst /.
JMCF125