Kompleksowa obsługa informatyczna

            Nowoczesne rozwiązania serwerowe

Hardlinki i symlinki - czym są i czym się różnią?

Poradniki

Wstęp

Skoro trafiłeś na tą stronę pewnie słyszałeś już pojęcia hardlinki (dowiązania twarde) oraz symlinki (dowiązania symboliczne), ale nie do końca rozumiesz różnicę między nimi. Postaramy się przedtsawić ci ten temat w przystępny sposób

Czym jest dowiązanie twarde (hardlink)?

Wyobraźmy sobie sytuację tworzenia pliku na dysku (nie ma przy tym znaczenia czy plik jest kopiowany z sieci, zewnetrznego nośnika czy też innego źródła, czy może tworzony przez pewien proces lokalny). Proces ten można z grubsza podzielić na 2 kroki:

  • dane wewnętrzne pliku umieszczane są fizycznie na dysku (lub innym nośniku)
  • tworzone jest dowiązanie widoczne dla użytkownika

Wspomniane dowiązanie to jest niczym innym, jak nazwą pliku, którą możesz umieścić w dowolnym katalogu. Pewnie nie raz zauważyłeś, że o ile kopiowanie dużego pliku między dwoma katalogami zajmuje trochę czasu, to przeniesienie tego samego pliku z jednego katalogu do innego (w obrębie jednej partycji) jest natychmiastowe. Dlaczego? Właśnie z tego powodu, że przenosząc plik nie przenosisz jego zawartości, która tak naprawdę pozostaje fizycznie w niezmiennym miejscu na dysku. Przenosisz jedynie jego dowiązanie.

Skoro już wiemy czym jest dowiązanie, zastanówmy się czy możliwe byłoby stworzenie dwóch różnych dowiązań do tego samego pliku. Okazuje się, że wszystkie systemy plików dostępne w linuksie na to pozwalają. Co więcej - każdy z plików istniejących na dysku ma 'licznik dowiązań'. Po stworzeniu pliku jest on ustawiany na 1 (gdyż automatycznie tworzymy jego nazwę, a więc pierwsze dowiązanie). W momencie stworzenia hardlinka, licznik się zwiększa i wskazuje liczbę 2. W momencie usunięcia któregokolwiek z dowiązań, licznik spowrotem przyjmie wartość 1, jednak dane pozostaną na dysku dopóty, dopóki licznik jest większy od 0.

Jeżeli jeszcze masz pewne wątpliwości, przeanalizuj poniższe komendy:

$ echo "to jest plik testowy" > test1
$ cat test1
to jest plik testowy

$ ln test1 test2
$ cat test2
to jest plik testowy

$ rm test1
$ cat test2
to jest plik testowy

$ ln test2 test3
$ cat test3
to jest plik testowy

$ echo "dodajemy jedna linie do test2" >> test2
$ cat test3
to jest plik testowy
dodajemy jedna linie do test2

W liniach 1-9 widzimy, że po utworzeniu hardlinka możemy skasować oryginalny plik, a nasze dane pozostają dostępne, tylko pod inną nazwą. Jest to działanie dokładnie równoznaczne z komendą mv test1 test2.

W linii 10 tworzymy kolejne dowiązanie, a następnie dodajemy jedną linijkę do pliku test2. Niżej widzimy, że pojawiła się ona również w pliku test3. Jest to zgodne z oczekiwaniami, gdyż nazwy test2 i test3 są dwoma dowiązaniami (inaczje mówiąc: dwoma nazwami) tego samego pliku.

Czym są dowiązania symboliczne (symlinki)

Jeżeli zrozumiałeś istotę hardlinków nie będziesz miał problemów ze zrozumieniem dowiązań symbolicznych. W przeciwieństwie do dowiązań twardych, w momencie tworzenia symlinka licznik dowiązań w pliku nie jest zwiększany. Dla systemu plików oznacza to, że plik istnieje tylko pod jedną nazwą i wykasowanie tej nazwy oznacza również wykasowanie zawartości pliku. Dowiązanie symboliczne można rozumieć jako drogowskaz mowiący 'jeśli chcesz uzyskać dostęp do pliku X powinieneś udać się w tamto miejsce'. Przeanalizujmy poniższe komendy:

$ echo "to jest plik testowy" > test1
$ cat test1
to jest plik testowy

$ ln -s test1 test2
$ cat test2
to jest plik testowy

$ echo "dodajemy jedna linie do test2" >> test2
$ cat test1
to jest plik testowy
dodajemy jedna linie do test2

$ rm test1
$ cat test2
cat: test2: No such file or directory

$ ls -l test2
lrwxrwxrwx 1 mkay users 5 10-27 21:24 test2 -> test1

$ readlink test2
test1

W liniach 1-10 dowiązanie zachowyje sie identycznie jak hardlink. Posiadamy dwie nazwy na ten sam plik, a więc dodanie dodatkowej linii w do test2 powoduje również dodanie jej do pliku test1.

W linii 11 plik test1 jest kasowany, a co za tym idzie tracimy bezpowrotnie dostęp do danych. Kolejne linie (ls i readlink) pokazują wprawdzie, że test2 wciąż istnieje, jednak wskazuje on na test1, którego nie ma już w systemie. Pozostał nam więc drogowskaz wskazujący donikąd.

Podsumowanie

Powinieneś zapamiętać 3 podstawowe różnice między dwoma typami dowiązań:
  • jeżeli tworzysz hardlinka zwiększa się ilość dowiązań do pliku w systemie plików, a co za tym idzie możesz bezpiecznie wykasować oryginał i wciąż masz dostęp do danych
  • nie możesz utworzyć hardlinka do pliku znajdującego się na innej partycji (jeśli zastanowisz się nad istotą dowiązań twardych, zrozumiesz dlaczego); nie ma natomiast takich przeciwskazań w przypadku symlinków
  • nie możesz utworzyć hardlinka do katalogu (a symlinka tak)