Czy usunięcie wszystkich zepsutych dowiązań symbolicznych w systemie ma wadę?

46

Uruchomiłem skrypt, który iterował wszystkie pliki w moim systemie Linux i stworzyłem o nich metadane, i spowodował błąd, gdy trafił do zepsutego dowiązania symbolicznego.

Jestem nowicjuszem w * nix, ale mam główną ideę związaną z łączeniem plików i tym, jak powstają zepsute linki. O ile mi wiadomo, są one jak odpowiednik śmieci na ulicy. Rzeczy, które program, który usuwam, nie były wystarczająco inteligentne, aby stwierdzić, że menedżer pakietów istniał i do niego należał, lub coś, co pozostało w tyle podczas aktualizacji. Na początku zacząłem poprawiać skrypt, który uruchamiam, aby je pominąć, a potem pomyślałem: „no cóż, zawsze możemy je usunąć, gdy jesteśmy tutaj ...”

Używam Ubuntu 14.04 (Trusty Tahr). Nie widzę żadnego powodu, aby tego nie robić, ale zanim przejdę do tego i przejdę przez mój system programistyczny, czy istnieje jakikolwiek powód, że może to być okropny pomysł? Czy zepsute dowiązania symboliczne służą czemuś, o czym nie wiem?

blanket_cat
źródło
7
Tak: patrz odpowiedź zaznaczona poniżej. Ale co ważniejsze, nie jest to rozwiązanie twojego problemu: skrypt musi działać poprawnie, a nie tylko zdezynfekowany system. System może zostać zdezynfekowany w ciągu milisekundy między zdezynfekowaniem a uruchomieniem drugiej połowy skryptu. Naruszało to również zasadę pojedynczej odpowiedzialności i filozofię uniksową: „zrób jedną rzecz dobrze”.
ctrl-alt-delor

Odpowiedzi:

68

Istnieje wiele przyczyn przerwania dowiązań symbolicznych:

  • Utworzono link do celu, który już nie istnieje.
    Rozwiązanie: usuń zepsute dowiązanie symboliczne.
  • Link został utworzony dla celu, który został przeniesiony. Lub jest to względny link, który został przeniesiony względem swojego celu. (Nie oznacza to, że względne dowiązania symboliczne są złym pomysłem - wręcz przeciwnie: absolutne dowiązania symboliczne są bardziej podatne na starzenie się, ponieważ ich cel został przeniesiony.)
    Rozwiązanie: znajdź zamierzony cel i napraw łącze.
  • Podczas tworzenia linku wystąpił błąd.
    Rozwiązanie: znajdź zamierzony cel i napraw łącze.
  • Łącze prowadzi do pliku znajdującego się na dysku wymiennym, sieciowym systemie plików lub innym obszarze pamięci, który nie jest aktualnie zamontowany. Rozdzielczość: brak, link nie jest cały czas zrywany. Łącze będzie działać, gdy obszar pamięci jest zamontowany.
  • Link jest do pliku, który istnieje tylko przez pewien czas, zgodnie z projektem. Na przykład plik jest buforowanym wyjściem procesu, który jest usuwany, gdy informacje stają się nieaktualne, ale są tworzone ponownie na wyraźne żądanie. Lub link prowadzi do skrzynki odbiorczej, która jest usuwana, gdy jest pusta. Lub link prowadzi do pliku urządzenia, który jest obecny tylko wtedy, gdy podłączone jest odpowiednie urządzenie peryferyjne. Rozdzielczość: brak, link nie jest cały czas zrywany.
  • Łącze jest prawidłowe tylko w innej hierarchii pamięci. Na przykład jest ważny tylko w więzieniu chroot lub jest eksportowany przez serwer NFS i jest ważny tylko na serwerze lub na niektórych jego klientach.
    Rozdzielczość: brak, link nie jest wszędzie uszkodzony.
  • Link jest uszkodzony, ponieważ nie masz uprawnień do przeglądania katalogu, aby dotrzeć do celu, ale nie jest uszkodzony dla użytkowników z odpowiednimi uprawnieniami.
    Rozdzielczość: brak, link nie jest zepsuty dla wszystkich.
  • Link służy do przechowywania informacji, jak w przykładzie blokady Firefoksa cytowanym przez vinc17 . Jednym z powodów, aby zrobić to w ten sposób, jest łatwiejsze atomowe wypełnienie dowiązania symbolicznego - nie ma innego sposobu, podczas gdy atomowe wypełnianie pliku jest bardziej złożone: musisz utworzyć zawartość pliku pod tymczasową nazwą, a następnie przenieść go na miejsce, i radzimy sobie z przestarzałymi plikami tymczasowymi pozostawionymi przez awarię. Innym powodem jest to, że dowiązania symboliczne są zwykle przechowywane bezpośrednio wewnątrz ich i-węzłów w niektórych systemach plików, co sprawia, że ​​czytanie ich jest szybsze niż czytanie zawartości pliku.
    Rozdzielczość: brak. W takim przypadku usunięcie linku byłoby szkodliwe.

Jeśli możesz ustalić, że dowiązanie symboliczne należy do pierwszej kategorii, to pewnie, śmiało i usuń je. W przeciwnym razie wstrzymaj się od głosu.

Program, który rekurencyjnie przegląda katalogi i dba o zawartość pliku, zwykle powinien ignorować zepsute dowiązania symboliczne.

Gilles „SO- przestań być zły”
źródło
dowiązania symboliczne (zwykle) nie są zawarte w ich katalogu nadrzędnym. Jednak w niektórych systemach plików docelowy link jest przechowywany w i-węźle.
James Youngman
Bardzo dobra lista. Mam kilka linków, które należą zarówno do typu 4, jak i 6. Wskazują na system plików, który montuję za pomocą SSHFS. Gdy system plików nie jest zamontowany, mają typ 4; kiedy system plików jest zamontowany, tylko ja mogę uzyskać do niego dostęp, więc są one typu 6 dla wszystkich innych (nawet root).
Barmar
Jeszcze jeden możliwy powód zepsutego dowiązania symbolicznego: dowiązanie symboliczne do rzeczywistego pliku, które istnieje tylko przez pewien czas. Na przykład w przepływie pracy z głębokimi ścieżkami możesz mieć dowiązanie symboliczne do pliku roboczego (dla wygody), które jest usuwane po zakończeniu przepływu pracy, ale zostanie odtworzone podczas następnego użycia tego przepływu pracy. / dev / modem jest podobny do tego, ponieważ rzeczywisty plik urządzenia, na który wskazuje, istnieje tylko wtedy, gdy podłączone jest urządzenie fizyczne.
Joe
dość wyczerpująca odpowiedź!
njzk2
1
@MichaelDurrant Uh? Chodzi o to, że wada (lub jej brak) zależy od tego, jak powstało przerwane dowiązanie symboliczne.
Gilles 'SO - przestań być zły'
19

Nie usuwaj na ślepo wszystkich wiszących dowiązań symbolicznych. Mogą istnieć tylko w celu przenoszenia niektórych informacji i mogą być bezpieczniejsze niż normalne pliki, ponieważ tworzenie dowiązań symbolicznych jest atomowe.

Na przykład Firefox tworzy plik blokady „blokada”, który jest dowiązaniem symbolicznym, którego wartość ma postać „Adres_IP: + PID”.

vinc17
źródło
1
Tak więc program może dynamicznie zapełniać pusty plik, do którego jedno z tych dowiązań symbolicznych jest uszkodzonym łączem, podczas gdy program nie działa ? A może to tylko informacja?
blanket_cat
1
@knotech Celem niektórych dowiązań symbolicznych (niekoniecznie związanych z działającym programem) może być po prostu istnienie. Ich wartość albo nie ma znaczenia, albo przekazuje określone informacje; w obu przypadkach ogólnie nie wskazują na nic. Nie ma pustego pliku, tylko dowiązanie symboliczne. Zwróć też uwagę, na przykład, na kompilacje gcc, które tworzą dowiązania symboliczne „bity znaczków” skierowane do siebie: gcc.gnu.org/ml/libstdc++/2011-02/msg00014.html
vinc17
6

Zarówno fnord, jak i serwer Gatling używają systemu plików Unix jako bazy danych konfiguracji (w przeciwieństwie do, powiedzmy, Microsoft IIS, który korzysta z rejestru Windows, lub Apache, który używa pliku konfiguracyjnego złożonego do analizy).

Na przykład wirtualne hosty to tylko katalogi, a utworzenie nowego wirtualnego hosta jest tak proste, jak

mkdir www.example.com:80

Konfigurowanie plików do wyświetlenia?

chmod o+r file_that_should_be_served
chmod o-r secret_passwords

Konfigurowanie plików do wykonania jako CGI, a które do obsługi?

chmod a-x plain_file.html
chmod a+x cgi_script.html

I na koniec (i dotyczy tego pytania): konfigurowanie przekierowania?

ln -s 'http://www.google.com/?q=awesome+query+site:www.example.com' search.html

Otrzymasz teraz dowiązanie symboliczne, search.htmlktóre nigdzie nie wskazuje, ale ma to zasadnicze znaczenie dla działania Twojej witryny.

Jörg W Mittag
źródło
0

Dowiązanie symboliczne może wskazywać na jeszcze pustą lokalizację, aby wymusić utworzenie w określonej lokalizacji lub nazwie systemu plików.

Więc nie - nie usuwaj ich na ślepo.

Nils
źródło
0

Znaczącym minusem usuwania starych linków symbolicznych jest to, że tracisz odniesienie do miejsca, w którym kiedyś wskazywały, które mogą być bardzo cenne!

Powiedzmy, że mam dowiązanie symboliczne do pliku o nazwie „ send_to”, który wskazuje /Users/myname/tmpi przypuszczam, że /Users/myname/tmpnie istnieje.

Z linku symbolicznego wiem gdzie plik został przeznaczony być. Na przykład w tym przypadku widzę, że jest to katalog tymczasowy i jeśli muszę go „naprawić”, powinienem rozważyć katalog tymczasowy jako miejsce docelowe.

Podobnie link „ my_config”, /etc/conf_filektóry prowadzi do tego, że „źle”, ponieważ conf_filezmieniono jego nazwę na plik potwierdzenie_, nadal jest użyteczną informacją. Jeśli poszedłeś do /etckatalogu i zrobiłeś lsi zobaczyłeś, że conf_filebrakuje pliku o nazwie, ale confirmation_filemoże tam być wystarczająco dużo informacji, aby teraz naprawić link.

Michael Durrant
źródło
-2

Cytowanie z wiersza poleceń systemu Linux (najlepsza książka dla początkujących użytkowników Linuksa, którą można pobrać bezpłatnie tutaj ):

Wyobraź sobie ten scenariusz: program wymaga użycia jakiegoś udostępnionego zasobu zawartego w pliku o nazwie „foo”, ale „foo” ma częste zmiany wersji. Dobrze byłoby dołączyć numer wersji do nazwy pliku, aby administrator lub inna zainteresowana strona mogła zobaczyć, która wersja „foo” jest zainstalowana. To stanowi problem. Jeśli zmienimy nazwę współdzielonego zasobu, musimy wyśledzić każdy program, który mógłby go użyć i zmienić go, aby szukać nowej nazwy zasobu za każdym razem, gdy instalowana jest nowa wersja zasobu. To wcale nie brzmi zabawnie.

Tutaj symboliczne linki ratują dzień. Załóżmy, że instalujemy wersję 2.6 „foo” o nazwie „foo-2.6”, a następnie tworzymy dowiązanie symboliczne zwane po prostu „foo”, które wskazuje na „foo-2.6”. Oznacza to, że gdy program otworzy plik „ foo ”, w rzeczywistości otwiera plik„ foo-2.6 ”. Teraz wszyscy są szczęśliwi. Programy oparte na „foo” mogą je znaleźć i nadal możemy zobaczyć, jaka wersja jest zainstalowana. Kiedy nadchodzi czas aktualizacji do „foo-2.7”, po prostu dodajemy plik do naszego systemu, usuwamy dowiązanie symboliczne „foo” i tworzymy nowy, który wskazuje na nową wersję. To nie tylko rozwiązuje problem aktualizacji wersji, ale także pozwala nam zachować obie wersje na naszym komputerze. Wyobraź sobie, że „foo-2.7” ma błąd (do cholery deweloperów!) I musimy wrócić do starej wersji. Jeszcze raz,

Więc nie, nie usuwałbym dowiązań symbolicznych, ponieważ z pewnością będzie to problem z bólem głowy, a ty ryzykujesz poważnym zepsuciem twojego systemu.

gacanepa
źródło
6
OP nie opowiadał się za usunięciem dowiązań symbolicznych dla sądu - tylko zepsute dowiązania symboliczne, tj. Dowiązania symboliczne, które nie wskazują na żaden istniejący plik.
LSerni