Symbolische vs. harte Links unter Linux: Was Sie wissen müssen
Wichtige Erkenntnisse
- Links unter Linux sind wie Verknüpfungen: Verweise auf eine Datei, die diese nicht duplizieren.
- Ein symbolischer Link verweist nach Dateinamen, wird jedoch unterbrochen, wenn sein Ziel verschoben wird.
- Ein fester Link verweist auf den Inode einer Datei, was robuster, aber schwerer zu verstehen sein kann.
Unter Linux ist ein Link wie eine Verknüpfung zu einer Datei und gibt Ihnen große Entscheidungsfreiheit, wie Sie Ihr Dateisystem organisieren. Es gibt jedoch zwei Arten von Links, die sehr unterschiedlich sind.
Was sind Links unter Linux?
Unter Linux besteht eine Datei aus zwei Teilen: ihrem Namen und ihrem Inhalt. Eine Struktur namens „Inode“ verbindet einen Dateinamen mit den darin enthaltenen Daten. Dieser Inode speichert auch Metadaten über die Datei, wie ihren Besitzer, Berechtigungen und das Datum der letzten Änderung.
Ein Dateiname verweist einfach auf diese Inode-Struktur oder „verlinkt“ sie. Dies bedeutet, dass mehr als ein Dateiname auf dieselbe Struktur, d. h. dieselbe zugrunde liegende Datei, verweisen kann.
Einen Hardlink erstellen
Der Standard-Linktyp ist ein „Hardlink“. Sie können mit dem Befehl ln in dieser Form einen festen Link zu einer vorhandenen Datei erstellen:
ln existing_file new_hard_link
Sie haben jetzt zwei Dateinamen, die auf denselben Inode verweisen. Es ist wichtig zu verstehen, dass es sich hier tatsächlich nur um eine Datei handelt, die zufällig zwei Dateinamen hat. Sie können also entweder den Namen (oder den Pfad) verwenden, um auf dieselbe Datei zu verweisen, und alles bleibt synchronisiert.
Probieren Sie es aus und Sie werden sehen, was los ist. Beginnen Sie mit dem Kopieren einer Datei wie gewohnt, indem Sie den Befehl cp verwenden:
echo "hello world" > foo
cp foo bar
ls -li
cat foo bar
Wenn Sie die Option i an ls übergeben, wird es angewiesen, die Inode-Nummer jeder Datei am Anfang der Zeile auszugeben. Beachten Sie, dass die neue Datei einen eigenen Inode hat, aber denselben Inhalt wie das Original hat.
Erstellen Sie nun einen Hardlink zur Originaldatei und vergleichen Sie diese:
ln foo hum
ls -li
cat foo bar hum
Beachten Sie, dass der Hardlink denselben Inode wie die Originaldatei hat: 43458473. Sowohl foo als auch hum verweisen auf dieselbe zugrunde liegende Datei. Beachten Sie auch die Zahl in der dritten Spalte, direkt rechts neben den Berechtigungen. Für die Originaldatei (foo) und den Hardlink (hum) lautet dieser „2“, für die Kopie (bar) jedoch „1“. Diese Zahl stellt die Gesamtzahl der Hardlinks zu dieser Datei dar.
Das Neuzeichnen des ersten Diagramms, um die Originaldatei und ihren festen Link darzustellen, ergibt:
Es gibt keinen nennenswerten Unterschied zwischen der Originaldatei und dem Hardlink. Tatsächlich handelt es sich bei beiden um „Links“ im Sinne von Linux, und deshalb gibt es einen Unlink-Befehl, der die gleiche Aufgabe erfüllt wie rm, um eine Datei zu löschen.
Durch die Auflistung der Inode-Nummern können Sie bestätigen, dass es tatsächlich nur eine tatsächliche Datei für die beiden Dateinamen gibt. Wenn Sie immer noch Zweifel haben, versuchen Sie, den Inhalt einer der beiden Dateien zu ändern:
echo "some new contents" > hum
cat foo
Erstellen eines symbolischen (weichen) Links
Mit symbolischen Links (Symlinks) können Sie auch an mehreren Orten auf dieselbe Datei verweisen. Der Unterschied besteht darin, dass Hardlinks auf Inodes verweisen, Softlinks jedoch über den Dateinamen auf andere Dateien verweisen. Sie verwenden immer noch den Befehl ln, um einen Symlink zu erstellen, übergeben aber auch das Flag -s (symbolisch):
ln -s existing_file new_soft_link
Ein symbolischer Link ist eine eigenständige Datei; es hat einen Inode mit eigenem Inhalt. Der Inhalt eines Symlinks ist jedoch nichts anderes als ein Dateiname, ein Verweis auf eine separate Datei, für die der Symlink als Proxy fungieren soll. Im Inode des Symlinks gespeicherte Metadaten kennzeichnen ihn explizit als symbolischen Link, sodass jedes Programm, das ihn verwendet, weiß, dass es stattdessen den Dateinamen abrufen muss, auf den es verweist.
Hier ist ein Beispiel:
ln -s foo baz
cat baz
ls -li
Beachten Sie, dass dies dem Hard-Link-Fall ziemlich ähnlich sieht, die Ausgabe von ls jedoch ganz anders ist. Zunächst wird der Symlink ganz am Anfang der Berechtigungen mit einem „l“ (Link) gekennzeichnet. Noch nützlicher ist jedoch, dass der Dateiname des Symlinks rosa gefärbt ist und gefolgt von einem Pfeil und dem ursprünglichen Dateinamen.
Die Beziehung zwischen dem Symlink und der Originaldatei sieht etwa so aus:
Wenn Sie einen Symlink erstellen, können Sie genau auswählen, wie auf die Datei verwiesen werden soll, auf die er verweist. Im vorherigen Beispiel wird lediglich ein einfacher Dateiname verwendet, der eine relative Referenz auf eine Datei im selben Verzeichnis darstellt. Sie können jedoch jeden gültigen Pfad verwenden, egal ob relativ oder absolut, zum Beispiel:
ln -s foo sub/dir/baz
ln -s foo ../../baz
ln -s foo /tmp/baz
Möglicherweise haben Sie hier bereits einen Fehler entdeckt: Was passiert, wenn die Originaldatei ihren Namen oder Speicherort ändert? Was passiert eigentlich, wenn die Symlink-Datei ihren Speicherort ändert? Nun, je nachdem, welchen Pfadtyp Sie verwenden – relativ oder absolut – und je nachdem, ob beide Dateien oder nur eine verschoben werden, ist das möglicherweise in Ordnung. Aber Sie müssen vorsichtig sein.
Wann sollten Sie Hard- oder Softlinks verwenden?
Eine häufige Verwendung von Symlinks ist die Verwaltung installierter Software. Auf meinem System habe ich beispielsweise vim – den Texteditor – und vi, den älteren Editor, aus dem er hervorgegangen ist. Sie werden wie folgt installiert:
Mit diesem Setup verwendet jedes Skript, das vi verwendet, stattdessen stillschweigend vim.
Beide Arten von Links eignen sich gut für die Dateisystemverwaltung. Mithilfe von Links können Sie Ihre Dateien und Verzeichnisse organisieren und so den Zugriff darauf erleichtern, ohne Speicherplatz zu verschwenden. Zum Beispiel:
# Create a hard link to the apache log file in home directory
~ $ ln /var/log/apache2/access_log apache-log
# Create a soft link to a deeply-nested directory
~ $ ln -s ./work/acme/2024/10 current-work
Links können sehr nützlich sein, um zwischen verschiedenen Dateien zu wechseln, ohne sie ändern zu müssen. Stellen Sie sich zum Beispiel vor, Sie hätten eine Konfigurationsdatei, conf, die von einer Software verwendet wird. Sie können mehrere Konfigurationen erstellen, sie in separaten Dateien speichern und dann über Links zwischen ihnen wechseln:
# Create two config files
config $ mv conf dark.conf
config $ cp dark.conf light.conf
# Use the dark config
config $ ln -s dark.conf conf
# Switch to the light config. Note -f to force overwrite of existing link.
config $ ln -fs light.conf conf
Ein Softlink funktioniert so lange, bis die Datei, auf die er verweist, verschoben oder umbenannt wird. Dann wird er zu einem defekten Link:
Aus diesem Grund funktionieren Softlinks häufig am besten in einem engen Bereich, wenn sich beispielsweise eine Datei und ihr Link im selben Verzeichnis befinden.
Bei Hardlinks besteht dieses Problem nicht. Sie können sie sicher an eine beliebige Stelle innerhalb desselben Dateisystems verschieben. Sie leiden jedoch unter einem anderen Problem. Einige Editoren – und andere Programme, die eine Datei bearbeiten – erstellen zu Sicherungszwecken eine Kopie einer Datei und benennen sie beim Speichern um. Dieses Verhalten kann dazu führen, dass Hardlinks nicht mehr synchron sind und doppelt so viel Speicherplatz beanspruchen. Sie müssen die Programme, mit denen Sie Hardlinks bearbeiten, sorgfältig überprüfen, um sicherzustellen, dass sie dies nicht tun.
Wenn Sie auf ein Verzeichnis verlinken, ist ein Softlink Ihre einzige Option. Hardlinks machen bei Verzeichnissen einfach keinen Sinn und würden mehr Probleme verursachen als lösen. Hardlinks können auch nicht in einem Git-Repository gespeichert werden.
In der Befehlszeile ist ein Hardlink die Standardeinstellung, aber GUIs – wie zum Beispiel Nautilus – unterstützen normalerweise nur Softlinks. Selbst dann müssen Sie die Option über die Einstellungen aktivieren:
Das Konzept eines Softlinks ist etwas einfacher zu verstehen und möglicherweise sicherer. Softlinks sind sichtbarer, beliebter und im Allgemeinen leichter zu verstehen.
Welche Art von Link Sie auch verwenden, es kann einige Zeit und Übung erfordern, sich mit dem Konzept vertraut zu machen. Aber Links sind sehr wirkungsvoll und beliebt, sodass Sie den Nutzen daraus spüren werden. Stellen Sie sicher, dass Sie ls verwenden, um den Überblick über Links zu behalten, und versuchen Sie, es nicht zu übertreiben!