Jaka jest różnica między dowiązaniem symbolicznym a dowiązaniem twardym?


768

Ostatnio zostałem o to zapytany podczas rozmowy kwalifikacyjnej. Byłem szczery i powiedziałem, że wiem, jak zachowuje się dowiązanie symboliczne i jak je utworzyć, ale nie rozumiem użycia twardego dna i czym różni się od dowiązania symbolicznego.


2
o „nie rozumiem użycia twardego linku”, można go użyć w systemach kompilacji, które wykonują wiele kopii plików binarnych. Tworzenie twardego łącza zamiast rzeczywistej kopii przyspiesza. MSBuild 4.0 obsługuje to.
Ankush,

13
Uważam ten link za bardzo przydatny, aby go zrozumieć. askubuntu.com/questions/108771/…
kta

2
unix.stackexchange ma dobrą listę punktów wypunktowanych ... bardzo pomocną, ponieważ bardzo zwięźle określa wszystkie ograniczenia i jest łatwa do przejrzenia. (wiele z tych punktów dotyczy przypadków / ostrzeżeń, które są wymienione tylko w komentarzach do tego pytania ... lub wcale nie są wymienione)
Trevor Boyd Smith

Odpowiedzi:


779

Pod systemem plików pliki są reprezentowane przez i-węzły. (A może to wiele i-węzłów? Nie jestem pewien).

Plik w systemie plików jest w zasadzie linkiem do i-węzła.
Twardy link tworzy zatem kolejny plik z łączem do tego samego i-węzła.

Kiedy usuwasz plik, usuwa on jeden link do bazowego i-węzła. I-węzeł jest usuwany (lub usuwalny / nadpisywalny) tylko wtedy, gdy wszystkie łącza do i-węzła zostały usunięte.

Łącze symboliczne to łącze do innej nazwy w systemie plików.

Po utworzeniu twardego łącza link jest do i-węzła. Usunięcie, zmiana nazwy lub przeniesienie oryginalnego pliku nie wpłynie na twardy link, ponieważ łączy się z leżącym pod nim i-węzłem. Wszelkie zmiany danych w i-węzle są odzwierciedlane we wszystkich plikach, które odnoszą się do tego i-węzła.

Uwaga: twarde linki są prawidłowe tylko w tym samym systemie plików. Dowiązania symboliczne mogą obejmować systemy plików, ponieważ są po prostu nazwą innego pliku.


2
Jestem pewien, że i-węzły zależą od konkretnego wariantu systemu operacyjnego; jednak uważam, że zwykle jest to pojedynczy i-węzeł. I-node ma informacje o pliku i informacje o miejscu przechowywania danych na dysku. Duże pliki będą miały pośrednie wskaźniki do dodatkowych tabel.
terson,

76
Możesz dodać przydatną funkcję, że dowiązania symboliczne mogą przenikać systemy plików, a dowiązania twarde nie mogą (muszą odnosić się do pliku w tym samym systemie plików).
paxdiablo

52
Dobre wizualne wyjaśnienie znajduje się w artykule na temat Linux Gazette
Rodrigue

1
Napisałem też blog na ten temat po lekturze i eksperymentach csharpbsharp.tumblr.com
Adnan Bhatti

1
@zen: Możesz odmontować / zamontować system plików za każdym razem, gdy nie jest używany. W przypadku partycji root jest to nieco trudne, ale można to zrobić (niezalecane). Aby to zrobić dla roota, zwykle najlepiej jest uruchomić bootowaną płytę ratunkową, najpierw zmodyfikować mounty i ponownie uruchomić. Ale powinieneś zadać tego rodzaju pytanie superużytkownikowi.
Martin York,

464

Przyjemna intuicja, która może pomóc przy użyciu dowolnej konsoli Linux (ISH).

Utwórz dwa pliki:

$ touch foo; touch bar

Wprowadź do nich trochę danych:

$ echo "Cat" > foo
$ echo "Dog" > bar

(Właściwie mogłem użyć echa, ponieważ tworzy pliki, jeśli nie istnieją ... ale nieważne.)

I zgodnie z oczekiwaniami:

$cat foo; cat bar
Cat
Dog

Utwórzmy twarde i miękkie linki:

$ ln foo foo-hard
$ ln -s bar bar-soft

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

$ ls -l

foo
foo-hard
bar
bar-soft -> bar

Zmiana nazwy foo nie ma znaczenia:

$ mv foo foo-new
$ cat foo-hard
Cat

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

$ mv bar bar-new
$ ls bar-soft
bar-soft
$ cat bar-soft  
cat: bar-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 foozostanie usunięty, foo-hardnadal zawiera zawartość; jeśli barzostanie usunięty, bar-softjest tylko linkiem do nieistniejącego pliku.


12
czy to oznacza, że ​​„plik” i „twardy link” są takie same, oba wskazują na i-węzeł? po usunięciu pliku lub twardego łącza zawartość nadal istnieje, dopóki jeden wskazuje na i-węzeł, prawda?
Daniel W.,

1
@DanFromGermany Poprawnie. Treść jest osiągalna, dopóki wskazuje na nią co najmniej jeden twardy link (np. Plik).
Adam Matan

6
touch blah1; touch blah2można skrócić dotouch blah1 blah2
Dmitri Zaitsev

11
@DmitriZaitsev Prawda, ale będzie mniej czytelna dla początkujących IMO.
Adam Matan

8
Myślę, że jest to najlepiej zrozumiała odpowiedź w odniesieniu do wielu odpowiedzi, które przeczytałem. Próbka jest lepsza niż kilka tekstów wyjaśniających.
Scott Chu,

435

Jak mówi przysłowie, obraz jest wart tysiąca słów. Oto jak to wizualizuję:

wprowadź opis zdjęcia tutaj

Oto, w jaki sposób przechodzimy do tego zdjęcia:

  1. Utwórz nazwę myfile.txtw systemie plików, która wskazuje na nowy i-węzeł (który zawiera metadane pliku i wskazuje bloki danych zawierające jego zawartość, tj. Tekst „Witaj, świecie!”:

    $ echo 'Hello, World!' > myfile.txt
    
  2. Utwórz twardy link my-hard-linkdo pliku myfile.txt, co oznacza „utwórz plik, który powinien wskazywać ten sam i-węzeł, który myfile.txtwskazuje”:

    $ ln myfile.txt my-hard-link
    
  3. Utwórz miękki link my-soft-linkdo pliku myfile.txt, co oznacza „utwórz plik, który powinien wskazywać na plik myfile.txt”:

    $ ln -s myfile.txt my-soft-link
    

Spójrz, co się teraz stanie, jeśli myfile.txtzostanie usunięty (lub przeniesiony): my-hard-linknadal wskazuje na tę samą treść, a zatem pozostaje nienaruszony, a my-soft-linkteraz wskazuje na nic. Inne odpowiedzi omawiają zalety / wady każdego z nich.


3
@ThunderWiring Przez „punkt” mam na myśli wszelkie odniesienia do linków. W przypadku twardego łącza odwołuje się bezpośrednio do i-węzła (tj. Do tego samego i-węzła, do którego się odwołuje myfile.txt). W przypadku linku miękkiego odniesieniem nie jest i-węzeł (który zawiera dane), ale raczej odniesieniem jest ścieżka systemu plików do myfile.txt(np. /home/Documents/myfile.txt)
akivajgordon

4
Naprawdę podoba mi się twoja reakcja wizualna @akivajgordon - naprawdę pomogła mi lepiej zrozumieć różnice!
wmock,

7
Dziesięć tysięcy słów!
SaganRitual

13
Może jestem powolny, ale twoje zdjęcie wyjaśniło 20 lat tajemnicy w około 2 sekundy.
jdk1.0

3
Najbardziej użyteczna odpowiedź, jestem wściekła, że ​​jest tak głęboko pochowany w tym poście. Dałbym ci sto punktów internetowych, ale niestety mogę ci dać tylko jeden.
Dagrooms

71

Twarde linki są przydatne, gdy oryginalny plik jest przenoszony. Na przykład przenoszenie pliku z / bin do / usr / bin lub do / usr / local / bin. Dowolne dowiązanie symboliczne do pliku w / bin byłoby przez to zepsute, ale nie dało by się tego zrobić hardlink, będący linkiem bezpośrednio do i-węzła pliku.

Dowiązania twarde mogą zajmować mniej miejsca na dysku, ponieważ zajmują tylko pozycję katalogu, podczas gdy dowiązanie symboliczne potrzebuje własnego i-węzła do przechowywania nazwy, na którą wskazuje.

Twarde linki również wymagają mniej czasu na rozwiązanie - dowiązania symboliczne mogą wskazywać na inne dowiązania znajdujące się w katalogach dowiązań symbolicznych. Niektóre z nich mogą znajdować się w systemie plików NFS lub innych systemach plików o dużych opóźnieniach, co może spowodować ruch sieciowy do rozwiązania. Twarde dowiązania, zawsze znajdujące się w tym samym systemie plików, są zawsze rozwiązywane za jednym razem i nigdy nie wiążą się z opóźnieniami sieciowymi (jeśli jest to dowiązanie twarde w systemie plików NFS, serwer NFS wykonałby rozdzielczość i byłoby niewidoczne system klienta). Czasami jest to ważne. Nie dla mnie, ale mogę sobie wyobrazić systemy o wysokiej wydajności, w których może to być ważne.

Myślę też, że rzeczy takie jak mmap (2), a nawet open (2) używają tej samej funkcjonalności co hardlink, aby utrzymać i-węzeł pliku aktywny, więc nawet jeśli plik zostanie odłączony (2) ed, i-węzeł pozostaje, aby umożliwić procesowi ciągły dostęp, i dopiero po zakończeniu procesu plik naprawdę zniknie. Pozwala to na znacznie bezpieczniejsze pliki tymczasowe (jeśli możesz sprawić, że otwieranie i rozłączanie będą się odbywać atomowo, co może być interfejsem API POSIX, którego nie pamiętam, to naprawdę masz bezpieczny plik tymczasowy), w którym możesz czytać / zapisywać twoje dane bez dostępu do nich. Tak było, zanim / proc dał wszystkim możliwość przeglądania deskryptorów plików, ale to już inna historia.

Mówiąc o tym, odzyskiwanie pliku otwartego w procesie A, ale niepowiązanego w systemie plików, obraca się wokół używania twardych łączy do odtworzenia łączy i-węzłów, aby plik nie znikał, gdy proces, który go otworzył, zamyka go lub znika.


35

Miękki link :

soft lub symbolical to raczej skrót do oryginalnego pliku .... jeśli usuniesz oryginał, skrót się nie powiedzie i jeśli usuniesz tylko skrót, nic się nie stanie z oryginałem.

Soft link Składnia :ln -s Pathof_Target_file link

Wynik : link -> ./Target_file

Dowód: readlink link również w ls -l linkdanych wyjściowych zobaczysz pierwszą literę lrwxrwxrwxjako l, co oznacza, że ​​plik jest linkiem miękkim.

Usuwanie linku: unlink link

Uwaga: Jeśli chcesz, twój softlink może działać nawet po przeniesieniu go w inne miejsce z bieżącego katalogu. Upewnij się, że podajesz ścieżkę bezwzględną, a nie względną podczas tworzenia miękkiego łącza. tj. (zaczynając od / root / user / Target_file, a nie ./Target_file)

Twardy link:

Twardy link jest bardziej kopią lustrzaną lub wieloma ścieżkami do tego samego pliku. Zrób coś do pliku 1, a pojawi się on w pliku 2. Usunięcie jednego nadal zachowuje drugie.

I-węzeł (lub plik) jest usuwany tylko wtedy, gdy wszystkie (twarde) łącza lub wszystkie ścieżki do (i tego samego pliku) i-węzła zostały usunięte.

Po utworzeniu twardego łącza ma on i-węzeł oryginalnego pliku. Usunięcie zmiany nazwy lub przeniesienie oryginalnego pliku nie wpłynie na twardy link, ponieważ łączy się z leżącym pod nim i-węzłem. Wszelkie zmiany danych w i-węzle są odzwierciedlane we wszystkich plikach, które odnoszą się do tego i-węzła.

Składnia Hard Link :ln Target_file link

Dane wyjściowe: plik z linkiem do nazwy zostanie utworzony z tym samym numerem i-węzła co plik docelowy.

Dowód: ls -i link Target_file (sprawdź ich i-węzły)

Usuwanie linku: rm -f link (Usuń link tak jak zwykły plik)

Uwaga : dowiązania symboliczne mogą obejmować systemy plików, ponieważ są po prostu nazwą innego pliku. Natomiast twarde linki są prawidłowe tylko w tym samym systemie plików.

Łącza symboliczne mają pewne funkcje, których brakuje twardych łączy:

  • Twardy link wskazuje na zawartość pliku. podczas gdy Soft link wskazuje nazwę pliku.
  • podczas gdy rozmiar twardego łącza to rozmiar zawartości, podczas gdy miękki link ma rozmiar nazwy pliku.
  • Twarde linki mają ten sam i-węzeł. Miękkie linki nie.
  • Twarde linki nie mogą przekraczać systemów plików. Miękkie linki tak.
  • od razu wiesz, gdzie wskazuje dowiązanie symboliczne, gdy masz twarde dowiązania, musisz zbadać cały system plików, aby znaleźć pliki z tym samym i-węzłem.

    # find / -inum 517333

    /home/bobbin/sync.sh
    /root/synchro
    
  • twarde linki nie mogą wskazywać na katalogi.

Twarde linki mają dwa ograniczenia:

  • Katalogów nie można na stałe połączyć. Linux nie pozwala na utrzymanie acyklicznej struktury katalogów.
  • Nie można utworzyć twardego łącza między systemami plików. Oba pliki muszą znajdować się w tych samych systemach plików, ponieważ różne systemy plików mają różne niezależne tabele i-węzłów (dwa pliki w różnych systemach plików, ale z tym samym numerem i-węzła będą różne).

3
„podczas gdy rozmiar twardego linku to rozmiar zawartości, podczas gdy miękki link ma rozmiar nazwy pliku”. Aby to wyjaśnić, utworzenie kolejnego twardego łącza wpływa tylko na kilka wolnych bajtów na wolne miejsce.
Ingo

34

Prostym sposobem dostrzeżenia różnicy między łączem twardym a łączem symbolicznym jest prosty przykład. Twardy link do pliku wskaże miejsce, w którym plik jest przechowywany, lub i-węzeł tego pliku. Łącze symboliczne będzie wskazywać na sam plik.

Więc jeśli mamy plik o nazwie „a” i utworzymy dowiązanie twarde „b” i dowiązanie symboliczne „c”, które wszystkie odnoszą się do pliku „a”:

echo "111" > a
ln a b
ln -s a c

Dane wyjściowe „a”, „b” i „c” będą następujące:

cat a --> 111
cat b --> 111
cat c --> 111

Teraz usuńmy plik „a” i zobaczmy, co stanie się z danymi wyjściowymi „a”, „b” i „c”:

rm a
cat a --> No such file or directory
cat b --> 111
cat c --> No such file or directory

Więc co się stało?

Ponieważ plik „c” wskazuje na sam plik „a”, jeśli plik „a” zostanie usunięty, plik „c” nie będzie miał nic do wskazania, w rzeczywistości zostanie również usunięty.

Plik „b” wskazuje jednak miejsce przechowywania lub i-węzeł pliku „a”. Więc jeśli plik „a” zostanie usunięty, to nie będzie już wskazywał na i-węzeł, ale ponieważ plik „b” robi, i-węzeł będzie nadal przechowywał zawartość należącą do „a”, dopóki nie będą już do niego wskazywać żadne twarde linki.


Pomocne może być wskazanie, że plik jest bardzo abstrakcyjnym obiektem i ma wszystkie abstrakcyjne rzeczy, a rzeczywista intencja implementacji na wysokim poziomie może nie być odpowiednia do wyjaśnienia bez ryzyka zdmuchnięcia abstrakcji.
Cholthi Paul Ttiopic

28

Łącza symboliczne prowadzą do nazwy ścieżki. Może to znajdować się w dowolnym miejscu w drzewie plików systemu i nawet nie musi istnieć po utworzeniu łącza. Ścieżka docelowa może być względna lub bezwzględna.

Dowiązania twarde są dodatkowymi wskaźnikami do i-węzła, co oznacza, że ​​mogą istnieć tylko na tym samym wolumenie co cel. Dodatkowe twarde linki do pliku są nie do odróżnienia od „oryginalnej” nazwy użytej w odniesieniu do pliku.


Ponadto po usunięciu pliku, do którego prowadzi łącze, łącze symboliczne ulega uszkodzeniu, łącze twarde pozostaje ważne, ponieważ „utrzymuje” plik w systemie plików.
njsf

21

Chciałbym wskazać Ci Wikipedię:

Kilka punktów:

  • Dowiązania symboliczne, w przeciwieństwie do dowiązań twardych, mogą przenikać systemy plików (przez większość czasu).
  • Dowiązania symboliczne mogą wskazywać na katalogi.
  • Twarde linki wskazują plik i umożliwiają odwołanie się do tego samego pliku o więcej niż jednej nazwie.
  • Tak długo, jak istnieje przynajmniej jedno łącze, dane są nadal dostępne.

1
Teoretycznie (aw niektórych przypadkach nawet w praktyce) twarde linki mogą również wskazywać na katalogi (w rzeczywistości „.” To twardy link do bieżącego katalogu, a „..” to twardy link do katalogu nadrzędnego). Ale mogą być niebezpieczne, więc większość UNIXów im na to nie pozwala (lub wymaga specjalnych kroków, aby to zrobić). Apple używa ich do implementacji wehikułu czasu, na przykład: earthlingsoft.net/ssp/blog/2008/03/x5_time_machine
Joachim Sauer

3
Wskazujesz link do artykułu ... czy to czyni cię linkiem symbolicznym?
Ian Campbell

@ JoachimSauer Czy uważasz, że nowy system plików Apple wyeliminuje konieczność korzystania z twardych linków do katalogów przez Time Machine?
cjm

Znalazłem wyjaśnienia wikipedii znacznie krótsze i bardziej konkretne niż wyjaśnienia w najlepiej ocenianych odpowiedziach.
jeziora

9

Twarde linki są bardzo przydatne podczas tworzenia przyrostowych kopii zapasowych. Zobacz na przykład rsnapshot . Chodzi o to, aby skopiować za pomocą twardych linków:

  • skopiuj numer kopii zapasowej n na n + 1
  • skopiuj kopię zapasową n - 1 na n
  • ...
  • skopiuj kopię zapasową 0 do kopii zapasowej 1
  • zaktualizuj kopię zapasową 0 dowolnymi zmienionymi plikami.

Nowa kopia zapasowa nie zajmie dodatkowego miejsca poza wprowadzonymi zmianami, ponieważ wszystkie przyrostowe kopie zapasowe będą wskazywać ten sam zestaw i-węzłów dla plików, które nie uległy zmianie.


6

Hard link vs Soft link

Hard link Vs Soft link można łatwo wyjaśnić za pomocą tego obrazu.


5
Wydaje mi się, że twoje zdjęcie z miękkim linkiem jest nieprawidłowe. Punkt: i-węzeł miękkiego łącza nie powinien wskazywać i-węzła oryginalnego pliku. Ponieważ jeśli zmienisz nazwę oryginalnego pliku, powiązany miękki link nie działa
percy507 10.01.2018

@ percy507 tak, masz rację - ale nadal uważam to za bardzo miłe i intuicyjne wyjaśnienie. Wyobraź sobie, że nie ma strzałki między i-węzłami ...
Michael Litvin,

5

Dodaję pytanie Nicka: kiedy twarde linki są przydatne lub konieczne? Jedyną aplikacją, która przychodzi mi na myśl, w której dowiązania symboliczne nie zadziałają, jest udostępnienie kopii pliku systemowego w środowisku chroot.


System rozproszony z punktami montowania w różnych miejscach na różnych systemach. Oczywiście można to zaprojektować poza systemem, zachowując spójność.
terson

Myślę, że @Tanktalus dał świetny przykład.
Nick Stinemon,

4

Z MSDN ,

Link symboliczny

Dowiązanie symboliczne to obiekt systemu plików, który wskazuje na inny obiekt systemu plików. Wskazany obiekt nazywa się celem.

Linki symboliczne są przezroczyste dla użytkowników; łącza wyglądają jak zwykłe pliki lub katalogi i mogą być przetwarzane przez użytkownika lub aplikację w dokładnie taki sam sposób.

Dowiązania symboliczne zostały zaprojektowane w celu ułatwienia migracji i zgodności aplikacji z systemami operacyjnymi UNIX. Microsoft zaimplementował swoje dowiązania symboliczne, aby działały podobnie jak łącza UNIX.

Łącza symboliczne mogą być łączami bezwzględnymi lub względnymi. Łącza bezwzględne to łącza, które określają każdą część nazwy ścieżki; linki względne są określane w odniesieniu do miejsca, w którym specyfikatory łącza względnego znajdują się na określonej ścieżce

Przykład bezwzględnego łącza symbolicznego

X: "C:\alpha\beta\absLink\gamma\file"
Link: "absLink" maps to "\\machineB\share"
Modified Path: "\\machineB\share\gamma\file"

Przykład względnych dowiązań symbolicznych

X: C:\alpha\beta\link\gamma\file
Link: "link" maps to "..\..\theta"
Modified Path: "C:\alpha\beta\..\..\theta\gamma\file"
Final Path: "C:\theta\gamma\file"

Twardy link

Twrdym jest przedstawienie systemu plików z pliku, w którym więcej niż jedna ścieżka odwołuje się do pojedynczego pliku w tej samej objętości .

Aby utworzyć twardy link w systemie Windows, przejdź do miejsca, w którym link ma zostać utworzony, i wprowadź następujące polecenie:

mklink /H Link_name target_path

Pamiętaj, że możesz usunąć twarde linki w dowolnym porządku, niezależnie od kolejności, w jakiej zostały utworzone. Nie można również tworzyć twardych łączy

  • referencje znajdują się na różnych dyskach lokalnych
  • odniesienia obejmują dysk sieciowy. Innymi słowy, jednym z odniesień jest dysk sieciowy
  • twardy link do utworzenia znajduje się na tej samej ścieżce co cel

Węzeł

NTFS obsługuje inny typ łącza o nazwie junction. MSDN definiuje to w następujący sposób:

Złącze (zwane także łączem miękkim) różni się od łącza twardego tym, że obiekty pamięci, do których się odwołuje, są oddzielnymi katalogami, a złącze może łączyć katalogi znajdujące się w różnych woluminach lokalnych na tym samym komputerze . W przeciwnym razie skrzyżowania działają identycznie jak twarde łącza.

Pogrubione części w części z twardym ogniwem i części łączącej pokazują podstawową różnicę między nimi.

Polecenie utworzenia skrzyżowania w systemie Windows, przejdź do miejsca, w którym ma zostać utworzony link, a następnie wprowadź:

mklink /J link_name target_path

3

Również:

  1. Wydajność odczytu twardych linków jest lepsza niż linków symbolicznych (mikro-wydajność)
  2. Dowiązania symboliczne można kopiować, kontrolować wersję itp. Innymi słowy, są one rzeczywistym plikiem. Z drugiej strony, twardy link jest czymś na nieco niższym poziomie, a przekonasz się, że w porównaniu do linków symbolicznych jest mniej narzędzi, które zapewniają środki do pracy z twardymi linkami jako twardymi linkami, a nie jak zwykłymi plikami

3

Po prostu, Hard link: to po prostu dodać nową nazwę do pliku, to znaczy, plik może mieć wiele nazw w tym samym czasie, wszystkie nazwy są sobie równe, nikt nie preferuje, Hard link nie oznacza kopiowania całej zawartości pliku i stwórz nowy plik, to nie jest to, po prostu stwórz alternatywną nazwę, która będzie znana

Dowiązanie symboliczne (dowiązanie symboliczne): jest wskaźnikiem pliku do innego pliku, jeśli dowiązanie symboliczne wskazuje na istniejący plik, który jest później usuwany, dowiązanie symboliczne nadal wskazuje tę samą nazwę pliku, nawet jeśli nazwa nie nazywa już żadnego pliku.


3

To, co myślisz o zwykłym „pliku”, to tak naprawdę dwie osobne rzeczy: dane pliku i pozycja katalogu. Kiedy tworzysz twarde łącze do pliku, faktycznie tworzysz drugą pozycję katalogu, która odnosi się do tych samych danych. Oba wpisy katalogu mają dokładnie taką samą funkcjonalność; każdy z nich może zostać użyty do otwarcia pliku w celu jego odczytania. Więc tak naprawdę nie masz „pliku plus twardego łącza”, masz „dane pliku z dwoma pozycjami katalogu”. To, co uważasz za usunięcie pliku, w rzeczywistości usuwa pozycję katalogu, a kiedy ostatni wpis katalogu dla danych jest usuwany, to same dane również są usuwane. W przypadku zwykłych plików, które mają tylko jedną pozycję katalogu, usunięcie pozycji katalogu spowoduje usunięcie danych jak zawsze. (Podczas otwierania pliku system operacyjny tworzy tymczasowy link do pliku,

Na przykład utwórz plik A.txt, twardy link B.txt i usuń A.txt. Podczas tworzenia A.txt utworzono niektóre dane i pozycję katalogu A.txt. Podczas tworzenia twardego łącza utworzono kolejną pozycję katalogu B.txt, wskazującą dokładnie te same dane. Po usunięciu A.txt nadal masz wszystkie dane i jedną pozycję katalogu B.txt, dokładnie tak, jakbyś utworzył najpierw plik B.txt.

Miękki link jest po prostu (prawie) zwykłym plikiem, z tym wyjątkiem, że nie zawiera danych, ale ścieżkę innego wpisu katalogu. Jeśli usuniesz plik, do którego odwołuje się miękki link, wówczas miękki link będzie zawierał ścieżkę, która nie wskazuje już pozycji katalogu; to jest złamane. Usunięcie miękkiego linku przypomina usunięcie dowolnego innego pliku, plik, na który wskazuje, pozostaje nienaruszony.


2

Wpis w katalogu to link a structrue:

struct dentry{
    ino_t ino;
    char  name[256];
}

ino to liczba i-węzłów, nazwa to nazwa pliku, struktura i-węzłów może jak :

struct inode{
      link_t nlink; 
      ...
}

na przykład tworzysz plik / 1, pozycja katalogu może wyglądać tak:

struct dentry{
     ino_t ino; /* such as 15 */
     char  name[256]; /* "1" */
} 

struktura i-węzła może jak:

   struct inode{ /* inode number 15 */
         link_t nlink; /* nlink = 1 */
         ...
    }

następnie tworzysz twardy link (może być / 100), wpis katalogu może wyglądać tak:

  struct dentry{
     ino_t ino; /* 15 */
     char  name[256]; /* 100 */
  }

struktura i-węzła może jak:

   struct inode{ /* inode numebr 15 */
         link_t nlink; /* nlink = 2 */
         ...
    }

następnie tworzysz dowiązanie symboliczne (może być / 200) do pliku 1, pozycja katalogu może wyglądać tak:

  struct dentry{
        ino_t ino; /* such as 16 */
        char  name[256]; /* "200" */
  }

struktura i-węzła może jak:

   struct inode{ /* inode number 15 */ 
         link_t nlink; /* nlink = 2 */
         ...
    }

   struct inode{ /* inode number 16 */
         link_t nlink; /* nlink = 1 */
         ...
    } /* the data of inode 16 maybe /1 or 1 */

2

Dodając do wszystkich powyższych odpowiedzi, różnicę w znalezieniu pliku dowiązania twardego i dowiązania miękkiego można zrozumieć w następujący sposób:

Mam plik f6w bieżącym katalogu, a także katalog o nazwie t2.

Plik o nazwie f1i ./t2/f2jest dowiązaniem symbolicznym f6.

Plik o nazwie f7i ./t2/f8są twardymi linkami f6.

Aby znaleźć zarówno miękki, jak i twardy link, możemy użyć:

$ find -L . -samefile f6 

> ./f1
> ./f6
> ./f7
> ./t2/f2
> ./t2/f8

Aby znaleźć tylko hardlink, możemy użyć:

$ find . -xdev -samefile f6

> ./f6
> ./f7
> ./t2/f8

Ponieważ dowiązania twarde można tworzyć w tym samym systemie plików, możemy wyszukiwać wszystkie dowiązania twarde bez -Lopcji użytej (z -xdevopcją) w tym samym systemie plików / punkcie instalacji. Zapisuje niepotrzebne wyszukiwanie w różnych punktach montażu.

Tak więc wyszukiwanie twardego linku jest nieco szybsze niż wyszukiwanie miękkich linków (proszę poprawić, jeśli się mylę lub nie wyczyszczę).


1

Łącza symboliczne nadają plikowi inną nazwę, podobnie jak łącza twarde. Ale plik można usunąć, nawet jeśli pozostaną dowiązania symboliczne.


Nie. Dowiązanie symboliczne nie jest „inną nazwą dla tego samego pliku”, jest to plik sam w sobie, prowadzący do pliku docelowego.
Kusalananda,

1

Moje dwa centy za użytkowanie:

Miękkie linki mogą być używane do skracania długich nazw ścieżek, tj .:

ln -s /long/folder/name/on/long/path/file.txt /short/file.txt

Wprowadzone zmiany /short/file.txtzostaną zastosowane w oryginalnym pliku.

Twarde linki mogą być używane do przenoszenia dużych plików:

$ ls -lh /myapp/dev/
total 10G
-rw-r--r-- 2 root root 10G May 22 12:09 application.bin

ln /myapp/dev/application.bin /myapp/prd/application.bin

Natychmiastowa kopia do innego folderu, a oryginalny plik (włączony /myapp/dev) może zostać przeniesiony lub usunięty bez dotykania pliku/myapp/prd


0

Właśnie znalazłem prosty sposób na zrozumienie twardych linków w typowym scenariuszu instalacji oprogramowania.

Pewnego dnia pobrałem oprogramowanie do folderu w Downloadscelu instalacji. Po tym sudo make install, niektóre pliki wykonywalne zostały cpedytowane do lokalnego folderu bin. Tutaj cptworzy twardy link . Byłem zadowolony z oprogramowania, ale wkrótce zdałem sobie sprawę, że Downloadsnie jest to dobre miejsce na dłuższą metę. Więc mvedytowałem folder oprogramowania do sourcekatalogu. Cóż, nadal mogę uruchamiać oprogramowanie jak wcześniej, nie martwiąc się o żadne docelowe łącza, np. W systemie Windows. Oznacza to, że twardy link znajduje bezpośrednio i-węzeł i inne pliki w pobliżu.


0

W tej odpowiedzi, kiedy mówię plik, mam na myśli lokalizację w pamięci

Wszystkie zapisane dane są przechowywane w pamięci za pomocą struktury danych zwanej i-węzłami. Każdy i-węzeł ma numer inod. Numer i-węzła służy do uzyskania dostępu do i-węzła. Wszystkie twarde łącza do pliku mogą mieć różne nazwy, ale mają ten sam numer i-węzła. Ponieważ wszystkie dowiązania twarde mają ten sam numer inod (który powoduje dostęp do tego samego i-węzła), wszystkie wskazują na tę samą pamięć fizyczną.

Link symboliczny jest szczególnym rodzajem pliku, ponieważ jest to również plik, który będzie miał nazwę pliku i numer i-węzła. Jak wspomniano powyżej, numer i-węzła uzyskuje dostęp do i-węzła wskazującego na dane. numery węzłów w symbolicznych linkach uzyskują dostęp do tych i-węzłów, które wskazują na „ścieżkę” do innego pliku, a dokładniej numer i-węzła w dowiązaniu symbolicznym ma dostęp do tych i-węzłów, które wskazują na inne łącze twarde.

kiedy przenosimy, kopiujemy, usuwamy plik w GUI, bawimy się twardymi dowiązaniami pliku, a nie pamięcią fizyczną. kiedy usuwamy plik, usuwamy dowiązanie stałe pliku. nie usuwamy pamięci fizycznej. Jeśli wszystkie twarde linki do pliku zostaną usunięte, dostęp do przechowywanych danych nie będzie możliwy, chociaż nadal może znajdować się w pamięci

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.