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.
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.
Odpowiedzi:
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.
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 foo
zostanie usunięty, foo-hard
nadal zawiera zawartość; jeśli bar
zostanie usunięty, bar-soft
jest tylko linkiem do nieistniejącego pliku.
touch blah1; touch blah2
można skrócić dotouch blah1 blah2
Jak mówi przysłowie, obraz jest wart tysiąca słów. Oto jak to wizualizuję:
Oto, w jaki sposób przechodzimy do tego zdjęcia:
Utwórz nazwę myfile.txt
w 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
Utwórz twardy link my-hard-link
do pliku myfile.txt
, co oznacza „utwórz plik, który powinien wskazywać ten sam i-węzeł, który myfile.txt
wskazuje”:
$ ln myfile.txt my-hard-link
Utwórz miękki link my-soft-link
do 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.txt
zostanie usunięty (lub przeniesiony): my-hard-link
nadal wskazuje na tę samą treść, a zatem pozostaje nienaruszony, a my-soft-link
teraz wskazuje na nic. Inne odpowiedzi omawiają zalety / wady każdego z nich.
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
)
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.
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 link
danych wyjściowych zobaczysz pierwszą literę lrwxrwxrwx
jako 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:
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:
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.
Łą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.
Chciałbym wskazać Ci Wikipedię:
Kilka punktów:
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:
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.
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.
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"
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
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
Również:
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.
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.
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 */
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 f6
w bieżącym katalogu, a także katalog o nazwie t2
.
Plik o nazwie f1
i ./t2/f2
jest dowiązaniem symbolicznym f6
.
Plik o nazwie f7
i ./t2/f8
są 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 -L
opcji użytej (z -xdev
opcją) 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ę).
Łącza symboliczne nadają plikowi inną nazwę, podobnie jak łącza twarde. Ale plik można usunąć, nawet jeśli pozostaną dowiązania symboliczne.
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.txt
zostaną 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
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 Downloads
celu instalacji. Po tym sudo make install
, niektóre pliki wykonywalne zostały cp
edytowane do lokalnego folderu bin. Tutaj cp
tworzy twardy link . Byłem zadowolony z oprogramowania, ale wkrótce zdałem sobie sprawę, że Downloads
nie jest to dobre miejsce na dłuższą metę. Więc mv
edytowałem folder oprogramowania do source
katalogu. 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.
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