Dlaczego twarde linki nie są dozwolone dla katalogów?

129

Używam Ubuntu 12.04. Kiedy próbuję utworzyć twardy link do dowolnego katalogu, to się nie udaje. Mogę tworzyć twarde linki do plików w granicach systemu plików. Znam powód, dla którego nie możemy tworzyć dowiązań twardych dla plików poza systemem plików.

Próbowałem tych poleceń:

$ ln /Some/Direcoty /home/nischay/Hard-Directory
hard link not allowed for directory
$ sudo ln /Some/Direcoty /home/nischay/Hard-Directory
[sudo] password for nischay: 
hard link not allowed for directory

Chcę tylko poznać przyczynę tego. Czy to samo dotyczy wszystkich dystrybucji GNU / Linux i odmian uniksowych (BSD, Solaris, HP-UX, IBM AIX), czy tylko w Ubuntu lub Linux?

Nischay
źródło
2
Spróbuj ln -F <src> <dst>i może działać. Z pewnością działał on dla superużytkownika w starszych wersjach Uniksa. Czy ktoś pamięta, czy to był UCB czy System V? Tak, złe rzeczy mogą się zdarzyć, ale zwykle nie. O ile pamiętam, rmdirwiedziałem, żeby nie usuwać twardego linku. Jednak użytkownicy mogą się mylić i usuwać rzeczy przez pomyłkę.
Steve Pitchers
@StevePitchers Jak rmdirw szczególny sposób obsługiwać twarde linki? Twardy link jest zwykłym linkiem - ale dodatkowym. Nie jest nawet łatwo ustalić, czy istnieją niezwykłe dodatkowe linki bez dodatkowych nagrań.
Volker Siegel,
1
Każdy węzeł przechowuje liczbę twardych linków, które do niego prowadzą: zawartość jest zwalniana tylko wtedy, gdy nie ma już żadnych linków. rmdirMoże więc powiedzieć, czy katalog zawiera linki z innych miejsc. Usuwanie rekurencyjne rm -rmusi być starannie zakodowane, aby mieć pewność, że zadziała poprawnie, nawet jeśli wystąpią błędy, takie jak „odmowa zgody”. BTW, UCB = BSD, doh!
Steve Pitchers
2
Zrobiłem ln -Fna katalogach i mam to działa. Ale nie odważysz się później usunąć katalogu z obawy przed uszkodzeniem systemu plików.
Edward Falk,

Odpowiedzi:

159

Dowiązania twarde katalogów niszczą system plików na wiele sposobów

Pozwalają tworzyć pętle

Twarde łącze do katalogu może prowadzić do samego rodzica, który tworzy pętlę systemu plików. Na przykład te polecenia mogą utworzyć pętlę z łączem zwrotnym l:

mkdir -p /tmp/a/b
cd /tmp/a/b
ln -d /tmp/a l

System plików z pętlą katalogów ma nieskończoną głębokość:

cd /tmp/a/b/l/b/l/b/l/b/l/b

Unikanie nieskończonej pętli podczas przechodzenia przez taką strukturę katalogów jest nieco trudne (chociaż na przykład POSIX wymaga findtego).

System plików z tego rodzaju twardym łączem nie jest już drzewem, ponieważ drzewo nie może z definicji zawierać pętli.

Przełamują jednoznaczność katalogów nadrzędnych

W pętli systemu plików istnieje wiele katalogów nadrzędnych:

cd /tmp/a/b
cd /tmp/a/b/l/b

W pierwszym przypadku /tmp/ajest katalogiem nadrzędnym /tmp/a/b.
W drugim przypadku /tmp/a/b/lkatalog nadrzędny /tmp/a/b/l/bjest taki sam jak /tmp/a/b.
Ma więc dwa katalogi nadrzędne.

Mnożą pliki

Pliki są identyfikowane przez ścieżki, po rozwiązaniu dowiązań symbolicznych. Więc

/tmp/a/b/foo.txt
/tmp/a/b/l/b/foo.txt

to różne pliki.
Istnieje nieskończenie wiele innych ścieżek do pliku. Są one oczywiście takie same pod względem liczby i-węzłów. Ale jeśli nie oczekujesz wyraźnie pętli, nie ma powodu, aby to sprawdzać.

Twarde łącze do katalogu może również wskazywać na katalog podrzędny lub katalog, który nie jest ani dzieckiem ani rodzicem żadnej głębokości. W takim przypadku plik będący dzieckiem łącza zostanie zreplikowany do dwóch plików, identyfikowanych przez dwie ścieżki.

Twój przykład

$ ln /Some/Direcoty /home/nischay/Hard-Directory
$ echo foo > /home/nischay/Hard-Directory/foobar.txt
$ diff -s /Some/Direcoty/foobar.txt /home/nischay/Hard-Directory/foobar.txt
$ echo bar >> /Some/Direcoty/foobar.txt
$ diff -s /Some/Direcoty/foobar.txt /home/nischay/Hard-Directory/foobar.txt
$ cat /Some/Direcoty/foobar.txt
foo
bar

Jak zatem mogą działać miękkie linki do katalogów?

Ścieżka, która może zawierać softlinki, a nawet miękkie pętle katalogów, jest często używana tylko do identyfikacji i otwarcia pliku. Można go wykorzystać jako normalną ścieżkę liniową.

Istnieją jednak inne sytuacje, w których ścieżki są używane do porównywania plików. W takim przypadku dowiązania symboliczne na ścieżce można najpierw rozwiązać, przekształcając je w minimalną i powszechnie uzgodnioną reprezentację, tworząc ścieżkę kanoniczną :

Jest to możliwe, ponieważ wszystkie miękkie linki można rozwinąć do ścieżek bez łącza. Po zrobieniu tego ze wszystkimi miękkimi linkami na ścieżce, pozostała ścieżka jest częścią drzewa, gdzie ścieżka jest zawsze jednoznaczna.

Polecenie readlinkmoże rozwiązać ścieżkę do ścieżki kanonicznej:

$ readlink -f /some/symlinked/path

Miękkie linki różnią się od tego, z czego korzysta system plików

Miękkie łącze nie może powodować wszystkich problemów, ponieważ różni się od łączy w systemie plików. Można go odróżnić od twardych łączy i w razie potrzeby przekształcić w ścieżkę bez dowiązań symbolicznych.
W pewnym sensie dodanie dowiązań symbolicznych nie zmienia podstawowej struktury systemu plików - zachowuje ją, ale dodaje więcej struktury, jak warstwa aplikacji.


Od man readlink:

 NAME
        readlink - print resolved symbolic links or canonical
        file names

 SYNOPSIS
        readlink [OPTION]... FILE...

 DESCRIPTION
        Print value of a symbolic link or canonical file name

        -f, --canonicalize
               canonicalize by  following  every  symlink  in
               every component of the given name recursively;
               all but the last component must exist
        [  ...  ]
Volker Siegel
źródło
1
Dlaczego miękki link nie może tego zrobić?
Tanay
1
@Tanay Racja, może pomóc ekspansji porównać to do podobnych przypadków z miękkimi linkami. Spróbuję.
Volker Siegel
W jaki sposób odnosi się to tylko do katalogów? W moim rozumieniu problemy te są również problemem dla plików dowiązanych. Co więcej, uważam, że hardlinkowanie jest łatwym sposobem na zmianę uprawnień danego katalogu, aby zezwolić innym osobom wewnątrz, bez konieczności dopuszczania ich również w łańcuchu nadrzędnym. Brzmi bardzo przydatnie, jeśli nie masz możliwości dodawania / modyfikowania grup ...
inetknght 18.04.17
świetna odpowiedź, ale potem ... jak Apple rozwiązało te problemy dla Time Machine?
Damien
Brzmi bardzo interesująco! Ale nic nie wiem na czym polega problem - czy możesz mi podpowiedzieć?
Volker Siegel
77

„Zasadniczo i tak nie powinieneś używać twardych linków” jest zbyt szeroki. Musisz zrozumieć różnicę między dowiązaniami stałymi a dowiązaniami symbolicznymi i używać każdego z nich odpowiednio. Każdy ma własny zestaw zalet i wad:

Łącza symboliczne mogą:

  • Wskaż katalogi
  • Wskaż nieistniejące obiekty
  • Wskaż pliki i katalogi poza tym samym systemem plików

Twarde linki mogą:

  • Chroń plik, do którego się odnoszą, przed usunięciem

Twarde linki są szczególnie przydatne przy wykonywaniu aplikacji „kopiuj przy zapisie”. Pozwalają zachować kopię zapasową struktury katalogów, wykorzystując tylko miejsce na pliki, które zmieniają się między dwiema wersjami.

Polecenie cp -aljest szczególnie przydatne w tym względzie. Tworzy kompletną kopię struktury katalogów, w której wszystkie pliki są reprezentowane przez twarde linki do oryginalnych plików. Następnie możesz przystąpić do aktualizacji plików w strukturze, a tylko pliki, które aktualizujesz, zajmą dodatkowe miejsce. Jest to szczególnie przydatne podczas tworzenia kopii zapasowych wielopokoleniowych.

użytkownik133232
źródło
41
jeśli chodzi o ostatni akapit, jeśli edytujesz „skopiowany” plik dowiązany, oryginalny plik również jest zmieniany - patrz unix.stackexchange.com/questions/70531/...
marcin
32
Ten opis twardych linków jest raczej mylący. Zasadniczo prawdą jest, że twarde linki „uniemożliwiają usunięcie pliku, do którego się odnoszą,”, ale to tylko efekt uboczny twardych linków. Z pewnością NIE jest prawdą, że możesz utworzyć twarde linki w jednym katalogu, zmienić „oryginalny” plik, a następnie oczekiwać, że twarde linki w jakiś sposób wskażą starą treść. W rzeczywistości główną zasadą twardych linków jest fakt, że wcale nie jest to link, a przynajmniej nie bardziej niż oryginalny „plik”, który jest tylko nazwą wskazującą na plik. Twardy link to po prostu inna nazwa wskazująca na ten sam plik.
matty
7
Pomysł tworzenia kopii zapasowej jest dobry i faktycznie z niego korzystam, ale myślę, że użytkownicy powinni zostać ostrzeżeni, że zmiana pliku również zmieni kopię zapasową.
Mark
3
Heck, dowiązanie symboliczne wcale nie musi wskazywać na nic. ln -s "Don't use this directory" READMEjest uzasadniony. W rzeczywistości, jeśli się nad tym zastanowić, katalog może być używany jako relacyjna baza danych i nie może zawierać żadnych rzeczywistych plików.
Edward Falk,
5
-1 To nie odpowiada na pytanie, a niektóre informacje są po prostu błędne.
wjandrea
43

Do Twojej wiadomości możesz osiągnąć to samo, co twarde linki do katalogów, używając mount:

mount -t bind /var/www /home/user/workspace/www

Jest to bardzo niebezpieczne, ponieważ większość narzędzi i programów nie będzie świadoma powiązania . Kiedyś zrobiłem coś jak w powyższym przykładzie, a potem przystąpiłem do rm -rf /home/user. Na szczęście nie było w tym nic istotnego /var/www.

stackount
źródło
6
Użyłem mount --bind <src> <dest>. Używaj ostrożnie, aby nie wycierać src;)
kachar
1
Dostaję:mount: unknown filesystem type 'bind'
Wizek,
4
na Busybox, it itmount -o bind src dest
Mat M
@MatM to samo z Debianem
hanshenrik
2
Jeśli potrzebujesz tylko zamontować do odczytu, możesz ustawić uprawnienia do punktu instalacji i uniknąć rm -rfproblemu. superuser.com/questions/320415/…
zanerock
19

Powód, dla którego twarde linki nie są dozwolone, jest trochę techniczny. Zasadniczo niszczą one strukturę systemu plików . Generalnie nie powinieneś używać twardych linków. Łącza symboliczne pozwalają na większość takich samych funkcji bez powodowania problemów (np ln -s target link.).

astex
źródło
17
Twarde linki mają dobre przypadki użycia. Mówienie, że ogólnie nie powinieneś ich używać, jest trochę zbyt szerokie.
Sander Steffann
4
+2 za podanie linku, który faktycznie odpowiada na pytanie PO (i moje), -1 za wydanie opinii („Zasadniczo i tak nie powinieneś używać twardych linków” - gdyby miał linki do jego obsługi, byłoby w porządku). Co było dobre, bo i tak nie mogę dać +2. ; D
msb
3
link „psują strukturę systemu plików” nie działa.
Charlie Parker,
5
Spróbuj streścić treść linku w odpowiedzi i zachowaj link jako odniesienie. To dobra praktyka wymiany stosów, aby uniknąć gnicia linków, dzięki.
Oxwivi,
3
dobra robota @CharlieParker; najlepszy niezamierzony (?) ironiczny komentarz wszech czasów :)
Eliran Malka