Gibt es einen Nachteil beim Löschen aller defekten symbolischen Links in einem System?

46

Ich habe ein Skript ausgeführt, das alle Dateien auf meinem Linux-System durchläuft und einige Metadaten darüber erstellt hat. Es hat einen Fehler ausgelöst, als es auf eine unterbrochene symbolische Verknüpfung gestoßen ist.

Ich bin neu bei * nix, aber ich habe die Hauptidee hinter dem Verknüpfen von Dateien und wie kaputte Links entstehen. Soweit ich weiß, sind sie das Äquivalent von Müll auf der Straße. Dinge, die ein Programm, das ich entferne, nicht klug genug war, um dem Paketmanager mitzuteilen, dass sie existieren und dazu gehören, oder Dinge, die bei einem Upgrade zurückgeblieben sind. Zuerst fing ich an, das Skript, mit dem ich sie überspringe, zu optimieren. Dann dachte ich: "Wir könnten sie immer löschen, wenn wir hier unten sind ..."

Ich verwende Ubuntu 14.04 (Trusty Tahr). Ich kann keinen Grund erkennen, dies nicht zu tun, aber gibt es einen Grund, warum dies tatsächlich eine schreckliche Idee sein könnte, bevor ich dies auf meinem Entwicklungssystem ausführe? Erfüllen defekte Symlinks einen Zweck, den ich nicht kenne?

blanket_cat
quelle
7
Ja, siehe angekreuzte Antwort unten. Noch wichtiger ist jedoch, dass dies keine Lösung für Ihr Problem ist: Das Skript muss ordnungsgemäß funktionieren und nicht nur ein bereinigtes System. Ein System kann bereinigt werden, wenn es eine halbe Millisekunde zwischen der Bereinigung und der zweiten Hälfte des ausgeführten Skripts liegt. Auch dies verstieß gegen das Prinzip der Einzelverantwortung und die Unix-Philosophie: „Mach eins gut“.
Strg-Alt-Delor

Antworten:

68

Es gibt viele Gründe für unterbrochene symbolische Links:

  • Es wurde ein Link zu einem Ziel erstellt, das nicht mehr existiert.
    Lösung: Entfernen Sie den fehlerhaften Symlink.
  • Für ein verschobenes Ziel wurde ein Link erstellt. Oder es ist ein relativer Link, der relativ zu seinem Ziel verschoben wurde. (Um nicht zu implizieren, dass relative Symlinks eine schlechte Idee sind - ganz im Gegenteil: Absolute Symlinks sind anfälliger dafür, abgestanden zu werden, weil ihr Ziel verschoben wurde.)
    Lösung: Finden Sie das beabsichtigte Ziel und reparieren Sie den Link.
  • Beim Erstellen des Links ist ein Fehler aufgetreten.
    Lösung: Finden Sie das gewünschte Ziel und korrigieren Sie den Link.
  • Der Link verweist auf eine Datei, die sich auf einem Wechseldatenträger, einem Netzwerkdateisystem oder einem anderen Speicherbereich befindet, der derzeit nicht bereitgestellt ist. Lösung: Keine, der Link ist nicht immer unterbrochen. Der Link funktioniert, wenn der Speicherbereich aktiviert ist.
  • Der Link verweist auf eine Datei, die von Entwurf nur teilweise vorhanden ist. Beispielsweise ist die Datei die zwischengespeicherte Ausgabe eines Prozesses, die gelöscht wird, wenn die Informationen veraltet sind, aber nur auf ausdrückliche Anforderung neu erstellt wird. Oder der Link führt zu einem Posteingang, der leer ist. Oder der Link führt zu einer Gerätedatei, die nur vorhanden ist, wenn das entsprechende Peripheriegerät angeschlossen ist. Lösung: Keine, der Link ist nicht immer unterbrochen.
  • Der Link ist nur in einer anderen Speicherhierarchie gültig. Beispielsweise ist es nur in einem Chroot-Gefängnis gültig, oder es wird von einem NFS-Server exportiert und ist nur auf dem Server oder auf einigen seiner Clients gültig.
    Lösung: Keine, der Link ist nicht überall unterbrochen.
  • Die Verknüpfung ist für Sie ungültig, da Sie nicht über die Berechtigung verfügen, ein Verzeichnis zu durchsuchen, um das Ziel zu erreichen. Für Benutzer mit entsprechenden Berechtigungen ist sie jedoch nicht ungültig.
    Auflösung: keine, der Link ist nicht für alle kaputt.
  • Der Link wird zum Speichern von Informationen verwendet, wie im Firefox-Sperrbeispiel von vinc17 . Ein Grund dafür ist, dass es einfacher ist, einen Symlink atomar aufzufüllen - es gibt keinen anderen Weg, wohingegen das atomare Auffüllen einer Datei komplexer ist: Sie müssen den Dateiinhalt unter einem temporären Namen erstellen und dann an die richtige Stelle verschieben und Veraltete temporäre Dateien behandeln, die von einem Absturz zurückgelassen wurden. Ein weiterer Grund ist, dass Symlinks in einigen Dateisystemen in der Regel direkt in ihrem Inode gespeichert sind, wodurch sie schneller gelesen werden als der Inhalt einer Datei.
    Auflösung: keine. In diesem Fall wäre das Entfernen des Links nachteilig.

Wenn Sie feststellen können, dass ein Symlink in die erste Kategorie fällt, löschen Sie ihn. Ansonsten enthalte dich.

Ein Programm, das Verzeichnisse rekursiv durchläuft und sich um den Inhalt von Dateien kümmert, sollte in der Regel unterbrochene symbolische Links ignorieren.

Gilles 'SO - hör auf böse zu sein'
quelle
Symlinks sind (normalerweise) nicht in ihrem übergeordneten Verzeichnis enthalten. Bei einigen Dateisystemen ist das Verknüpfungsziel jedoch im Inode gespeichert.
James Youngman
Sehr gute Liste. Ich habe eine Reihe von Links, die sowohl zu Typ 4 als auch zu Typ 6 gehören. Sie verweisen auf ein Dateisystem, das ich mit SSHFS einhänge. Wenn das Dateisystem nicht gemountet ist, sind sie vom Typ 4; Wenn das Dateisystem gemountet ist, kann nur ich darauf zugreifen, sodass sie für alle anderen vom Typ 6 sind (sogar für root).
Barmar
Ein weiterer möglicher Grund für einen fehlerhaften Symlink: Ein Symlink zu einer tatsächlichen Datei, die nur teilweise vorhanden ist. Beispiel: In einem Workflow mit tiefen Pfaden befindet sich möglicherweise ein Symlink zu einer Arbeitsdatei (aus Gründen der Übersichtlichkeit), die nach Abschluss des Workflows gelöscht wird, aber bei der nächsten Verwendung dieses Workflows erneut erstellt wird. / dev / modem ist ähnlich, weil die tatsächliche Gerätedatei, auf die es zeigt, nur existiert, wenn das physische Gerät verbunden ist.
Joe
ziemlich umfassende Antwort!
njzk2
1
@MichaelDurrant Uh? Der Punkt ist, dass der Nachteil (oder das Fehlen davon) davon abhängt, wie der fehlerhafte Symlink zustande kam.
Gilles 'SO- hör auf böse zu sein'
19

Entfernen Sie nicht blind alle baumelnden symbolischen Links. Sie sind möglicherweise nur zum Übertragen von Informationen vorhanden und möglicherweise sicherer als normale Dateien, da eine Symlink-Erstellung atomar ist.

Beispielsweise erstellt Firefox eine Sperrdatei "lock", die ein Symlink ist, dessen Wert eine Form wie "IP_address: + PID" hat.

vinc17
quelle
1
Ein Programm kann also eine leere Datei dynamisch mit Daten füllen, zu der einer dieser Symlinks nicht funktioniert, während das Programm nicht ausgeführt wird . Oder kann es nur eine Information sein?
blanket_cat
1
@knotech Der Zweck einiger Symlinks (die nicht unbedingt mit einem laufenden Programm verknüpft sind) kann nur darin bestehen, zu existieren. Ihr Wert ist entweder bedeutungslos oder vermittelt bestimmte Informationen. in beiden Fällen weisen sie im Allgemeinen auf nichts hin. Es gibt keine leere Datei, nur einen Symlink. Beachten Sie auch als Beispiel den Fall von gcc-Builds, die "Stempel-Bits" -Symlinks
erzeugen,
6

Sowohl der fnord als auch der Gatling- Webserver verwenden das Unix-Dateisystem als Konfigurationsdatenbank (im Gegensatz zu beispielsweise Microsoft IIS, das die Windows-Registrierung verwendet, oder Apache, das eine Konfigurationsdatei für komplexe Analyse verwendet).

Virtuelle Hosts sind beispielsweise nur Verzeichnisse, und das Erstellen eines neuen virtuellen Hosts ist so einfach wie

mkdir www.example.com:80

Konfigurieren, welche Dateien geliefert werden sollen

chmod o+r file_that_should_be_served
chmod o-r secret_passwords

Konfigurieren, welche Dateien als CGI ausgeführt werden sollen und welche als Serving?

chmod a-x plain_file.html
chmod a+x cgi_script.html

Und zum Schluss (und relevant für diese Frage): Eine Umleitung konfigurieren?

ln -s 'http://www.google.com/?q=awesome+query+site:www.example.com' search.html

Sie haben jetzt einen Symlink, search.htmlder angibt, welche Punkte nirgendwo liegen. Dies ist jedoch für die Funktionsweise Ihrer Website von entscheidender Bedeutung.

Jörg W. Mittag
quelle
0

Ein Symlink kann auf einen noch leeren Speicherort verweisen, um die Erstellung an einem bestimmten Dateisystemspeicherort oder -namen zu erzwingen.

Also nein - nicht blind entfernen.

Nils
quelle
0

Ein wesentlicher Nachteil beim Löschen veralteter symbolischer Links besteht darin, dass Sie den Verweis darauf verlieren, auf welche Stellen sie früher verwiesen haben, was sehr wertvoll sein kann!

Angenommen, ich habe einen symbolischen Link für eine Datei mit dem Namen " send_to", der auf eine nicht vorhandene Datei verweist ./Users/myname/tmp/Users/myname/tmp

Mit dem symbolischen Link weiß ich, wo die Datei sein sollte . In diesem Fall sehe ich beispielsweise, dass es sich um ein temporäres Verzeichnis handelt, und wenn ich es "reparieren" muss, sollte ich ein temporäres Verzeichnis als Ziel in Betracht ziehen.

" my_config" Ebenso ist ein Link , der /etc/conf_filedarauf hinweist, "schlecht", weil der conf_filein " " confirm_file umbenannt wurde, immer noch eine nützliche Information. Wenn Sie in das /etcVerzeichnis gegangen sind und eine haben lsund gesehen haben, dass die aufgerufene Datei conf_filefehlt, aber dort confirmation_filewar, haben Sie möglicherweise genug Informationen, um den Link jetzt zu reparieren.

Michael Durrant
quelle
-2

Zitieren von der Linux-Befehlszeile (das beste Buch aller Zeiten für Linux-Neulinge, das Sie hier kostenlos herunterladen können ):

Stellen Sie sich dieses Szenario vor: Ein Programm erfordert die Verwendung einer freigegebenen Ressource, die in einer Datei mit dem Namen "foo" enthalten ist, aber "foo" weist häufige Versionsänderungen auf. Es wäre gut, die Versionsnummer in den Dateinamen aufzunehmen, damit der Administrator oder eine andere interessierte Partei sehen kann, welche Version von "foo" installiert ist. Dies ist ein Problem. Wenn wir den Namen der freigegebenen Ressource ändern, müssen wir jedes Programm ausfindig machen, das sie verwendet, und bei jeder Installation einer neuen Version der Ressource nach einem neuen Ressourcennamen suchen. Das klingt überhaupt nicht nach Spaß.

Hier retten symbolische Links den Tag. Nehmen wir an, wir installieren Version 2.6 von "foo" mit dem Dateinamen "foo-2.6" und erstellen dann einen symbolischen Link mit dem Namen "foo", der auf "foo-2.6" verweist. Dies bedeutet, wenn ein Programm die Datei " foo “, es öffnet tatsächlich die Datei„ foo-2.6 “. Jetzt sind alle glücklich. Die Programme, die sich auf "foo" verlassen, können es finden und wir können immer noch sehen, welche aktuelle Version installiert ist. Wenn es Zeit ist, ein Upgrade auf „foo-2.7“ durchzuführen, fügen wir einfach die Datei zu unserem System hinzu, löschen den symbolischen Link „foo“ und erstellen einen neuen, der auf die neue Version verweist. Dies löst nicht nur das Problem des Versions-Upgrades, sondern ermöglicht es uns auch, beide Versionen auf unserem Computer zu belassen. Stellen Sie sich vor, „foo-2.7“ hat einen Fehler (verdammt diese Entwickler!) Und wir müssen zur alten Version zurückkehren. Nochmal,

Also nein, ich würde keine symbolischen Links löschen, da dies sicherlich Kopfzerbrechen mit sich bringt und Sie das Risiko eingehen, Ihr System ernsthaft zu beschädigen.

gacanepa
quelle
6
Das OP befürwortete nicht, Symlinks vor Gericht zu entfernen - nur defekte Symlinks, dh Symlinks, die nicht auf eine aktuell vorhandene Datei verweisen.
LSerni