So finden und löschen Sie defekte Symlinks unter Linux

Die symbolischen Links unter Linux sind ein fantastisches Feature, aber sie können kaputt gehen und auf nichts verweisen. So finden Sie defekte symbolische Links, überprüfen sie und entfernen sie bei Bedarf aus Ihrem System.

Symbolische Links 101

Symbolische Links, auch „Soft Links“ und „Symlinks“ genannt, sind eine Form von Verknüpfungen, die auf Dateien und Verzeichnisse verweisen können. Ein Symlink sieht in einem Dateimanagerfenster genauso aus wie eine normale Datei oder ein Verzeichnis. Es wird auch als Eintrag in einer Dateiliste in einem Terminalfenster angezeigt. Die Datei oder das Verzeichnis, auf das der symbolische Link zeigt, kann sich irgendwo im Dateisystembaum befinden.

Nehmen wir zum Beispiel an, Sie haben in Ihrem Home-Verzeichnis einen symbolischen Link namens „dave-link“, der auf eine Datei namens „text-file.txt“ verweist, die sich an einer anderen Stelle im Dateisystembaum befindet. Befehle, die Sie für den symbolischen Link verwenden, werden automatisch auf die Datei angewendet, auf die er verweist. Wenn Sie versuchen, cat oder less auf dem Symlink zu verwenden, sehen Sie tatsächlich den Inhalt der Datei „text-file.txt“.

Eine Standard-Linux-Installation enthält viele Symlinks. Auch wenn Sie keine selbst erstellen, verwendet das Betriebssystem sie. Anwendungsinstallationsroutinen verwenden häufig symbolische Links, um auf ausführbare Dateien zu verweisen. Wenn die Software aktualisiert wird, wird die Binärdatei durch die neue Version ersetzt, und alle symbolischen Links funktionieren weiter wie zuvor, solange der Name der neuen Datei derselbe ist wie der alte.

Wir können einige Symlinks leicht sehen, indem wir ls im Stammverzeichnis verwenden. Einige der Einträge werden in einer anderen Farbe angezeigt – auf unserer Ubuntu 20.10-Testmaschine werden sie in Hellblau angezeigt.

Wir geben Folgendes ein:

ls /

Wir können einen tieferen Blick darauf werfen, indem wir die Option -l (Long Listing) verwenden. Wir geben den folgenden Befehl ein, um alle „lib“-Einträge und den einzelnen „bin“-Eintrag anzuzeigen:

ls -l /lib* /bin

Am Anfang jeder Zeile steht ein „l“, das anzeigt, dass es sich bei dem Element um einen Symlink handelt. Der Text nach „->“ zeigt, worauf der Symlink zeigt. In unserem Beispiel sind die Ziele alle Verzeichnisse.

  So konvertieren Sie PNG in JPG unter Linux

Die Berechtigungen werden als Lesen, Schreiben und Ausführen für den Besitzer, die Gruppe und andere aufgelistet. Dies sind standardmäßige gefälschte Einträge. Sie spiegeln nicht die tatsächlichen Berechtigungen für die Objekte wider, auf die die Symlinks zeigen. Es sind die Berechtigungen für die Zieldatei oder das Zielverzeichnis, die Vorrang haben und vom Dateisystem beachtet werden.

Defekte Symlinks

Ein Symlink wird unterbrochen (oder baumelt), wenn die Datei, auf die er verweist, gelöscht oder an einen anderen Ort verschoben wird. Wenn die Deinstallationsroutine einer Anwendung nicht ordnungsgemäß funktioniert oder unterbrochen wird, bevor sie abgeschlossen ist, bleiben möglicherweise fehlerhafte symbolische Links zurück.

Wenn jemand eine Datei manuell löscht, ohne zu wissen, dass Symlinks darauf verweisen, funktionieren diese Symlinks nicht mehr. Sie werden wie Straßenschilder sein, die auf eine Stadt hinweisen, die planiert wurde.

Wir können dieses Verhalten leicht erkennen, indem wir einen symbolischen Link namens „hello“ im aktuellen Verzeichnis verwenden. Wir geben Folgendes ein und verwenden ls, um es anzuzeigen:

ls -l

Es zeigt auf ein Programm namens „htg“ in einem Verzeichnis namens „bin“. Wenn wir den Symlink „ausführen“, führt er das Programm für uns aus:

./hello

Wir können jetzt überprüfen, ob dies der Fall ist, indem wir das Programm direkt ausführen:

../bin/htg

Wie erwartet erhalten wir die gleiche Antwort. Löschen wir die Programmdatei:

rm ../bin/htg

Wenn wir uns jetzt den Symlink ansehen, sehen wir, dass er rot aufgelistet ist, weil Linux weiß, dass er kaputt ist. Es teilt uns auch mit, worauf es früher gezeigt hat, sodass wir die Datei ersetzen, das Programm neu kompilieren oder alles tun können, was erforderlich ist, um den Symlink zu reparieren.

Beachten Sie, dass beim Versuch, den Symlink auszuführen, der Fehler, den wir erhalten, auf den Namen des Symlinks verweist und nicht auf den Namen des Programms, auf das der Symlink zeigt.

Wir geben Folgendes ein:

./hello

Defekte Symlinks finden

Die meisten modernen Versionen von find haben die Option xtype (erweiterter Typ), was das Auffinden defekter Symlinks vereinfacht. Wir verwenden das l-Flag mit xtype, um es anzuweisen, nach Links zu suchen. Die Verwendung von find und xtype wie folgt ohne die anderen Typ-Flags zwingt xtype, defekte Links zurückzugeben:

find . -xtype l

Wenn Sie den Befehl in unserem Test-Home-Verzeichnis ausführen, werden einige fehlerhafte Symlinks gefunden. Beachten Sie, dass die Suche standardmäßig rekursiv ist, also alle Unterverzeichnisse automatisch durchsucht werden.

  So ändern Sie die Größe von LVM-Volumes unter Linux

Der „Hallo“-Symlink, den wir absichtlich unterbrochen haben, wird wie erwartet aufgelistet. Einer der anderen Symlinks bezieht sich auf den Firefox-Browser, und der Rest ist mit Snaps verknüpft.

Wenn wir die Ausgabe mit der Option -l (Zeilen) durch wc leiten, können wir die Zeilen zählen, was dasselbe ist wie das Zählen der defekten Symlinks.

Wir geben Folgendes ein:

find . -xtype l | wc -l

Uns wurde mitgeteilt, dass wir 24 defekte Symlinks haben, die auf nichts verweisen.

Suchen, überprüfen und dann entfernen

Bevor Sie loslegen und alle defekten Symlinks löschen, sehen Sie sich die Ergebnisse des Find-Befehls an. Prüfen Sie, ob es einen triftigen Grund für einen der defekten Symlinks gibt.

Manchmal ist eher der Symlink als die Zieldatei das Problem. Wenn der Symlink falsch erstellt wurde, zeigt er möglicherweise auf nichts, aber das eigentliche Ziel ist vorhanden. Das erneute Erstellen des Symlinks wäre in diesem Fall die Lösung.

Es ist auch möglich, dass ein scheinbar defekter Symlink für etwas anderes verwendet wird, z. B. als Indikator für eine Dateisperre oder einen anderen Go / No Go-Indikator. Firefox tut dies; das ist der erste Symlink in unserer Liste. Firefox wird jedoch nicht auf unserem Testcomputer verwendet, daher können wir ihn sicher löschen.

Es ist auch möglich, dass das Ziel nur periodisch vorhanden ist, und dies das erwartete (und gewünschte) Verhalten dieser bestimmten Software ist. Vielleicht wird die Zieldatei von einer anderen Maschine oder der Cloud kopiert, erfüllt ihre Funktion und wird dann wieder gelöscht, nur um im nächsten Zyklus durch ein anderes Programm ersetzt zu werden.

  So installieren Sie das Evopop GTK-Design unter Linux

Der defekte symbolische Link kann auch ein Symptom für eine fehlgeschlagene Softwareinstallation sein. Anstatt den Symlink zu löschen, sollten Sie ihn in diesem Fall entweder manuell reparieren oder die Installation wiederholen.

Wenn Sie die defekten Links repariert haben, die Sie behalten müssen, wiederholen Sie den Befehl, um die Suche durchzuführen. Die festen Symlinks sollten dann in den Suchergebnissen fehlen.

Aus Sicherheitsgründen ist es am besten, das Entfernen von Symlinks auf Ihre eigenen Verzeichnisse zu beschränken. Seien Sie äußerst vorsichtig, wenn Sie diese Befehle als root oder in Systemverzeichnissen ausführen.

Defekte Symlinks entfernen

Die Option -exec (Ausführen) führt Befehle für die Suchergebnisse aus. Wir werden rm verwenden, um jeden defekten Symlink zu löschen. Die Zeichenfolge {} wird durch den Namen jedes defekten Symlinks ersetzt, wenn jeder von find entdeckt wird.

Wir müssen ein Semikolon (;) verwenden, um die Liste der Befehle zu beenden, die -exec ausführen soll. Wir verwenden einen umgekehrten Schrägstrich (), um das Semikolon zu „escapen“, sodass es als Teil des find-Befehls behandelt wird und nicht als etwas, worauf Bash reagieren sollte.

Wir geben Folgendes ein:

find . -xtype l -exec rm {} ;

Wir kehren ohne Hinweis darauf, dass etwas passiert ist, zur Eingabeaufforderung zurück. Um zu überprüfen, ob die defekten Links entfernt wurden, wiederholen wir den Befehl, um nach ihnen zu suchen, wie folgt:

find . -xtype l

Es gibt keine übereinstimmenden Ergebnisse, was bedeutet, dass die defekten Symlinks entfernt wurden.

Denken Sie daran, zuerst zu überprüfen

Nehmen Sie sich auch hier immer die Zeit, eine Liste mit symbolischen Links zu überprüfen, bevor Sie den Befehl zum Löschen ausführen. Sie können vermeiden, alle zu löschen, bei denen Sie sich nicht sicher sind, indem Sie den Befehl ausführen, um sie in den entsprechenden Verzeichnissen zu löschen.

Zum Beispiel hätten wir oben den Befehl im „.snap“-Verzeichnis ausführen und dann den einsamen „Hallo“-Symlink manuell entfernen können. Dies hätte den Symbollink für die Firefox-Sperre unberührt gelassen.