Symbolické odkazy v Linuxu představují skvělou funkčnost, avšak mohou se poškodit a směřovat do prázdna. Tento článek vám ukáže, jak lokalizovat neplatné symbolické odkazy, ověřit jejich status a případně je vymazat ze systému.
Co jsou to symbolické odkazy?
Symbolické odkazy, též nazývané „softlinky“ nebo „symlinky“, jsou obdobou zástupců, které ukazují na konkrétní soubory či adresáře. V grafickém správci souborů vypadají symbolické odkazy stejně jako běžné soubory či složky. Také ve výpisu souborů v terminálu se zobrazují jako záznamy. Cílový soubor či adresář, na který symbolický odkaz odkazuje, může být umístěn kdekoli ve struktuře systému souborů.
Například, pokud máte ve svém domovském adresáři symbolický odkaz s názvem „muj-odkaz“, který směřuje na soubor „dokument.txt“ uložený jinde v systému, příkazy aplikované na symbolický odkaz se automaticky provedou na cílovém souboru. Pokud v symbolickém odkazu použijete příkazy jako cat
nebo less
, ve skutečnosti uvidíte obsah souboru „dokument.txt“.
Běžná instalace Linuxu obsahuje velké množství symbolických odkazů. I když je sami nevytváříte, operační systém je aktivně využívá. Instalační procesy aplikací často používají symbolické odkazy, které ukazují na spustitelné soubory. Po aktualizaci softwaru je binární soubor nahrazen novou verzí, a pokud je název nového souboru stejný jako u starého, všechny symbolické odkazy fungují nadále bez problémů.
Některé symbolické odkazy můžeme jednoduše zobrazit pomocí příkazu ls
v kořenovém adresáři. Některé položky se zobrazují v odlišné barvě – v našem testovacím systému Ubuntu 20.10 jsou zobrazeny světle modrou barvou.
Zadáme příkaz:
ls /
Pro podrobnější zobrazení můžeme použít volbu -l
(dlouhý výpis). Následující příkaz zobrazí všechny položky začínající na „lib“ a jednu položku „bin“:
ls -l /lib* /bin
Písmeno „l“ na začátku každého řádku signalizuje, že se jedná o symbolický odkaz. Text za „->“ uvádí, na co symbolický odkaz směřuje. V našem příkladu jsou cíle všechny adresáře.
Oprávnění jsou uváděna jako čtení, zápis a spouštění pro vlastníka, skupinu a ostatní uživatele. Jedná se o výchozí hodnoty, které neodrážejí skutečná oprávnění k cílovým objektům. V systému souborů mají přednost oprávnění cílového souboru či adresáře.
Poškozené symbolické odkazy
Symbolický odkaz se stává nefunkčním, pokud je soubor, na který odkazuje, odstraněn nebo přesunut na jiné místo. Nefunkční symbolické odkazy mohou zůstat po selhání odinstalačního procesu aplikace nebo jeho předčasném ukončení.
Pokud uživatel ručně odstraní soubor, aniž by věděl, že na něj směřují symbolické odkazy, tyto odkazy přestanou fungovat. Stanou se z nich „dopravní značky“ ukazující na místo, které již neexistuje.
Tento jev můžeme snadno demonstrovat na symbolickém odkazu „zdravim“ v aktuálním adresáři. Po spuštění příkazu ls -l
vidíme:
ls -l
Odkazuje na program „program“ v adresáři „bin“. Pokud symbolický odkaz „spustíme“, program se provede:
./zdravim
Stejný výsledek získáme přímým spuštěním programu:
../bin/program
Nyní odstraníme soubor programu:
rm ../bin/program
Po opětovném vypsání symbolického odkazu vidíme, že se zobrazuje červeně, protože Linux rozpoznal, že je nefunkční. Systém nám zároveň říká, kam odkaz dříve směřoval, což umožňuje obnovit cílový soubor, rekompilovat program nebo provést další nezbytné kroky pro opravu symbolického odkazu.
Je důležité si všimnout, že při pokusu o spuštění nefunkčního symbolického odkazu se v chybové hlášce objeví název symbolického odkazu, a ne název programu, na který odkazuje:
./zdravim
Vyhledání nefunkčních symbolických odkazů
Většina moderních verzí příkazu find
má možnost -xtype
, která umožňuje jednoduché vyhledání nefunkčních symbolických odkazů. Pro vyhledání odkazů použijeme parametr l
s -xtype
. Použití find
s -xtype l
bez dalších specifikací způsobí, že příkaz zobrazí pouze nefunkční odkazy: více o příkazu find.
find . -xtype l
Spuštěním tohoto příkazu v domovském adresáři naleznete několik nefunkčních symbolických odkazů. Hledání je ve výchozím nastavení rekurzivní a prohledá všechny podadresáře.
Symbolický odkaz „zdravim“, který jsme záměrně poškodili, se nachází na seznamu. Další odkazy souvisí s prohlížečem Firefox a některými snímky.
Počet nalezených nefunkčních odkazů můžeme získat spojením výstupu příkazu find
s příkazem wc -l
(počet řádků).
find . -xtype l | wc -l
Zobrazí se informace, že máme 24 nefunkčních symbolických odkazů.
Ověření a odstranění nalezených odkazů
Před hromadným odstraňováním nefunkčních symbolických odkazů je nutné prozkoumat výstup příkazu find
. Zjistěte, zda existuje nějaký důvod pro nefunkčnost některých odkazů.
Občas může být problém v samotném symbolickém odkazu, a nikoli v cílovém souboru. Pokud byl symbolický odkaz vytvořen nesprávně, nemusí směřovat na správné místo, ačkoli samotný cíl existuje. V takovém případě by opravou bylo opětovné vytvoření symbolického odkazu.
Také se může stát, že naoko poškozený symbolický odkaz slouží k jinému účelu, například jako indikátor pro zámek souboru. Firefox takové odkazy používá; je to i první odkaz v našem seznamu. Protože Firefox na našem testovacím počítači nepoužíváme, můžeme ho bezpečně odstranit.
Další možností je, že cílový soubor je přítomen pouze v určitých intervalech, což je očekávané a zamýšlené chování softwaru. Cílový soubor může být například kopírován z jiného počítače či cloudu, plní svou funkci, a poté je opět smazán a v dalším cyklu nahrazen novým.
Nefunkční symbolické odkazy mohou také signalizovat chybu při instalaci softwaru. V takovém případě je lepší daný software přeinstalovat, místo pouhého smazání nefunkčního symbolického odkazu.
Po opravě odkazů, které chcete zachovat, opakujte vyhledávání. Opravené symbolické odkazy by se již ve výsledcích neměly objevit.
Z bezpečnostních důvodů se doporučuje omezit odstraňování symbolických odkazů pouze na vaše vlastní adresáře. Pokud tyto příkazy spouštíte jako root nebo v systémových adresářích, buďte maximálně opatrní.
Odstranění poškozených odkazů
Volba -exec
(execute) umožňuje spouštět příkazy nad výsledky vyhledávání příkazu find
. Pro odstranění každého nefunkčního symbolického odkazu použijeme rm
. Řetězec {}
je nahrazen jménem každého nalezeného poškozeného symbolického odkazu.
Pro ukončení seznamu příkazů pro -exec
musíme použít středník ;
. Kvůli správnému použití středníku je nutné před něj vložit zpětné lomítko \
, aby byl brán jako součást příkazu find
.
find . -xtype l -exec rm {} \;
Příkazový řádek se vrátí bez jakéhokoli náznaku, že se něco stalo. Pro ověření, že nefunkční odkazy byly odstraněny, opět spustíme příkaz pro jejich vyhledání:
find . -xtype l
Nenalezeny žádné odpovídající výsledky, což znamená, že poškozené symbolické odkazy byly odstraněny.
Ověření před smazáním
Vždy si před spuštěním příkazu na hromadné smazání udělejte čas na prozkoumání seznamu nalezených symbolických odkazů. Tímto způsobem se můžete vyhnout odstranění odkazů, o kterých si nejste jisti. Smazání můžete provést postupně v jednotlivých adresářích.
Například výše jsme mohli spustit příkaz v adresáři „.snap“ a poté manuálně smazat osamocený symbolický odkaz „zdravim“. Tím by symbolický odkaz pro zámek Firefoxu zůstal nedotčen.