Harte Links ausschließen

22

Auf der Manualpage des tarBefehls wird eine Option zum Folgen von Hardlinks aufgelistet.

-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

Woher weiß man tar, dass eine Datei ein fester Link ist? Wie folgt es?

Was ist, wenn ich diese Option nicht wähle? Wie ist es nicht schwer Dereferenzierung?

musa
quelle

Antworten:

24

Wenn Sie festlegen tar, dass eine Datei mit festen Verknüpfungen archiviert werden soll und mehr als eine Verknüpfung zu den zu archivierenden Dateien gehört, wird die Datei standardmäßig nur einmal archiviert und die zweite (und alle weiteren Namen) als feste Verknüpfungen aufgezeichnet. Dies bedeutet, dass beim Extrahieren dieses Archivs die festen Links wiederhergestellt werden.

Wenn Sie die Verwendung --hard-dereferenceOption, dann tarwird nicht erhalten harte Links. Stattdessen werden sie als unabhängige Dateien behandelt, die zufällig dieselben Inhalte und Metadaten aufweisen. Wenn Sie das Archiv extrahieren, sind die Dateien unabhängig.

Hinweis: Feste Links werden erkannt, indem zunächst die Anzahl der Links in der Datei überprüft wird. Es zeichnet die Gerätenummer und den Inode jeder Datei mit mehr als einem Link auf und erkennt damit, wann dieselbe Datei erneut archiviert wird. (Wenn Sie verwenden --hard-dereference, wird dies nicht ausgeführt.)

cjm
quelle
7

Sie können eine Datei mit fester Verknüpfung von einer nicht fest verknüpften Datei mit der "Verknüpfungsanzahl" unterscheiden. Ich sehe zwei Möglichkeiten, dies von der Kommandozeile aus 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

Diese einsame "2" vor "Bediger" ist die Anzahl der Links. Beachten Sie, dass beide Dateinamen die gleiche Inode-Nummer 932815 haben.

Ich bin sicher, dass diese beiden Befehle die Linkanzahl aus dem Feld st_nlink von struct stat erhalten, das durch einen stat()Systemaufruf ausgefüllt wird .

Soweit ich das beurteilen kann, bedeutet " Ausführen tarmit" --hard-dereference, dass Sie anstelle einer einzelnen Datei mit zwei unterschiedlichen Dateinamen (wie im obigen Beispiel) zwei Dateien mit jeweils einem einzelnen Dateinamen erhalten. tarÜberprüft wahrscheinlich die Anzahl der Verknüpfungen für jede Datei und erstellt beim Extrahieren standardmäßig eine feste Verknüpfung mit dem zweiten Dateinamen für die fest verknüpften Dateidaten. Beim --hard-dereferenceAufruf von bei der Archiverstellung wird beim Ausführen des Extraktionsaufrufs von anscheinend eine vollständig neue Datei für den zweiten Dateinamen erstellt tar.

Bruce Ediger
quelle
Jetzt verstehe ich, dass "Follow Hard Links" eine falsche Formulierung ist. Vielen Dank. Was aber, wenn eine der beiden identischen Dateien nicht archiviert wird? Die Anzahl der Links ist in solchen Fällen irreführend.
Musa
2
Es handelt sich nicht um "zwei identische Dateien", sondern um eine Datei mit zwei Namen. Es spielt keine Rolle, welche Datei tar nicht archiviert, da sie identisch sind. Standardmäßig behält tar wahrscheinlich nur eine Art "Zeiger" vom 2. Dateinamen zurück zum ersten, genau wie das Dateisystem.
Bruce Ediger