Dowiązania twarde (hard links) i symboliczne (symbolic/soft links)

Wstęp

W systemie Linux istnieją dwa rodzaje linków/dowiązań do plików: twarde (hard links) i symboliczne (symbolic links lub soft links)

Dowiązanie twarde (hard link) - jest to po prostu alternatywna nazwa pliku, która wskazuje na te same dane na dysku twardym. W praktyce wszystkie twarde linki do jednego pliku mają tę samą wagę, ponieważ każdy z nich wskazuje na dokładnie te same bloki danych.

Dowiązanie symboliczne (symbolic link lub soft link) - to osobny plik, który zawiera ścieżkę do pliku lub katalogu, do którego dowiązanie (symbolic link) się odnosi. Jest bardziej elastyczny niż twardy link, ale zależy od istnienia oryginalnego pliku.

Jeśli powyższe wyjaśnienia wydają się niejasne wypróbuj poniższe polecenia.

Przykłady

Dowiązania twarde/Hard links

Na początek utwórzmy plik testowy test1.txt, zawierający tekst "abc":

echo abc >  test1.txt

Aby utworzyć twardy link o nazwie test2.txt należy wydać polecenie:

ln test1.txt   test2.txt

Plik nie został skopiowany, a jedynie uzyskał nową nazwę wskazującą ten sam obszar w pamięci. Teraz obie nazwy są równoważne. Usunięcie pierwotnej nazwy nie spowoduje utraty danych, gdyż ciągle istnieje twarde dowiązanie o nazwie test2.txt, wskazujące na te dane.

Usuńmy więc pierwotną nazwę test1.txt

rm test1.txt

Używając polecenia cat wyświetlimy dane z pliku test2.txt:

cat test2.txt

Rezultatem jest oczywiście tekst "abc". Aby dowiedzieć się, ile dowiązań twardych posiada dany plik możesz na jednej z jego nazw wydać polecenie ls -l 

ls -l test1.txt

Rezultat:

-rw-r--r-- 2 runner21 runner21   4 Jan 14 12:46 test1.txt

Liczba 2 wskazuje, że istnieją dwa twarde dowiązania. Oczywiście mogą być utworzone w różnych miejscach. Aby znaleźć wszystkie miejsca należy wydać polecenie na jednej z nazw (bez różnicy czy to test1.txt czy test2.txt):

find  /  -samefile  test1.txt

gdzie / to punkt początkowy poszukiwań (główny katalog). Można dostosować tę ścieżkę, aby zawęzić obszar poszukiwań, np. do latalogu /home:

find /home -samefile test1.txt

Jako rezultat otrzymamy wszystkie ścieżki określające ten sam plik.

Dowiązania symboliczne/Symbolic links

Utwórzmy plik testowy test1.txt, zawierający tekst "abc":

echo abc >  test1.txt

Aby utworzyć dowiązanie/link symboliczny należy wydać polecenie:

ln -s test1.txt  test2.txt

Od teraz test2.txt wskazuje na test1.txt, jednak oba pliki nie są równoważne. Plik test2.txt stanowi jedynie symboliczne wskazanie, co widoczne jest gdy wykonamy polecenie ls:

ls -l test2.txt

Jako rezultat otrzymujemy:

-rw-r--r-- 1 runner1 runner1 4 Jan 14 12:46 test2.txt -> test1.txt

Liczba określająca dowiązania twarde nie uległa zmianie, natomiast otrzymaliśmy jawne wskazanie określające na jaki plik wskazuje nazwa test2.txt

Uwaga: usunięcie pliku test1.txt spowoduje utratę danych!

Jeśli zatem usuniemy test1.txt:

rm test1.txt

to dowiązanie symboliczne test2.txt nadal będzie istnieć, jednak wskazywać będzie na nieistniejący plik

cat test2.txt

w wyniku czego otrzymamy komunikat:

cat: test2.txt: No such file or directory

Co ciekawsze, jeśli teraz utworzymy plik test1.txt o innej zawartości, ale tej samej lokalizacji:

echo cde > test1.txt

to test2.txt będzie od teraz na niego wskazywał (dowiązanie symboliczne nie uległo zmianie):

cat test2.txt

Rezultatem jest tekst "cde".

Jeśli chcemy znaleźć wszystkie dowiązania symboliczne pliku test1.txt musimy wydać polecenie:

find  /  -type  l  -name test1.txt

gdzie / to punkt początkowy poszukiwań (główny katalog), natomiast l określa poszukiwania linku symbolicznego. Można dostosować tę ścieżkę, aby zawęzić obszar poszukiwań, np. do latalogu /home:

find /home  -type l  -name test1.txt


Podsumowanie

Warto zauważyć, że:

  • dowiązania twarde (hard links) mogą wskazywać jedynie na inny plik, natomiast dowiązania symboliczne (symbolic links) mogą wskazywać na pliki lub katalogi
  • linki twarde mogą wskazywać na ten sam plik na tym samym systemie plików, natomiast linki symboliczne mogą wskazywać na pliki i katalogi, które znajdują się na innych systemach plików, partycjach lub nawet zdalnych lokalizacjach!


Powodzenia!

#buymeacoffee