Hej, ho, na skróty by się szło!

Każdy użytkownik komputera zna skróty – te, widoczne na pulpicie. Z tym najczęściej kojarzy nam się „skrót” w komputerze. Tym razem jednak chodzi, o mechanizm, który jest czymś zupełnie innym, a w Linuksie jest rozwiązany wręcz genialnie.

Linux po Uniksie przejął ideę skrótów w systemie plików, zwanych z angielska linkami. Pozwalają one umieścić plik „wirtualnie” w kilku miejscach na raz, stworzyć krótszą drogę do katalogu itp. Są one dwóch rodzajów: symboliczne i twarde.

Linki symboliczne

Tworzenie linku symbolicznego

Linki symboliczne, zwane „symlinkami” lub „miękkimi linkami” to zwykłe pliki, które zawierają ścieżkę prowadzącą do określonego pliku lub katalogu.

Mimo że skrót jest zwykłym plikiem, to jednak nie można go stworzyć za pomocą edytora tekstów. Jest do tego odpowiednie polecenie:

ln -s <obiekt docelowy> <nazwa linku>

obiekt docelowy to plik lub katalog, do którego prowadzić będzie link. Jeśli nie podamy nazwy linku, to zostanie utworzony plik o takiej samej nazwie jak obiekt docelowy. Przełącznik -s powoduje utworzenie właśnie symbolicznego linku.

Jeśli tworzymy link w tym samym katalogu, rzecz jasna nie może on mieć takiej samej nazwy jak obiekt docelowy — nie mogą istnieć dwa pliki o tej samej nazwie w tym samym katalogu. Poza tym nazwa linku jest dowolna. Może być taka sama jak obiektu docelowego albo inna. Mechanizm ten jest wykorzystywany do „podpinania” kolejnych wersji bibliotek: na przykład system jest informowany o tym, że jest zainstalowana biblioteka „lib.so”, a tymczasem jest to link do pliku „lib.1.2.3.so”. Aktualizacja biblioteki polega na zaktualizowaniu linku i umieszczeniu w nim ścieżki do pliku o nowszej wersji. W ten sposób można mieć również w systemie kilka wersji jakiegoś oprogramowania i podmieniać je, zmieniając tylko link.

Ciekawym zastosowaniem tego mechanizmu jest „podlinkowanie” obrazka, a następnie wybranie linku jako tapetę na pulpit. Potem można zmieniać tapetę tylko zmieniając link, co doskonale daje się wykorzystać przy tworzeniu skryptów – np. uzależniając tapetę od pory dnia albo ściągając kolejne tapety z serwisów internetowych.

Warto tu zwrócić uwagę na interesującą rzecz: jeśli stworzymy link do jakiegoś katalogu (w tym przypadku może być nawet na innej partycji) i przejdziemy do tego katalogu przy użyciu tego linku, to „wirtualnie” wciąż jesteśmy w miejscu, w którym jest link (a nie na innej partycji). To niby logiczne, ale skróty windowsowe działają na innych zasadach i tam wyjście o poziom wyżej w strukturze przenosi użytkownika w miejsce fizycznego położenia linkowanego katalogu. Można powiedzieć, że w Linuksie link jest dla systemu „przezroczysty”.

Link działa jak prawdziwy katalog

Przy tworzeniu skrótów do katalogów trzeba uważać – jeśli stworzymy połączenie do katalogu wyżej w strukturze, to stworzymy pętlę i nieskończoną ścieżkę.

Tu trzeba zwrócić uwagę na jedną bardzo istotną rzecz: jeśli przy tworzeniu linku podamy ścieżkę względną, to taka właśnie zostanie zapisana w linku. System nie uzupełnia ścieżki. Taki link będzie działał tak długo, jak długo wzajemne położenie linku i pliku docelowego się nie zmieni. Dlatego lepiej jest podawać pełną ścieżkę – link będzie działać niezależnie od miejsca, w którym go umieścimy.

Symlink działa jak zwykły plik

Symlinki działają, nawet jeśli plik docelowy i plik linku są w różnych systemach plików, co – jak zaraz zobaczymy — wcale nie jest takie oczywiste.

Sprawdzanie linku

Linki symboliczne można zobaczyć, używając polecenia ls -l. Przy nazwie linku pojawi się strzałka i ścieżka, do której prowadzi link.

Można też użyć polecenia readlink, które wyświetli lokalizację obiektu docelowego.

Do wyboru mamy jeszcze polecenie file, które poda zarówno ty pliku (link), jak i obiekt docelowy.

Można też odnaleźć wszystkie (lub wybrane) linki poleceniem

find -type l

Linki można sprawdzić na kilka różnych sposobów

Zmiana linku

Zdarza się, że chcemy zmienić dowiązanie linku. Tak będzie z wymienianymi tapetami czy aktualizowanymi bibliotekami. Polecenie ln domyślnie nie pozwala nadpisać linku. W tym celu trzeba dodać przełącznik -f. Oznacza on tyle, co „force delete”. Czyli: jeśli link istnieje to go usuń.

Wymuszenie zaktualizowania linku

Usuwanie linków symbolicznych

Linki symboliczne nie są automatycznie usuwane po usunięciu pliku, do którego prowadzą. Powstaje „zepsuty link”, który prowadzi donikąd. Użytkownik sam musi zadbać o to, by usunąć wszystkie nieaktualne dowiązania.

Aby odnaleźć linki symboliczne można użyć następującego polecenie:

find . -type l -exec test ! -e "{}" \; -print

Odnajduje ono wszystkie linki symboliczne (find -type l), a następnie sprawdza, czy plik istnieje (-exec test ! -e “{}”). Ponieważ link wciąż działa, tyle że prowadzi w próżnię, to wynik testu jest negatywny i nazwa linku zostaje wypisana na ekranie (-print). Zamiast opcji -print można użyć -delete i popsute linki zostaną automatycznie usunięte, ale raczej nie zaleca się tego – lepiej je sobie wyświetlić i usunąć ręcznie, to znacznie bezpieczniejsze.

Można znaleźć wszystkie popsute linki symboliczne

Twarde linki

Innym rodzajem skrótów są tzw. „twarde linki”. Ten mechanizm działa na poziomie systemu plików i może być nieco mylący dla użytkownika. Można to sobie wyobrazić w taki sposób, że plik zajmujący jakieś miejsce na dysku otrzymuje dodatkową nazwę. Link nie jest oddzielnym plikiem, a jakby wskaźnikiem, zawierającym informację o tym, gdzie linkowany plik się znajduje na dysku. Jest to o tyle wygodne, że zajmuje jeszcze mniej miejsca niż linki symboliczne. Mechanizm ten jest wykorzystywany m.in. w systemach backupowych, gdzie zamiast kopiowania identycznych plików, tworzone są właśnie twarde linki, co pozwala zaoszczędzić miejsce.

Istnieją jednak ograniczenia:

– link i docelowy plik muszą być w tym samym systemie plików (co praktycznie sprowadza się do tego, że na tej samej partycji dyskowej),

– twardy link nie może prowadzić do katalogu. Można linkować tylko pliki. Co prawda można wymusić link do katalogu (z prawami roota), ale jest to niebezpieczne – skasowanie docelowego katalogu może spowodować problemy z systemem plików.

Tworzenie twardych linków

Twardy link jest tworzony analogicznie jak symboliczny, tylko nie dodaje się przełącznika -s:

ln <obiekt docelowy> <nazwa linku>

Sprawdzanie twardych linków

Twardy link jest widoczny jako regularny plik, polecenia file i ls nie widzą różnicy między plikiem a linkiem do niego. Można natomiast odnaleźć linki prowadzące do danego pliku – za pomocą polecenia find -samefile. Ponieważ wszystkie linki są różnymi nazwami tego samego pliku to czy poda się nazwę docelowego pliku, czy któregoś linku do niego – nie ma to znaczenia, wszystkie zostaną odnalezione.

Zepsute twarde linki

Podobnie jak symlinki tak i te twarde można popsuć, usuwając obiekt docelowy. Niestety, w tym przypadku sytuacja jest nieco bardziej skomplikowana i może prowadzić do niespójności danych. Popsuty symlink po prostu prowadził w próżnię, można go było łatwo zlokalizować i usunąć. W przypadku twardych linków jest inaczej. Dopóki plik jest modyfikowany – wszystko jest OK i linki działają bez problemów. Jednak niektóre programy tworzą kopię roboczą pliku, modyfikują ją, a następnie nadpisują plik. „Nadpisanie” odbywa się przez zmianę nazwy pliku roboczego na źródłowy – w efekcie dane lądują w innym miejscu na dysku. Połączenie zostaje zerwane i twardy link prowadzi… do niezmodyfikowanego pliku źródłowego. Mamy dwa pliki, które się między sobą różnią i – jeśli jest to wynik jakiegoś automatu, a nie świadomego działania użytkownika – problem, bo nie wiemy, który z nich jest właściwy.

Usuwanie twardych linków

Dla systemu operacyjnego każda nazwa jest oddzielnym plikiem. Dane będą istniały tak długo, jak długo będzie istniała choć jedna nazwa. Dlatego, aby usunąć plik, do którego zostały utworzone jakieś twarde linki, trzeba usunąć je wszystkie.

Podsumowanie

Linki to niezwykle przydatny mechanizm, pozwalający na wygodne operowanie plikami, tworzenie krótszych ścieżek do katalogów czy zarządzanie wersjami oprogramowania.

Dobrym przykładem może być utworzenie katalogu przeglądowego z wszystkimi obrazkami z określonej lokalizacji:

mkdir przeglad
find -name "*.jpg" -exec ln -s "{}" przeglad/

Przy czym nazwy plików nie mogą się powtarzać, bo zostaną nadpisane. Mimo tej niedogodności w większości przypadków procedura działa.

Ze względu na problemy ze spójnością danych i znacznie większym prawdopodobieństwem pomyłki przy twardych linkach w codziennym użytkowaniu zalecane są raczej linki symboliczne.

Jest to mechanizm, który daje użytkownikowi dużą swobodę „kształtowania” systemu plików i trzymania potrzebnych rzeczy pod ręką bez obawy, że przeniesienie np. pliku konfiguracyjnego spowoduje jakieś problemy – a przy okazji nie trzymamy wielu wersji pliku, co może prowadzić do bałaganu i błędów.

Dla własnej wygody – tam, gdzie to możliwe, chodźmy na skróty.

4 komentarze
  1. wkurza mnie jak mam twardy link i mcedit ciagle pyta czy odłączyc czy nie od innych plików. A ja bym chciał po prostu edytować plik w kilku miejscach. Gdzie to wyączyć?

      1. Piotr, a co polecasz zamiast mcedit? W sensie korzystasz z czegoś czy po prostu przez konsolę tworzysz linki?

        1. Linki – zawsze ręcznie.
          Po pierwsze daje mi to pełną kontrolę (sudo, zmiana nazw itp.), a po drugie… lubię stukać w konsoli. Mam wtedy poczucie, że jestem PRO-SUPER-PENGUIN-HERO 😀

Komentarze są wyłączone.

Poprzedni post

Devuan 4.0.0

Następny post

MX Linux 21 już jest

Powiązane posty