
De symbolische koppelingen op Linux zijn een fantastische functie, maar ze kunnen verbroken worden en naar niets wijzen. Hier leest u hoe u verbroken symbolische koppelingen kunt vinden, ze kunt bekijken en ze indien nodig van uw systeem kunt verwijderen.
Symbolische links 101
Symbolische koppelingen, ook wel “softlinks” en “symlinks” genoemd, zijn een vorm van snelkoppelingen die naar bestanden en mappen kunnen verwijzen. Een symlink ziet er net zo uit als een normaal bestand of map in een bestandsbeheervenster. Het verschijnt ook als een item in een bestandslijst in een terminalvenster. Het bestand of de directory waarnaar de symbolische koppeling verwijst, kan zich overal in de bestandssysteemstructuur bevinden.
Laten we bijvoorbeeld zeggen dat je een symlink in je homedirectory hebt met de naam “dave-link” die verwijst naar een bestand met de naam “text-file.txt” ergens anders in de boom van het bestandssysteem. Commando’s die u op de symlink gebruikt, worden automatisch toegepast op het bestand waarnaar het verwijst. Als je probeert te gebruiken cat of less op de symlink ziet u feitelijk de inhoud van het “text-file.txt” -bestand.
Een standaard Linux-installatie bevat veel symlinks. Zelfs als u er zelf geen maakt, gebruikt het besturingssysteem ze. Toepassingsinstallatieroutines gebruiken vaak symlinks om naar uitvoerbare bestanden te verwijzen. Wanneer de software is bijgewerkt, wordt het binaire bestand vervangen door de nieuwe versie en blijven alle symbolische koppelingen werken zoals voorheen, zolang de naam van het nieuwe bestand hetzelfde is als het oude.
We kunnen gemakkelijk enkele symlinks zien door ls in de hoofdmap. Sommige inzendingen worden in een andere kleur weergegeven – op onze Ubuntu 20.10-testmachine worden ze in lichtblauw weergegeven.
We typen het volgende:
ls /

We kunnen dieper kijken door de -l (lange lijst) optie. We typen het volgende commando om naar alle “lib” -items en de enkele “bin” -item te kijken:
ls -l /lib* /bin

Aan het begin van elke regel staat een “l”, wat aangeeft dat het item een symlink is. De tekst achter “->” laat zien waarnaar de symbolische link verwijst. In ons voorbeeld zijn de doelen alle mappen.
De machtigingen worden weergegeven als lezen, schrijven en uitvoeren voor de eigenaar, de groep en anderen. Dit zijn standaard nep-inzendingen. Ze weerspiegelen niet de feitelijke machtigingen voor de objecten waarnaar de symlinks verwijzen. Het zijn de machtigingen voor het doelbestand of de doelmap die voorrang hebben en worden gehonoreerd door het bestandssysteem.
Gebroken symlinks
Een symlink is verbroken (of blijft hangen) wanneer het bestand waarnaar het verwijst, wordt verwijderd of naar een andere locatie wordt verplaatst. Als de verwijderingsroutine van een toepassing niet correct werkt, of wordt onderbroken voordat deze is voltooid, kan het zijn dat u gebroken symlinks overhoudt.
Als iemand handmatig een bestand verwijdert zonder te weten dat symbolische links ernaar verwijzen, werken die symbolische links niet meer. Ze zullen als verkeersborden zijn die naar een stad wijzen die platgewalst is.
We kunnen dit gedrag gemakkelijk zien met behulp van een symlink genaamd “hallo” in de huidige directory. We typen het volgende met ls het zien:
ls -l
Het verwijst naar een programma met de naam ‘htg’ in een directory met de naam ‘bin’. Als we de symlink “uitvoeren”, voert deze het programma voor ons uit:
./hello
We kunnen nu controleren of dit is wat er gebeurt door het programma rechtstreeks uit te voeren:
../bin/htg
Zoals verwacht krijgen we hetzelfde antwoord. Laten we het programmabestand verwijderen:
rm ../bin/htg
Als we nu naar de symlink kijken, zien we dat deze in het rood wordt weergegeven omdat Linux weet dat deze kapot is. Het vertelt ons ook waar het vroeger naar wees, zodat we het bestand kunnen vervangen, het programma opnieuw kunnen compileren of alles kunnen doen wat nodig is om de symlink te repareren.
Merk op dat als we de symlink proberen uit te voeren, de fout die we krijgen verwijst naar de naam van de symlink in plaats van naar de naam van het programma waarnaar de symlink verwijst.
We typen het volgende:
./hello

Gebroken symlinks vinden
De meeste moderne versies van find hebben de xtype (uitgebreid type) optie, die het zoeken naar gebroken symlinks vereenvoudigt. We gebruiken de l vlag met xtype, om hem te vertellen naar links te zoeken. Gebruik makend van find en xtype als volgt, zonder een van de andere type vlaggen, krachten xtype om verbroken links te retourneren:
find . -xtype l

Als u de opdracht uitvoert in onze test-homedirectory, vindt u nogal wat gebroken symlinks. Merk op dat de zoekopdracht standaard recursief is, dus het doorzoekt automatisch alle submappen.
De “hallo” symlink die we expres hebben verbroken, wordt vermeld, zoals we hadden verwacht. Een van de andere symlinks is gerelateerd aan de Firefox-browser en de rest is gekoppeld aan snaps.
Als we de output erdoorheen leiden wc met de -l (lijnen) optie, kunnen we de regels tellen, wat hetzelfde is als het tellen van de gebroken symlinks.
We typen het volgende:
find . -xtype l | wc -l

We zijn geïnformeerd dat we 24 gebroken symlinks hebben die naar niets verwijzen.
Zoeken, beoordelen en vervolgens verwijderen
Voordat u naar binnen haast en alle verbroken symlinks verwijdert, bekijkt u de resultaten van het find opdracht. Kijk of er een geldige reden is voor een van de verbroken symlinks.
Soms is de symlink het probleem, in plaats van het doelbestand. Als de symbolische koppeling niet correct is gemaakt, kan het zijn dat deze naar niets verwijst, maar het echte doel is aanwezig. Het opnieuw maken van de symlink zou in dat geval de oplossing zijn.
Het is ook mogelijk dat een ogenschijnlijk verbroken symlink als iets anders wordt gebruikt, zoals een indicator van een bestandsvergrendeling of een andere go / no go-indicator. Firefox doet dit; dat is wat de eerste symlink in onze lijst is. Firefox wordt echter niet gebruikt op onze testmachine, dus het is veilig voor ons om het te verwijderen.
Het is ook mogelijk dat het doelwit slechts periodiek aanwezig is, en dit is het verwachte (en gewenste) gedrag van die specifieke software. Misschien is het doelbestand gekopieerd van een andere machine of de cloud, vervult het zijn functie en wordt het vervolgens weer verwijderd om in de volgende cyclus door een ander programma te worden vervangen.
De verbroken symbolische koppeling kan ook een symptoom zijn van een software-installatie die is mislukt. In dat geval moet u de symlink niet verwijderen, maar deze handmatig herstellen of de installatie herhalen.
Als je de verbroken links hebt gerepareerd die je moet behouden, herhaal je de opdracht om de zoekopdracht uit te voeren. De vaste symlinks zouden dan niet in de zoekresultaten moeten ontbreken.
Omwille van de veiligheid is het het beste om het verwijderen van symbolische links te beperken tot uw eigen mappen. Wees uiterst voorzichtig met het uitvoeren van deze opdrachten als root of in systeemmappen.
Gebroken symlinks verwijderen
De -exec (execute) optie voert opdrachten uit op het find Zoekresultaten. We gaan gebruiken rm om elke gebroken symlink te verwijderen. De {} tekenreeks wordt vervangen door de naam van elke gebroken symlink, aangezien elke wordt ontdekt door find.
We moeten een puntkomma (;) om de lijst met gewenste opdrachten te beëindigen -exec rennen. We gebruiken een backslash () om aan de puntkomma te “ontsnappen”, dus het wordt behandeld als onderdeel van de find commando, in plaats van iets Bash zou moeten handelen.
We typen het volgende:
find . -xtype l -exec rm {} ;

We zijn teruggekeerd naar de opdrachtprompt zonder enige indicatie dat er iets is gebeurd. Om te controleren of de verbroken koppelingen zijn verwijderd, herhalen we de opdracht om ze te zoeken, als volgt:
find . -xtype l

Er zijn geen overeenkomende resultaten, wat betekent dat de verbroken symlinks zijn verwijderd.
Denk eraan om eerst te beoordelen
Nogmaals, neem altijd de tijd om een lijst met symlinks te bekijken voordat u de opdracht uitvoert om ze te verwijderen. U kunt voorkomen dat u onzekerheden verwijdert door de opdracht uit te voeren om ze in de juiste mappen te verwijderen.
We hadden hierboven bijvoorbeeld de opdracht kunnen uitvoeren in de map “.snap” en dan handmatig de eenzame symbolische koppeling “hallo” hebben verwijderd. Dit zou de symlink voor het vergrendelen van Firefox onaangeroerd hebben gelaten.