Dowiązania symboliczne w systemie Linux stanowią niezwykle użyteczną funkcję, ale mogą czasami stać się nieaktualne i bezużyteczne. W tym artykule przedstawimy, jak zidentyfikować uszkodzone dowiązania symboliczne, przeanalizować je oraz usunąć, jeśli zajdzie taka potrzeba.
Podstawy dowiązań symbolicznych
Dowiązania symboliczne, znane również jako „miękkie linki”, są rodzajem skrótów, które wskazują na pliki lub katalogi. W menedżerze plików wyglądają jak standardowe pliki lub katalogi, a w terminalu pojawiają się jako wpisy w liście plików. Plik lub katalog, do którego prowadzi dowiązanie symboliczne, może być zlokalizowany w dowolnym miejscu w hierarchii systemu plików.
Na przykład, jeśli w swoim katalogu domowym masz dowiązanie symboliczne nazwane „dave-link”, które kieruje do pliku „plik-tekstowy.txt” umieszczonego w innej lokalizacji, wszystkie polecenia wykonywane na tym dowiązaniu będą stosowane do wskazywanego pliku. Używając poleceń takich jak cat czy less, zobaczysz zawartość pliku „plik-tekstowy.txt”.
Standardowa instalacja systemu Linux zawiera wiele dowiązań symbolicznych. Nawet jeśli nie utworzysz ich samodzielnie, wiele aplikacji korzysta z tej funkcji. Instalatory często tworzą dowiązania symboliczne, aby wskazać pliki wykonywalne. Gdy oprogramowanie jest aktualizowane, oryginalny plik binarny zostaje zastąpiony nową wersją, a dowiązania symboliczne w dalszym ciągu działają, pod warunkiem, że nazwa nowego pliku jest taka sama jak w przypadku starego.
Aby zobaczyć niektóre z tych dowiązań symbolicznych, możemy użyć polecenia ls w katalogu głównym. Wiele z tych wpisów jest wyświetlanych w różnych kolorach – na przykład w systemie Ubuntu 20.10 są one zaznaczone na jasnoniebiesko.
Wprowadzamy polecenie:
ls /
Aby uzyskać bardziej szczegółowy widok, możemy dodać opcję -l (długa lista). Wprowadzamy następujące polecenie, aby przejrzeć wszystkie wpisy „lib” oraz pojedynczy wpis „bin”:
ls -l /lib* /bin
Każda linia rozpoczyna się od litery „l”, co oznacza, że dany element jest dowiązaniem symbolicznym. Tekst po „->” pokazuje, na co wskazuje dowiązanie. W naszym przypadku celem są wszystkie katalogi.
Uprawnienia są przedstawione jako odczyt, zapis i wykonywanie dla właściciela, grupy oraz innych użytkowników. To są domyślne, fałszywe wpisy, które nie odzwierciedlają rzeczywistych uprawnień do obiektów, do których prowadzą dowiązania symboliczne. Rzeczywiste uprawnienia do pliku lub katalogu mają pierwszeństwo i są respektowane przez system plików.
Problemy z dowiązaniami symbolicznymi
Dowiązanie symboliczne staje się uszkodzone (lub „wiszące”), gdy plik, na który wskazuje, zostaje usunięty lub przeniesiony. Jeśli proces dezinstalacji aplikacji przebiega nieprawidłowo lub zostaje przerwany, mogą pozostać uszkodzone dowiązania symboliczne.
W przypadku, gdy ktoś ręcznie usunie plik, nie zdając sobie sprawy, że jest on wskazywany przez dowiązanie symboliczne, to dowiązanie przestaje działać. Można to przyrównać do znaków drogowych wskazujących na zburzone miasto.
Możemy łatwo zaobserwować ten problem, używając dowiązania symbolicznego o nazwie „hello” w bieżącym katalogu. Wprowadzamy polecenie:
ls -l
To dowiązanie wskazuje na program o nazwie „htg” w katalogu „bin”. Uruchamiając dowiązanie symboliczne, wykonujemy program:
./hello
Następnie możemy również sprawdzić działanie programu, uruchamiając go bezpośrednio:
../bin/htg
Poniżej uzyskujemy tę samą odpowiedź. Usuwamy teraz plik programu:
rm ../bin/htg
Gdy teraz spojrzymy na dowiązanie symboliczne, zauważamy, że jest wyświetlane na czerwono, ponieważ system Linux rozpoznaje, że jest ono uszkodzone. Informuje nas również, na co wskazywało, co pozwala nam na zastąpienie pliku, ponowną kompilację programu lub naprawienie dowiązania symbolicznego w inny sposób.
Warto zauważyć, że jeśli spróbujemy uruchomić dowiązanie symboliczne, komunikat o błędzie wskazuje na nazwę dowiązania, a nie na nazwę programu, do którego prowadzi.
Wprowadzamy:
./hello
Jak znaleźć uszkodzone dowiązania symboliczne
Wiele nowoczesnych wersji polecenia find posiada opcję xtype (typ rozszerzony), co umożliwia łatwe znajdowanie uszkodzonych dowiązań symbolicznych. Użyjemy flagi l z xtype, aby polecić mu wyszukiwanie linków. Wykonanie polecenia find z xtype w następujący sposób, bez dodatkowych opcji, wymusza zwrócenie uszkodzonych dowiązań:
find . -xtype l
Uruchomienie tego polecenia w naszym katalogu domowym pozwala na znalezienie kilku uszkodzonych dowiązań symbolicznych. Warto zauważyć, że domyślnie wyszukiwanie jest rekurencyjne, co oznacza, że przeszukuje wszystkie podkatalogi.
Jak się spodziewaliśmy, w wynikach znajdziemy dowiązanie symboliczne „hello”, które celowo usunęliśmy. Jedno z pozostałych dowiązań jest związane z przeglądarką Firefox, a inne są powiązane z różnymi programami.
Aby policzyć uszkodzone dowiązania symboliczne, możemy przekazać wynik do polecenia wc z opcją -l (linie), co pozwoli nam zliczyć linie.
Wprowadzamy:
find . -xtype l | wc -l
Otrzymujemy informację, że mamy 24 uszkodzone dowiązania symboliczne, które nie prowadzą do żadnego pliku.
Przeglądaj, a następnie usuwaj
Zanim zdecydujesz się na usunięcie wszystkich uszkodzonych dowiązań symbolicznych, warto dokładnie przejrzeć wyniki polecenia find. Sprawdź, czy istnieje ważny powód, dla którego niektóre z tych dowiązań są uszkodzone.
Czasami problem może tkwić w samym dowiązaniu symbolicznym, a nie w pliku docelowym. Jeśli dowiązanie zostało utworzone w sposób nieprawidłowy, może nie wskazywać na nic, mimo że docelowy plik jest obecny. W takim przypadku można rozwiązać problem, ponownie tworząc dowiązanie symboliczne.
Możliwe jest również, że dowiązanie symboliczne, które wydaje się uszkodzone, pełni inną funkcję, na przykład jako wskaźnik blokady pliku. Taką funkcję może mieć dowiązanie związane z przeglądarką Firefox, które znajduje się na naszej liście. Jeśli jednak Firefox nie jest używany na naszym systemie testowym, możemy je bezpiecznie usunąć.
Warto również pamiętać, że cel dowiązania symbolicznego może być obecny tylko okresowo, co jest oczekiwanym zachowaniem niektórych programów. Na przykład plik docelowy może być kopiowany z innej maszyny lub chmury, spełniając swoją rolę i następnie usuwany, by w kolejnych cyklach zostać zastąpionym nowym plikiem.
Uszkodzone dowiązanie symboliczne może również wskazywać na nieudane zainstalowanie oprogramowania. W takim przypadku, zamiast je usuwać, warto spróbować naprawić je ręcznie lub ponownie przeprowadzić instalację.
Po naprawieniu dowiązań, które zamierzamy zachować, powtórz polecenie, aby sprawdzić, czy uszkodzone dowiązania zostały usunięte z wyników wyszukiwania.
Ze względów bezpieczeństwa najlepiej ograniczyć usuwanie dowiązań symbolicznych do własnych katalogów. Zachowaj ostrożność podczas wykonywania tych poleceń jako root lub w katalogach systemowych.
Usuwanie uszkodzonych dowiązań symbolicznych
Opcja -exec (wykonaj) w poleceniu find pozwala uruchomić polecenia na wynikach wyszukiwania. Zamierzamy użyć rm, aby usunąć każde uszkodzone dowiązanie symboliczne. Symbol {} zostanie zastąpiony nazwą każdego uszkodzonego dowiązania, gdy będzie ono wykrywane przez find.
Musimy zakończyć polecenie -exec za pomocą średnika (;). Używamy odwrotnego ukośnika (\), aby „uciec” przed średnikiem, aby był on traktowany jako część polecenia find, a nie jako coś, co Bash ma przetworzyć.
Wprowadzamy:
find . -xtype l -exec rm {} ;
Po wykonaniu polecenia wracamy do wiersza poleceń, nie widząc żadnych komunikatów o błędach. Aby upewnić się, że uszkodzone dowiązania zostały usunięte, powtarzamy polecenie ich wyszukiwania:
find . -xtype l
Brak wyników potwierdza, że wszystkie uszkodzone dowiązania zostały skutecznie usunięte.
Pamiętaj o dokładnym przeglądzie
Zawsze należy poświęcić chwilę na przeglądanie listy dowiązań symbolicznych przed ich usunięciem. Dzięki temu można uniknąć przypadkowego usunięcia dowiązań, co do których nie jesteśmy pewni. Można to osiągnąć, uruchamiając polecenie usunięcia w odpowiednich katalogach.
Na przykład moglibyśmy wykonać polecenie w katalogu „.snap”, a następnie ręcznie usunąć konkretne dowiązanie symboliczne „hello”, pozostawiając nietknięte inne, jak dowiązanie blokady przeglądarki Firefox.