![Dereferenzierung von Hardlinks](https://rvso.com/image/23933/Dereferenzierung%20von%20Hardlinks.png)
Auf der Manualpage des tar
Befehls ist eine Option zum Folgen von Hardlinks aufgeführt.
-h, --dereference
follow symlinks; archive and dump the files they point to
--hard-dereference
follow hard links; archive and dump the files they refer to
Wie tar
erkennt man, dass eine Datei ein Hardlink ist? Wie erkennt manfolgenEs?
Was passiert, wenn ich diese Option nicht wähle? Wie funktioniert esnichtHarte Dereferenzierung?
Antwort1
Wenn Sie eine Datei mit Hardlinks archivieren möchten und mehrere solcher Links zu den zu archivierenden Dateien gehören, wird die Datei standardmäßig tar
nur einmal archiviert und die zweite (und alle weiteren Namen) als Hardlinks aufgezeichnet. Das bedeutet, dass die Hardlinks wiederhergestellt werden, wenn Sie das Archiv extrahieren.
Wenn Sie die --hard-dereference
Option verwenden, tar
dannnichtHardlinks werden beibehalten. Stattdessen werden sie als unabhängige Dateien behandelt, die zufällig denselben Inhalt und dieselben Metadaten haben. Wenn Sie das Archiv extrahieren, sind die Dateien unabhängig.
Hinweis: Hardlinks werden erkannt, indem zunächst die Anzahl der Links der Datei überprüft wird. Gerätenummer und Inode jeder Datei mit mehr als einem Link werden aufgezeichnet, um zu erkennen, wann dieselbe Datei erneut archiviert wird. (Wenn Sie verwenden --hard-dereference
, geschieht dies nicht.)
Antwort2
Sie können eine Datei mit Hardlink(s) von einer Datei ohne Hardlink anhand der „Linkanzahl“ unterscheiden. Ich sehe zwei Möglichkeiten, dies über die Befehlszeile zu erreichen:
% stat original
File: ‘original’
Size: 0 Blocks: 0 IO Block: 4096 regular empty file
Device: 804h/2052d Inode: 932815 Links: 2
Access: (0644/-rw-r--r--) Uid: ( 500/ bediger) Gid: ( 1000/ bediger)
Access: 2012-07-13 22:13:52.317101530 -0600
Modify: 2012-07-13 22:13:52.317101530 -0600
Change: 2012-07-13 22:14:08.050894536 -0600
Birth: -
Oder
1010 % ls -li
total 0
932815 -rw-r--r-- 2 bediger bediger 0 Jul 13 22:13 original
932815 -rw-r--r-- 2 bediger bediger 0 Jul 13 22:13 secondary
Die einsame „2“ vor „bediger“ ist die Linkanzahl. Beachten Sie, dass beide Dateinamen dieselbe Inode-Nummer haben, nämlich 932815.
Ich bin sicher, dass beide Befehle die Anzahl der Links aus dem Feld „st_nlink“ der Struktur „stat“ erhalten, das durch einen stat()
Systemaufruf ausgefüllt wird.
Soweit ich es beurteilen kann, bedeutet die Ausführung tar
mit --hard-dereference
, dass Sie statt einer einzelnen Datei mit zwei unterschiedlichen Dateinamen (wie im obigen Beispiel) zwei Dateien mit jeweils einem einzigen Dateinamen erhalten. tar
prüft wahrscheinlich die Anzahl der Links für jede Datei und erstellt standardmäßig beim Extrahieren einen Hardlink für den zweiten Dateinamen, den es für die hart verknüpften Dateidaten hat. Wenn es bei --hard-dereference
der Archiverstellung mit aufgerufen wird, scheint es eine völlig neue Datei für den zweiten Dateinamen zu erstellen, wenn der Extraktionsaufruf von tar
ausgeführt wird.