Cum să găsiți și să ștergeți linkurile simbolice sparte pe Linux

Legăturile simbolice în Linux reprezintă o facilitate extraordinară, dar pot ajunge să fie nefuncționale, indicând către destinații inexistente. În acest articol, vom explora modalitățile de identificare, analiză și eliminare a acestor legături simbolice defecte din sistemul dumneavoastră.

Ce sunt legăturile simbolice?

Legăturile simbolice, cunoscute și sub denumirea de „legături soft”, sunt un tip de scurtătură care poate puncta către fișiere sau directoare. Ele apar în interfața de gestionare a fișierelor exact ca orice alt fișier sau director obișnuit. De asemenea, sunt afișate ca intrări în listele de fișiere din terminal. Destinația legăturii simbolice poate fi situată oriunde în structura arborescentă a sistemului de fișiere.

De exemplu, să presupunem că în directorul personal aveți o legătură simbolică numită „link-dave” care indică către un fișier numit „fisier-text.txt”, situat într-o altă zonă a sistemului de fișiere. Orice operație efectuată asupra legăturii simbolice va fi aplicată automat fișierului către care aceasta indică. Dacă veți încerca să utilizați comenzi precum cat sau less pe legătura simbolică, veți vizualiza conținutul fișierului „fisier-text.txt”.

O instalare Linux standard include numeroase legături simbolice. Chiar dacă nu creați personal astfel de legături, sistemul de operare le folosește. De multe ori, programele de instalare folosesc legături simbolice pentru a indica fișierele executabile. Când un software este actualizat, fișierul binar vechi este înlocuit cu o versiune nouă, dar legăturile simbolice vor continua să funcționeze normal, atâta timp cât noul fișier are același nume ca cel vechi.

Putem observa cu ușurință câteva legături simbolice utilizând comanda ls în directorul rădăcină. Acestea sunt afișate cu o culoare distinctă – pe sistemul nostru de test Ubuntu 20.10, apar cu albastru deschis.

Introduceți următoarea comandă:

ls /

Pentru o vizualizare mai detaliată, folosim opțiunea -l (listă lungă). Iată comanda pentru a vedea toate intrările ce încep cu „lib” și singura intrare „bin”:

ls -l /lib* /bin

La începutul fiecărei linii se află un „l”, ceea ce indică faptul că elementul respectiv este o legătură simbolică. Textul care urmează după „->” arată către ce punctează acea legătură. În exemplul nostru, toate destinațiile sunt directoare.

Permisiunile afișate sunt pentru citire, scriere și executare pentru proprietar, grup și alții. Acestea sunt permisiuni implicite, care nu reflectă permisiunile reale ale obiectelor către care indică legăturile. Permisiunile reale ale fișierului sau directorului țintă sunt cele care contează și sunt respectate de sistemul de fișiere.

Ce sunt legăturile simbolice nefuncționale?

O legătură simbolică devine nefuncțională atunci când fișierul către care indică este șters sau mutat în altă locație. Dacă o rutină de dezinstalare a unei aplicații nu funcționează corect sau este întreruptă înainte de finalizare, este posibil să rămâneți cu legături simbolice defecte.

Dacă un utilizator șterge un fișier manual fără să știe că există legături simbolice către el, acele legături nu vor mai fi valabile. Vor fi ca indicatoarele rutiere care direcționează către un oraș care a fost demolat.

Pentru a ilustra acest comportament, putem folosi o legătură simbolică numită „salut” în directorul curent. Vom introduce comenzile următoare, utilizând ls pentru a o vizualiza:

ls -l

Aceasta indică către un program numit „prog” într-un director numit „bin”. Dacă vom „rula” legătura simbolică, aceasta va executa programul:

./salut

Putem verifica acest lucru rulând direct programul:

../bin/prog

Obținem, așa cum ne așteptam, același răspuns. Să ștergem acum fișierul programului:

rm ../bin/prog

Acum, când ne uităm la legătura simbolică, observăm că este afișată cu roșu, deoarece Linux știe că este nefuncțională. Ni se indică, de asemenea, ce indica ea înainte, astfel încât putem înlocui fișierul, recompila programul sau lua măsurile necesare pentru a repara legătura.

Este important de reținut că, dacă încercăm să rulăm legătura simbolică, eroarea va menționa numele legăturii simbolice, și nu numele programului către care aceasta indica.

Introduceți comanda:

./salut

Cum găsim legăturile simbolice nefuncționale?

Majoritatea versiunilor moderne ale comenzii find includ opțiunea xtype (tip extins), facilitând identificarea legăturilor simbolice defecte. Vom folosi indicatorul l împreună cu xtype pentru a specifica căutarea link-urilor. Folosind find și xtype, așa cum urmează, fără alte opțiuni de tip, vom obține o listă cu legături întrerupte:

find . -xtype l

Executând comanda în directorul nostru principal de testare, vom găsi o serie de legături simbolice defecte. Căutarea este recursivă implicit, deci va include toate subdirectoarele.

Legătura simbolică „salut” pe care am rupt-o intenționat apare în listă, așa cum ne așteptam. O altă legătură simbolică este asociată browser-ului Firefox, iar restul sunt legate de instantanee.

Dacă redirectăm rezultatul folosind wc cu opțiunea -l (linii), vom putea număra liniile, ceea ce este echivalent cu numărul de legături simbolice nefuncționale.

Introduceți următoarea comandă:

find . -xtype l | wc -l

Sistemul ne informează că avem 24 de legături simbolice nefuncționale, care nu indică către nimic.

Analiza și eliminarea legăturilor simbolice nefuncționale

Înainte de a elimina toate legăturile simbolice nefuncționale, examinați rezultatele comenzii find. Încercați să vedeți dacă există o justificare validă pentru existența vreunei legături simbolice defecte.

Uneori, problema nu este legată de destinația legăturii, ci de legătura simbolică în sine. Dacă aceasta a fost creată incorect, este posibil să nu indice către nimic, chiar dacă destinația reală există. În acest caz, refacerea legăturii simbolice ar rezolva problema.

De asemenea, o legătură simbolică aparent nefuncțională poate fi utilizată ca un semnal de alt tip, precum un indicator al blocării unui fișier. Firefox folosește această tehnică; aceasta este prima legătură simbolică din lista noastră. Cu toate acestea, deoarece Firefox nu este utilizat pe sistemul nostru de test, putem să o ștergem în siguranță.

Destinația poate fi, de asemenea, prezentă doar temporar, iar acesta poate fi comportamentul normal al software-ului respectiv. Fișierul destinație poate fi copiat de pe o altă mașină sau din cloud, își îndeplinește funcția, apoi este șters, pentru a fi înlocuit cu altul în următorul ciclu.

O legătură simbolică nefuncțională poate indica, de asemenea, o instalare software care a eșuat. În acest caz, în loc să ștergeți legătura simbolică, ar trebui să remediați manual problema sau să repetați instalarea.

După ce ați reparat legăturile pe care doriți să le păstrați, repetați comanda de căutare. Legăturile funcționale ar trebui să dispară din lista rezultatelor.

Din motive de siguranță, cel mai bine este să limitați ștergerea legăturilor simbolice la directoarele dumneavoastră personale. Fiți foarte atenți când rulați aceste comenzi ca root sau în directoarele de sistem.

Cum ștergem legăturile simbolice nefuncționale?

Opțiunea -exec (execute) rulează comenzi asupra rezultatelor comenzii find. Vom utiliza rm pentru a șterge fiecare legătură simbolică defectă. Șirul {} va fi înlocuit cu numele fiecărei legături simbolice nefuncționale pe măsură ce este descoperită de find.

Trebuie să utilizăm caracterul punct și virgulă (;) pentru a încheia lista de comenzi pe care dorim să le ruleze -exec. Vom utiliza o bară oblică inversă (\) pentru a „scăpa” caracterul punct și virgulă, astfel încât acesta să fie tratat ca parte a comenzii find, și nu ca o comandă separată pentru interpretorul Bash.

Introduceți următoarea comandă:

find . -xtype l -exec rm {} \; 

Revenim la promptul de comandă fără niciun indiciu că s-a întâmplat ceva. Pentru a verifica dacă legăturile defecte au fost eliminate, repetăm comanda de căutare:

find . -xtype l

Nu există rezultate, ceea ce înseamnă că legăturile simbolice defecte au fost eliminate.

Revizuirea este esențială

Întotdeauna dedicați timp analizării listei de legături simbolice înainte de a executa comanda de ștergere. Puteți evita eliminarea legăturilor nesigure, executând comanda de ștergere doar în directoarele relevante.

De exemplu, în exemplul de mai sus, am fi putut rula comanda în directorul „.snap” și apoi am fi eliminat manual legătura simbolică „salut”. Astfel, legătura simbolică de blocare Firefox ar fi fost menținută.