Simboličke veze u Linuxu predstavljaju izuzetno korisnu funkciju, ali mogu postati neispravne i prestati da funkcionišu. U ovom tekstu ćemo objasniti kako pronaći takve prekinute veze, pregledati ih i po potrebi ukloniti sa vašeg sistema.
Šta su Simboličke Veze?
Simboličke veze, poznate i kao „meke veze“ ili „simlinkovi“, su specifičan tip prečica koje upućuju na druge datoteke ili direktorijume. One se u grafičkom okruženju prikazuju kao obične datoteke ili direktorijumi. Takođe, pojavljuju se kao stavke u spisku datoteka u komandnoj liniji. Važno je napomenuti da datoteka ili direktorijum na koji pokazuje simbolička veza može biti lociran bilo gde u strukturi datotečnog sistema.
Uzmimo primer da imate simboličku vezu pod nazivom „moj-link“ u vašem korisničkom direktorijumu, koja upućuje na datoteku „dokument.txt“ koja se nalazi na drugom mestu na disku. Kada koristite komande nad „moj-link“, one će se zapravo izvršavati na „dokument.txt“. Na primer, ako koristite komandu `cat` ili `less` na simboličkoj vezi, videćete sadržaj datoteke „dokument.txt“.
Standardne Linux instalacije često sadrže veliki broj simboličkih veza, čak i ako ih sami niste kreirali. Operativni sistem ih koristi za razne svrhe. Programi za instalaciju aplikacija često koriste simboličke veze kako bi upućivale na izvršne datoteke. Kada se softver ažurira, izvršna datoteka se zamenjuje novijom verzijom, a simboličke veze će i dalje funkcionisati bez problema, sve dok nova datoteka ima isto ime kao i stara.
Možemo lako da vidimo neke od simboličkih veza koristeći komandu `ls` u korenom direktorijumu. Određene stavke će biti prikazane u različitoj boji – na našem Ubuntu 20.10 sistemu, one su svetlo plave.
Unosimo sledeću komandu:
ls /
Za detaljniji pregled, koristimo opciju `-l` (duga lista). U narednoj komandi prikazujemo sve stavke koje počinju sa „lib“ i jednu stavku „bin“:
ls -l /lib* /bin
Svaki red počinje sa slovom „l“, što označava da je u pitanju simbolička veza. Tekst posle `->` prikazuje na šta ta simbolička veza upućuje. U ovom primeru, sve su to direktorijumi.
Prikazane su i dozvole za čitanje, pisanje i izvršavanje za vlasnika, grupu i ostale korisnike. To su podrazumevani unosi i ne odražavaju stvarne dozvole za objekat na koji pokazuju simboličke veze. Važeće su dozvole ciljne datoteke ili direktorijuma, i njih sistem poštuje.
Prekinute Simboličke Veze
Simbolička veza postaje prekinuta (ili „visi“) kada se datoteka na koju pokazuje izbriše ili premesti na drugu lokaciju. Ukoliko deinstalacija aplikacije nije obavljena ispravno, ili je prekinuta pre završetka, možete imati prekinute simboličke veze na svom sistemu.
Ako neko ručno izbriše datoteku ne znajući da simboličke veze upućuju na nju, te veze više neće biti funkcionalne. To je kao putokaz koji upućuje na grad koji više ne postoji.
Ovakvo ponašanje lako možemo prikazati koristeći simboličku vezu „zdravo“ u trenutnom direktorijumu. Korišćenjem `ls` možemo je videti:
ls -l
Ona upućuje na program „htg“ u direktorijumu „bin“. Ako „pokrenemo“ simboličku vezu, program će se izvršiti:
./hello
Da proverimo da li je ovo zaista slučaj, pokrenućemo program direktno:
../bin/htg
Očekivano, dobili smo isti rezultat. Sada ćemo izbrisati programsku datoteku:
rm ../bin/htg
Kada sada pogledamo simboličku vezu, videćemo da je prikazana crveno jer Linux zna da je prekinuta. Takođe je vidljivo na šta je nekada pokazivala, što nam daje mogućnost da zamenimo datoteku, ponovo kompajliramo program ili učinimo sve što je potrebno kako bi popravili simboličku vezu.
Kada pokušamo da pokrenemo prekinutu simboličku vezu, greška koju dobijemo se odnosi na ime simboličke veze, a ne na ime programa na koji je nekada upućivala.
Unosimo sledeću komandu:
./hello
Pronalaženje Prekinutih Simboličkih Veza
Većina modernih verzija komande `find` ima opciju `-xtype` (prošireni tip), koja olakšava pronalaženje prekinutih simboličkih veza. Koristićemo oznaku `l` sa `-xtype` da odredimo da tražimo veze. Upotreba `find` i `-xtype` na ovaj način, bez drugih oznaka tipa, vraća samo prekinute veze:
find . -xtype l
Pokretanjem komande u našem testnom korisničkom direktorijumu, pronađeno je nekoliko prekinutih simboličkih veza. Pretraga je po definiciji rekurzivna, što znači da će automatski pretražiti i sve poddirektorijume.
Simbolička veza „zdravo“ koju smo namerno prekinuli je na spisku, kao što smo i očekivali. Jedna od drugih veza se odnosi na Firefox pretraživač, a ostale su povezane sa snimcima.
Ako izlaz preusmerimo kroz komandu `wc` sa opcijom `-l` (linije), možemo izbrojati linije, što je ekvivalentno broju prekinutih simboličkih veza.
Unosimo sledeću komandu:
find . -xtype l | wc -l
Obavešteni smo da imamo 24 prekinute simboličke veze koje ne pokazuju ni na šta.
Pre Gubitka, Proverite!
Pre nego što požurite i obrišete sve prekinute simboličke veze, pažljivo pogledajte rezultate komande `find`. Razmotrite da li postoji opravdan razlog za bilo koju od prekinutih veza.
Ponekad problem može biti u simboličkoj vezi, a ne u ciljnoj datoteci. Ukoliko je veza nepravilno kreirana, može da ne upućuje ni na šta, iako pravi cilj postoji. U tom slučaju rešenje je ponovno kreiranje simboličke veze.
Takođe je moguće da se naizgled prekinuta simbolička veza koristi kao nešto drugo, kao što je indikator zaključavanja datoteke ili drugi pokazatelj pokretanja/zaustavljanja. Firefox to radi; to je prva simbolička veza na našem spisku. Međutim, Firefox se ne koristi na našem testnom sistemu, tako da je bezbedno da je obrišemo.
Moguće je da je cilj povremeno prisutan, i da je to očekivano i poželjno ponašanje softvera. Ciljna datoteka može biti kopirana sa drugog računara ili iz oblaka, obavlja svoju funkciju i potom se briše, da bi je u sledećem ciklusu zamenio drugi program.
Prekinuta simbolička veza takođe može biti simptom neuspešne instalacije softvera. U tom slučaju, umesto brisanja simboličke veze, potrebno je popraviti je ručno ili ponoviti instalaciju.
Nakon što rešite probleme sa vezama koje želite da sačuvate, ponovite pretragu. Popravljene simboličke veze više ne bi trebalo da se pojavljuju u rezultatima pretrage.
Radi sigurnosti, preporučuje se da brisanje ograničite na sopstvene direktorijume. Budite posebno oprezni kada pokrećete ove komande kao root korisnik ili u sistemskim direktorijumima.
Uklanjanje Prekinutih Simboličkih Veza
Opcija `-exec` (izvrši) pokreće komande za svaki pronađeni rezultat. Koristićemo `rm` da izbrišemo svaku prekinutu simboličku vezu. Niska `{}` se zamenjuje imenom svake prekinute veze tokom izvršavanja `find`.
Potrebno je koristiti tačku i zarez (`;`) da prekinemo listu komandi koje želimo da `exec` pokrene. Koristimo obrnutu kosu crtu `\` da „izbegnemo“ tačku i zarez, tako da se ona tretira kao deo naredbe `find`, a ne kao nešto na šta bi `Bash` trebalo da deluje.
Unosimo sledeću komandu:
find . -xtype l -exec rm {} \;
Vratili smo se u komandnu liniju bez ikakve potvrde da se nešto dogodilo. Da bismo bili sigurni da su prekinute veze zaista uklonjene, ponovićemo naredbu za pretragu:
find . -xtype l
Nema rezultata, što znači da su sve prekinute simboličke veze uklonjene.
Ne Zaboravite na Pregled!
Još jednom, uvek pregledajte spisak simboličkih veza pre nego što pokrenete komandu za njihovo brisanje. Na ovaj način možete izbeći brisanje onih veza u čiju svrhu niste sigurni, tako što ćete komandu za brisanje izvršiti u određenim direktorijumima.
Na primer, u prethodnom slučaju, mogli smo pokrenuti komandu u direktorijumu „.snap“, a zatim ručno ukloniti usamljenu vezu „zdravo“. Na taj način bi simbolička veza za zaključavanje Firefox-a ostala netaknuta.