Jaka jest różnica między łączem twardym a łączem symbolicznym?

487

Jak mówi tytuł, chciałbym poznać różnicę między dowiązaniem twardym a dowiązaniem miękkim utworzonym przez polecenie ln. Polecenie man lnzawiera informacje, ale niewystarczająco odpowiada na moje pytanie.

Byłoby również miło, gdyby ktoś mógł podać ustawienie, w którym łącze twarde byłoby lepsze niż łącze symboliczne.

ste_kwr
źródło
15
jedna z różnic ... masz jakiś plik, na przykład test pliku. Jeśli utworzysz hardlink testowy ln, zrób test symlink ln -s, a następnie przenieś test pliku do innego katalogu (lub zmień nazwę), symlink nie będzie działać. Hardlink będzie działał. Teraz spróbuj usunąć test pliku. Hardlink nadal będzie działał, w rzeczywistości nadal będziesz mógł uzyskać dostęp do pliku, dopóki liczba hardlinków do pliku nie będzie wynosić 0. To z powodu i-węzłów, jest napisane w instrukcji ...
Denwerko
5
Ponownie to otworzyłem, ponieważ zasługuje na dobrą ogólną odpowiedź na ten temat (w przeciwieństwie do poprzedniego pytania, które było niejasnym przykładem C).
Oli
4
Najlepsza odpowiedź: youtube.com/watch?v=aO0OkNxDJ3c
Abhishek Bhatia
1
Również dość kompletna odpowiedź: stackoverflow.com/questions/185899/...
Elzo Valugi
@AbhishekBhatia wideo nie jest dostępne
Ooker

Odpowiedzi:

58

W systemie Linux / Unix skróty są znane jako łącza


Łącza są dwojakiego rodzaju: miękkie (symboliczne) lub twarde.

  1. Linki miękkie (linki symboliczne)

    Możesz tworzyć linki do plików i katalogów, a także tworzyć linki (skróty) na innej partycji i przy użyciu innego numeru i-węzła niż oryginał.

    Jeśli rzeczywista kopia zostanie usunięta, łącze nie będzie działać .

  2. Twarde linki

    Twarde linki są tylko dla plików; nie można utworzyć łącza do pliku na innej partycji z innym numerem i-węzła.

    Jeśli rzeczywista kopia zostanie usunięta, link zadziała , ponieważ uzyskuje dostęp do podstawowych danych, do których miała dostęp rzeczywista kopia.


Pytanie: Jak utworzyć miękki link?

Odpowiedź: Można utworzyć miękki link ln -s; najpierw musisz zdefiniować źródło, a następnie musisz zdefiniować miejsce docelowe. (Pamiętaj, że musisz zdefiniować pełne ścieżki źródła i miejsca docelowego; w przeciwnym razie to nie zadziała).

 sudo ln -s /usr/lib/i386-linux-gnu/mesa/libGL.so.1 /usr/lib32/libGL.so.1
             (----------Source-------)             ( Destination )

wprowadź opis zdjęcia tutaj

Jak widać, ma on inny i-węzeł i może być wykonany na innej partycji.


Pytanie: Jak utworzyć twardy link?

Odpowiedź: Twardy link można utworzyć za pomocą ln; najpierw musisz zdefiniować źródło, a następnie musisz zdefiniować miejsce docelowe. (Pamiętaj, że musisz zdefiniować pełną ścieżkę źródła i miejsca docelowego; w przeciwnym razie to nie zadziała).

Powiedzmy, że mam skrypt o /scriptnazwie katalog firefox.

 ls -i # Shows you the inode
 5898242 firefox

 ln /scripts/firefox /scripts/on-fire
       ( Source )    ( Destination )

wprowadź opis zdjęcia tutaj

Jak widać, ma tę samą i-węzeł. Jeśli usunę oryginalny, link będzie działał i będzie działał jak oryginał.

wprowadź opis zdjęcia tutaj

Powyżej sprawdzam, czy link działa, a następnie usuwam oryginalny skrypt firefox.


Twoje pytanie: Byłoby miło, gdyby ktoś mógł podać ustawienie, w którym łącze twarde byłoby lepsze niż łącze symboliczne.

Odpowiedź : W zależności od układu partycji dysku twarde łącza mają ograniczenie, że muszą znajdować się na tej samej partycji (-1 punkt) i mogą prowadzić tylko do plików (-1 punkt) ), ale +1 punkt, jeśli oryginał zostanie usunięty łącze będzie działać i działa jak oryginał.

Z drugiej strony, miękkie łącze może wskazywać na katalogi lub pliki (+1 punkt) i nie ma ograniczeń partycji (+1 punkt), ale (-1 punkt), jeśli źródło zostanie usunięte, łącze nie będzie działać.

Qasim
źródło
Czy mogę utworzyć stałe łącze i podać i-węzeł jako źródło?
TMOTTM
324

Hardlink nie jest wskaźnikiem do pliku, to pozycja katalogu (plik) wskazująca na ten sam i-węzeł. Nawet jeśli zmienisz nazwę drugiego pliku, stałe łącze nadal wskazuje plik. Jeśli zamienisz drugi plik na nową wersję (przez skopiowanie), hardlink nie wskaże nowego pliku. W tym samym systemie plików można mieć tylko łącza twarde. W przypadku linków twardych nie masz pojęcia o oryginalnych plikach i linkach, wszystkie są równe (pomyśl o tym jako o odwołaniu do obiektu). To koncepcja bardzo niskiego poziomu.

Z drugiej strony dowiązanie symboliczne faktycznie wskazuje inną ścieżkę (nazwę pliku); rozpoznaje nazwę pliku za każdym razem, gdy uzyskujesz do niego dostęp za pośrednictwem dowiązania symbolicznego. Jeśli przeniesiesz plik, dowiązanie symboliczne nie nastąpi. Jeśli zastąpisz plik innym, zachowując nazwę, dowiązanie symboliczne wskaże nowy plik. Dowiązania symboliczne mogą obejmować systemy plików. W przypadku dowiązań symbolicznych masz wyraźne rozróżnienie między plikiem rzeczywistym a dowiązaniem symbolicznym, który nie przechowuje żadnych informacji obok ścieżki o wskazanym pliku.

vartec
źródło
1
Rzecz, która (własnymi słowami) „wskazuje na plik”, można nazwać wskaźnikiem (jest to trywialnie prawie tautologicznie prawdziwe). Jeśli robimy dupki, to (ogólnie) może istnieć pojęcie dowiązań twardych, nawet jeśli system plików nie używa i-węzłów.
jfs
319

"Obraz jest wart tysiąca słów." Reprezentacja obrazkowa


I „Przykład jest wart sto akapitów ...”

Utwórz dwa pliki:

$ touch blah1   
$ touch blah2

Wprowadź do nich dane:

$ echo "Cat" > blah1
$ echo "Dog" > blah2

I zgodnie z oczekiwaniami:

$cat blah1; cat blah2
Cat
Dog

Utwórzmy twarde i miękkie linki:

$ ln blah1 blah1-hard
$ ln -s blah2 blah2-soft

Zobaczmy, co się właśnie stało:

$ ls -l

blah1
blah1-hard
blah2
blah2-soft -> blah2

Zmiana imienia bla1 nie ma znaczenia:

$ mv blah1 blah1-new
$ cat blah1-hard
Cat

blah1-hard wskazuje na i-węzeł, zawartość pliku - to się nie zmieniło.

$ mv blah2 blah2-new
$ ls blah2-soft
blah2-soft
$ cat blah2-soft  
cat: blah2-soft: No such file or directory

Nie można znaleźć zawartości pliku, ponieważ miękki link wskazuje nazwę, która została zmieniona, a nie zawartość.
Podobnie, jeśli bla1 zostanie usunięte, bla1-hard nadal będzie zawierał zawartość; jeśli blah2 zostanie usunięte, blah2-soft jest tylko linkiem do nieistniejącego pliku.


źródło: rażąco kopiując go z StackOverflow!

ABcDexter
źródło
13
Szczerze mówiąc - dodałeś piękny obraz na górze ... och, też to skopiowałeś! Połączenie dwóch odpowiedzi jest w rzeczywistości bardzo pomocne :)
icc97
2
lepiej wyjaśnione, nigdzie!
dennisbot
3
Patrzyłem na obraz przez 20 sekund, a potem nagle go rozgryzłem. To jest naprawdę genialne.
Mohammed Joraid
1
btw: Używanie twardych dowiązań git jest złym pomysłem , na wypadek gdyby ktoś (sfrustrowany miękkimi linkami) zastanawiał się ... mógłby zastosować się również do innych systemów wersji.
Frank Nocke,
1
Czy i-węzeł do jego dowiązań twardych jest podobny do pliku przechowywanego w chmurze dla dowolnego urządzenia, które ma do niego dostęp?
Ooker
89

Oba są wskaźnikami do plików; różnica polega na rodzaju wskaźnika. Łącze symboliczne wskazuje na inny plik według nazwy . Ma specjalny bit trybu, który identyfikuje go jako dowiązanie symboliczne, a jego zawartość to nazwa prawdziwego pliku. Ponieważ zawiera ona tylko nazwę, nazwa ta tak naprawdę nie musi istnieć lub może istnieć w innym systemie plików. Jeśli podmienisz nazwany plik (zmienisz jego zawartość bez wpływu na jego nazwę), wówczas łącze nadal będzie zawierało tę samą nazwę, a więc teraz wskazuje nowy plik. Możesz łatwo zidentyfikować symboliczny link i zobaczyć nazwę pliku, na który wskazuje.

Twardy link wskazuje plik według numeru i-węzła. W związku z tym twarde linki nie różnią się od imienia pliku. Nie ma „prawdziwej” nazwy vs. twardej nazwy linku; wszystkie twarde linki są równie poprawnymi nazwami pliku. Z tego powodu plik, do którego prowadzi łącze, musi faktycznie istnieć i znajdować się w tym samym systemie plików, w którym próbujesz utworzyć łącze. Jeśli usuniesz oryginalną nazwę, twardy link nadal wskazuje ten sam plik. Ponieważ wszystkie twarde linki są równie poprawnymi nazwami pliku, nie można na nie patrzeć i widzieć innych nazw pliku; aby to znaleźć, musisz przejść do każdego pliku i porównać ich numer i-węzła, aby znaleźć inne nazwy, które mają ten sam numer i-węzła.

Możesz określić, ile nazw plików ma plik wyjściowy ls -l. Pierwszą liczbą po trybie pliku jest liczba linków. Plik z więcej niż 1 linkiem ma gdzieś inną nazwę (nazwy), i odwrotnie, plik z liczbą linków tylko 1 nie ma (innych) twardych linków.

psusi
źródło
If you replace the named file, then the link still contains the same name, and so now it points to the new file- Myślę, że nie jest to dobrze wyjaśnione. Czy chodzi ci o to, że jeśli zastąpię plik, do którego mam link symboliczny, to linki zawierające nazwę pozostaną nietknięte. Ale wskazywałby tylko na zastąpiony plik, gdy jego nazwa pliku (tj. Nowy plik, który zastąpił stary) jest taki sam jak zastąpiony (tj. Stary plik, który został zastąpiony nowym), prawda?
Mike
@Mike, tak: symboliczny link wskazuje oryginalną nazwę pliku, więc zastąpienie tego pliku oznacza, że ​​link wskazuje teraz na nowy plik.
psusi
Ale tylko jeśli poprawnie ma taką samą nazwę? Czy dowiązanie symboliczne wskazuje na banana, a ja zamieniam plik na pomarańczowy, a następnie sy link nie może już znaleźć pliku banan, tzn. Nie będzie działać
Mike
@Mike, the world replace oznacza, że ​​ma taką samą nazwę, w przeciwnym razie po prostu usuwasz jeden plik i dodajesz inny;)
psusi
58

Hardlink może działać tylko na tym samym systemie plików, jest to po prostu inna nazwa dla tego samego i-węzła (pliki są wewnętrznie przywoływane przez i-węzły). Plik zostanie usunięty z dysku tylko wtedy, gdy zniknie ostatni link do jego i-węzła (ty rmd lub unlinkd ostatni link). Twarde linki zwykle działają tylko w przypadku plików, a nie katalogów.

Dowiązanie symboliczne (dowiązanie symboliczne) to specjalny plik zawierający ścieżkę do innego pliku. Ta ścieżka może być bezwzględna lub względna. dowiązania symboliczne mogą działać w różnych systemach plików, a nawet mogą wskazywać na różne pliki, jeśli na przykład odłączysz zewnętrzny dysk twardy i zastąpisz go innym, który ma inny plik w tej samej ścieżce. Dowiązanie symboliczne może wskazywać albo pliki, albo katalogi.

knittl
źródło
Dzięki, to mówi mi, jak działają, ale co dokładnie robi twardy link? I dlaczego to nie działa w przypadku katalogów?
ste_kwr
@knittl: na pewno? Wydaje się, że w niektórych systemach plików dozwolone są linki do katalogów, ale tylko root może je utworzyć. Zobacz -d, -F, --directoryprzełączniki. I tak, nie widział notatkę na ln(1)stronie :)
0xC0000022L
1
@kniwor: najprostszym sposobem na opisanie dowiązań twardych jest „po prostu inna nazwa tego samego pliku (tzn. danych na dysku)”. I - przynajmniej w moim systemie (systemach) - lnnie można używać do tworzenia dowiązań twardych do katalogów. Istnieją jednak dowiązania twarde do katalogów, przy czym najbardziej znanym przykładem jest .i ... Nie chciałem tego uwzględniać w mojej pierwotnej odpowiedzi, ponieważ tylko to skomplikowałoby.
knittl
2
@STATUS_ACCESS_DENIED: no dobrze… ale zwykle nie jest to dobry pomysł. Dlatego w „oryginalnej” odpowiedzi napisałem »zwykle«. Zobacz także mój poprzedni komentarz dla przykładów.
knittl
więc twardy link może wskazywać na ten sam folder / plik o różnych nazwach, tj. o różnych nazwach, które prowadzą do tego samego i-węzła?
Charlie Parker,
21

Jedna z odpowiedzi z drugiego wątku (teraz link od góry twojego postu) wspomina o tej stronie, która moim zdaniem jest dość dobrym wyjaśnieniem na średnim poziomie. Jeśli gubisz się w sztuce ascii, oto wersja tl; dr:

  • Standardowe pliki są wskaźnikiem z systemu plików do i-węzła, który z kolei wskazuje na dane fizyczne. Składnik pliku przechowuje swoje łącze do systemu plików (zasadniczo jego ścieżkę) i łącze do i-węzła.
  • Twarde linki są jak pliki. Są tylko dodatkowym wskaźnikiem bezpośrednio do i-węzła.
  • Dowiązania symboliczne to osobne pliki (w tym osobne i-węzły i dane), które przechowują ścieżkę systemu plików do pliku.

Zaangażowane jądro i systemy plików tłumaczą wszystko w przejrzysty sposób.

Na tej podstawie:

  • Twarde łącza pozwalają tylko na łączenie tego samego systemu plików. Dowiązania symboliczne mogą wskazywać dowolną ścieżkę.
  • Twarde linki (zasadniczo) wskazują na dane bezwzględne. Dowiązania symboliczne mogą wskazywać na ścieżki względne (np. ../parent.file)
  • W związku z tym, jeśli przesuniesz wskaźnik docelowy twardego łącza (który, pamiętaj, sam w sobie jest po prostu twardym łączem wskazującym na i-węzeł), twarde łącze nadal działa. Przesuwanie celu dowiązania symbolicznego zwykle powoduje jego uszkodzenie.
  • Rozwiązanie twardego łącza byłoby szybsze, ale niezmierzone. Ta niewielka część prędkości kosztuje nieelastyczny system plików.

Mogłem się trochę pomylić, ale czytając różne rzeczy, staram się znaleźć różnicę między standardowym plikiem a twardym dowiązaniem. Sposób, w jaki go czytam, polega na tym, że każdy plik składa się z twardego łącza (przechowującego nazwę pliku), łączącego się z i-węzłem, który wskazuje na dane fizyczne.

Dodanie twardego łącza zapewnia tylko i-węzeł z dodatkowym wskaźnikiem opartym na systemie plików. Czy to prawda?

Oli
źródło
5
Myślę, że masz rację, każdy plik to nazwa ścieżki dla i-węzła, a twardy link to dodatkowa nazwa ścieżki dla tego samego i-węzła. Tak więc twardy link nie różni się od zwykłego pliku.
enzotib
Próbuję to zrozumieć ... ale mówisz:> „Dowiązania symboliczne to osobne pliki (w tym osobne i- węzły i dane ), które przechowują ścieżkę systemu plików do pliku”. Czy dowiązanie symboliczne naprawdę ma osobne dane? To jest jak kopia katalogu, do którego prowadzi, prawda? ... i za każdym razem, gdy coś jest zapisywane w dowiązaniu symbolicznym, musi być zapisywane dwa razy na dysk? Nie ma sensu.
MiniGod
@MiniGod Żadne dowiązanie symboliczne nie jest i-węzłem do bloku danych, który przechowuje ścieżkę do innego i-węzła (nazwa pliku). Tak, jest to mylące jak w Matrixie, ale kiedy je dostaniesz, nigdy nie zapomnisz :)
Oli
@Oli Mogę być zdezorientowany, ale kiedy mówisz: „w tym osobne i- węzły i dane ”, masz na myśli, że dowiązanie symboliczne ma osobne dane !?
MiniGod
1
@MiniGod Tak. Symlink jest i-węzłem wskazującym na dane (tak jak normalny plik), a dane te są ścieżką. Jest to nieco bardziej sprytne - aby umożliwić przejrzyste korzystanie z dowiązań symbolicznych - ale to w zasadzie wszystko, czym są.
Oli
15

Kiedy stosować Soft Link:

Łączenie między systemami plików: Jeśli chcesz połączyć pliki między systemami plików, możesz używać tylko dowiązań symbolicznych / dowiązań miękkich.

Łącza do katalogu: jeśli chcesz połączyć katalogi, musisz używać linków miękkich, ponieważ nie możesz utworzyć twardego łącza do katalogu.

Kiedy stosować Hard Link:

Miejsce do przechowywania: twarde łącza zajmują bardzo mało miejsca, ponieważ podczas tworzenia twardych łączy nie są tworzone nowe i-węzły. W miękkich linkach tworzymy plik, który zajmuje miejsce (zwykle 4KB, w zależności od systemu plików)

Wydajność: Wydajność będzie nieco lepsza podczas uzyskiwania dostępu do twardego łącza, ponieważ uzyskuje się bezpośredni dostęp do wskaźnika dysku zamiast przechodzenia przez inny plik. Przenoszenie lokalizacji pliku: jeśli plik źródłowy zostanie przeniesiony do innej lokalizacji w tym samym systemie plików, łącze twarde będzie nadal działać, ale łącze miękkie nie powiedzie się.

Nadmiarowość: jeśli chcesz zapewnić bezpieczeństwo swoich danych, powinieneś używać twardego linku, ponieważ w twardym linku dane są bezpieczne, dopóki wszystkie linki do plików nie zostaną usunięte, zamiast w miękkim linku, stracisz dane, jeśli główna instancja pliku zostanie usunięta.

Osama
źródło
Zauważ, że istnieje również szybkie łącze symboliczne dla ścieżki o rozmiarze do 64 bajtów. Nadal zajmuje jeden i-węzeł, ale nie zużywa przestrzeni blokowej 4kb.
syockit
8

Zamieszanie pojawia się, gdy próbujesz znaleźć różnicę między „nazwą pliku” a twardym linkiem, ponieważ nie ma go.

Każdy tworzony plik składa się z danych na dysku i twardego łącza - które jest nazwą pliku w katalogu i wskaźnikiem do danych na dysku. Koniec opowieści. Po usunięciu ostatniego (lub tylko) twardego łącza system operacyjny wie, że dane nie są już potrzebne.

Z tego widać, że rzeczywiste dane nigdy nie są usuwane, są tylko twarde linki. A kiedy na dysku jest wystarczająco tłoczno, dane mogą zostać zastąpione danymi innego pliku. Do tego czasu dane z usuniętego pliku mogą być odzyskane, ale trudno jest je znaleźć bez twardego łącza.

Łącza symboliczne, jak wyjaśniono wcześniej, po prostu mówią „jest plik o nazwie <targetname>w folderze o nazwie <targetfolder>”. Wskazują na twardy link. Nie wiedzą, gdzie są dane. Twardy link wie o tym.

Gonesoft
źródło
0

To jest bardzo proste. Pliki (i katalogi!) Są przechowywane pod adresami na urządzeniu blokowym (HDD lub cokolwiek innego). Zwykle masz jedną nazwę zamapowaną na adres i tak otrzymujesz plik. Twrdym to drugi, trzeci itd nazwa odwzorowane na ten sam adres. Łączem symbolicznym , a nie odnosi się do symbolu - nazwa - a więc jest nazwisko odwzorowywane na imienia. Jeśli chodzi o jądro, gdy odczyta symboliczny cel dowiązania, zatrzymuje się i wraca na początek z wartością celu jako nazwą pliku (mniej więcej), więc względne dowiązania symboliczne są możliwe, ale bardzo nieprzydatne. Nazwa docelowa nie jest używana powyżej poziomu systemu plików, z wyjątkiem przypadków jawnego zapytania w kodzie przestrzeni użytkownika.

Jim Driscoll
źródło