Dereferencje twardych linków

22

Na stronie instrukcji tarpolecenia znajduje się opcja podążania za dowiązaniami stałymi.

-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

Skąd tarwiadomo, że plik jest dowiązaniem twardym? Jak to wynika ?

Co jeśli nie wybiorę tej opcji? Jak to nie jest trudne?

musa
źródło

Odpowiedzi:

24

Domyślnie, jeśli powiesz, taraby zarchiwizować plik z twardymi linkami, a więcej niż jeden taki link znajduje się wśród plików, które mają być zarchiwizowane, archiwizuje plik tylko raz, a drugą (i wszelkie dodatkowe nazwy) zapisuje jako twarde linki. Oznacza to, że po rozpakowaniu tego archiwum twarde linki zostaną przywrócone.

Jeśli korzystasz z --hard-dereferenceopcji, a następnie tarjest nie zachowanie dowiązania twarde. Zamiast tego traktuje je jako niezależne pliki, które akurat mają taką samą zawartość i metadane. Po rozpakowaniu archiwum pliki będą niezależne.

Uwaga: Rozpoznaje twarde linki, najpierw sprawdzając liczbę linków pliku. Rejestruje numer urządzenia i i-węzeł każdego pliku za pomocą więcej niż jednego łącza i używa go do wykrywania, kiedy ten sam plik jest ponownie archiwizowany. (Gdy używasz --hard-dereference, nie robi tego.)

cjm
źródło
7

Plik z twardymi linkami można odróżnić od niepowiązanego pliku za pomocą „liczby linków”. Widzę dwa sposoby uzyskania tego z wiersza poleceń:

% 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: -

Lub

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

Ta samotna „2” przed „bediger” to liczba linków. Zauważ, że oba nazwy plików mają ten sam numer i-węzła, 932815.

Jestem pewien, że obie te komendy pobierają liczbę linków z pola st_nlink struktury struct stat, które jest wypełniane przez stat()wywołanie systemowe.

Tak blisko, jak mogę powiedzieć, bieganie tarze --hard-dereferenceśrodków, które zamiast się pojedynczy plik z dwoma różnymi nazwami (jak w powyższym przykładzie), można uzyskać dwa pliki, każdy z pojedynczym pliku. tarprawdopodobnie sprawdza liczbę linków w każdym pliku, a domyślnie podczas wypakowywania tworzy twardy link na drugiej nazwie pliku dla danych pliku na stałe. Gdy wywoływany jest przy --hard-dereferencetworzeniu archiwum, wydaje się, że tworzy zupełnie nowy plik dla drugiej nazwy pliku, gdy wywołanie ekstrakcyjne taruruchomi się.

Bruce Ediger
źródło
Teraz rozumiem, że „podążaj za twardymi linkami” to złe sformułowanie. Dziękuję Ci. Ale co, jeśli jeden z dwóch identycznych plików nie zostanie zarchiwizowany? W takich przypadkach liczba linków jest myląca.
musa
2
To nie są „dwa identyczne pliki”, to jeden plik o dwóch nazwach. Nie ma znaczenia, który plik tar nie archiwizuje, ponieważ są one identyczne. Domyślnie tar prawdopodobnie zachowuje jakiś „wskaźnik” od drugiej nazwy pliku z powrotem do pierwszej, tak jak robi to system plików.
Bruce Ediger