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!