VMware ESXi and vSphere Cluster Management
Harte Links unter Linux verstehen und verwenden
Lerne, was harte Links unter Linux sind, wie Inodes und Link-Anzahlen funktionieren und wie sich Hardlinks beim Ändern und Löschen verhalten.
Ein harter Link, auch Hardlink genannt, ist ein zusätzlicher Verzeichniseintrag für dieselbe Datei. Zwei Namen können dadurch auf denselben Dateiinhalt und dieselben Metadaten zugreifen.
Wichtig: Die Dateinamen zeigen nicht aufeinander. Beide Verzeichniseinträge verweisen direkt auf denselben Inode. Keiner der Namen ist technisch der bevorzugte oder der „eigentliche“ Name der Datei.
Voraussetzungen
Für die Beispiele genügen grundlegende Kenntnisse im Linux-Terminal sowie die Befehle ls, cat und rm. Die Befehle sollten in einem eigenen Testverzeichnis ausgeführt werden.
Inodes und Verzeichniseinträge
Ein Inode ist eine Datenstruktur des Dateisystems. Er enthält unter anderem Dateimetadaten wie Besitzer, Rechte, Zeitstempel und Dateigröße sowie die Zuordnung zu den eigentlichen Dateidaten.
Ein Verzeichnis speichert nicht den gesamten Dateiinhalt. Ein Verzeichniseintrag ordnet einen Dateinamen einer Inode-Nummer zu. Bei einem Hardlink gibt es mehrere solche Zuordnungen für denselben Inode.
- Dateiname: der Name, unter dem eine Datei in einem Verzeichnis erreichbar ist.
- Verzeichniseintrag: die Zuordnung zwischen einem Namen und einer Inode-Nummer.
- Inode: der Datensatz mit Metadaten und der Referenz auf die Dateidaten.
- Link-Anzahl: die Anzahl der Verzeichniseinträge, die auf diesen Inode verweisen.
Die Option -i von ls zeigt die Inode-Nummer. Die Option -l zeigt unter anderem die Link-Anzahl.
ls -li datei.txt
In der Ausgabe steht die Inode-Nummer typischerweise in der ersten Spalte. Die Link-Anzahl folgt in der Spalte für die Dateirechte beziehungsweise direkt danach, abhängig von der verwendeten Linux-Distribution und der Darstellung von ls.
Einen harten Link erstellen
Die grundlegende Syntax lautet:
ln AUSGANGSDATEI NEUER_NAME
Die erste Angabe ist die bereits vorhandene Datei. Die zweite Angabe ist der neue Verzeichniseintrag. Ohne die Option -s erstellt ln einen harten Link.
Praktisches Beispiel
Zuerst wird eine Testdatei mit Beispielinhalt angelegt:
printf 'Erster Inhalt
' > original_file.txt
Nun erhält dieselbe Datei einen zweiten Namen:
ln original_file.txt hlink.lnk
Beide Namen können anschließend gemeinsam untersucht werden:
ls -li original_file.txt hlink.lnk
Die beiden Zeilen müssen dieselbe Inode-Nummer zeigen. Außerdem ist die Link-Anzahl gegenüber einer Datei mit nur einem Verzeichniseintrag um eins gestiegen. Dadurch lässt sich ein Hardlink von einer Kopie unterscheiden: Eine Kopie besitzt normalerweise eine eigene Inode-Nummer.
Lesen und Ändern über beide Namen
Beide Namen liefern denselben Inhalt:
cat original_file.txt
cat hlink.lnk
Eine Änderung über einen Namen ist unmittelbar über den anderen Namen sichtbar:
printf 'Neuer Inhalt
' > hlink.lnk
cat hlink.lnk
cat original_file.txt
Beide cat-Befehle geben Neuer Inhalt aus. Der Vorgang ändert nicht eine Kopie, sondern die Daten, auf die der gemeinsame Inode verweist.
Löschen und Lebensdauer der Datei
Der Befehl rm entfernt zunächst einen Verzeichniseintrag. Er löscht nicht zwangsläufig sofort die Dateidaten.
Solange mindestens ein weiterer harter Link auf den Inode verweist, bleiben die Daten über diesen Namen erreichbar:
rm original_file.txt
cat hlink.lnk
ls -li hlink.lnk
Nach dem Entfernen von original_file.txt ist hlink.lnk weiterhin vorhanden und enthält den bisherigen Inhalt. Die Link-Anzahl beträgt nun wieder eins.
Erst wenn der letzte Verzeichniseintrag entfernt wird, ist die Datei über diese Namen nicht mehr erreichbar:
rm hlink.lnk
ls -li hlink.lnk
Der letzte Befehl meldet, dass die Datei nicht gefunden wurde. Das Dateisystem kann die zugehörigen Daten anschließend freigeben, sofern kein anderer Zugriff, etwa durch einen noch geöffneten Prozess, besteht.
Zustände bei mehreren harten Links
| Aktion | Vorhandene Dateinamen | Erwartete Link-Anzahl | Zugriff auf Inhalt möglich |
|---|---|---|---|
| Datei anlegen | original_file.txt | 1 | Ja |
| Hardlink anlegen | original_file.txt, hlink.lnk | 2 | Ja, über beide Namen |
| Ersten Namen löschen | hlink.lnk | 1 | Ja, über den verbleibenden Namen |
| Letzten Namen löschen | Keiner | 0 | Nein über diese Verzeichniseinträge |
Einschränkungen harter Links
Ein Hardlink kann nur innerhalb desselben Dateisystems angelegt werden. Ein Dateisystem ist der Speicherbereich, den Linux als zusammenhängenden Dateisystembereich eingebunden hat. Umgangssprachlich wird hierfür oft auch „dieselbe Partition“ gesagt; technisch ist entscheidend, ob Quelle und Ziel im selben eingehängten Dateisystem liegen.
Liegt die Quelldatei beispielsweise auf einem Dateisystem und der Zielpfad auf einem anderen Mountpoint, kann ln keinen gemeinsamen Inode einrichten. In diesem Fall erscheint eine Fehlermeldung wie „Invalid cross-device link“ oder eine sinngemäße Meldung in deutscher Sprache.
Im üblichen Linux-Einsatz werden harte Links für reguläre Dateien verwendet. Harte Links auf Verzeichnisse sind für normale Benutzer nicht erlaubt, weil sie die Struktur des Dateisystems und die Navigation durch Verzeichnisse problematisch machen würden.
Harte und symbolische Links im Vergleich
Ein symbolischer Link, kurz Symlink, ist eine andere Link-Art. Er ist ein eigener Dateityp, der einen Pfad als Ziel speichert. Ein Hardlink dagegen verweist direkt auf denselben Inode wie der andere Verzeichniseintrag.
| Merkmal | Harter Link | Symbolischer Link |
|---|---|---|
| Verweisart | Zusätzlicher Verzeichniseintrag für dieselbe Datei | Eigene Datei mit gespeichertem Zielpfad |
| Bezug zu Inode oder Pfad | Verweist auf denselben Inode | Speichert einen Pfad als Verweisziel und besitzt selbst einen Inode |
| Dateisystemgrenzen | Nur innerhalb desselben Dateisystems möglich | Kann auf ein anderes Dateisystem oder einen anderen Mountpoint zeigen |
| Nach dem Löschen eines Namens oder Ziels | Ein anderer Hardlink funktioniert weiter, solange mindestens einer vorhanden ist | Wird ungültig, wenn sein Ziel gelöscht oder verschoben wird |
Erkennbarkeit mit ls | Gleiche Inode-Nummer wie das Ziel und erhöhte Link-Anzahl | Eigener Inode; ls -l zeigt typischerweise -> und den Zielpfad |
Typische Erstellung mit ln | ln quelle ziel | ln -s quelle ziel |
Ein symbolischer Link lässt sich zum Vergleich so erstellen:
ln -s original_file.txt symlink.lnk
Wird danach original_file.txt gelöscht, kann symlink.lnk nicht mehr auf die Zieldatei zugreifen. Ein vorhandener Hardlink würde dagegen weiter funktionieren, weil er nicht vom Namen original_file.txt abhängt.
Typische Fehler und Lösungen
ln meldet einen Fehler zwischen verschiedenen Speicherbereichen
Ursache: Quelle und Ziel liegen in unterschiedlichen Dateisystemen.
Lösung: Den Hardlink innerhalb desselben Dateisystems anlegen. Wenn ein dateisystemübergreifender Verweis benötigt wird, stattdessen einen symbolischen Link verwenden.
Die Datei ist nach dem Löschen des ersten Namens noch erreichbar
Das ist das erwartete Verhalten. Der verbleibende Name ist ein weiterer Verzeichniseintrag für denselben Inode. Mit ls -li hlink.lnk lässt sich die verbliebene Link-Anzahl prüfen.
Die Datei scheint nach dem Löschen verschwunden zu sein
Möglicherweise wurde der letzte Hardlink entfernt oder es gab von Anfang an nur einen Dateinamen. Vor dem Löschen hilft:
ls -li original_file.txt hlink.lnk
Prüfe dabei die vorhandenen Namen und die Link-Anzahl.
Die Inode-Nummern unterscheiden sich
Dann wurde wahrscheinlich eine Kopie erstellt oder ein symbolischer Link angelegt. Für einen Hardlink muss ln ohne -s verwendet werden:
ln original_file.txt hlink.lnk
ls -li original_file.txt hlink.lnk
Identische Inode-Nummern und eine gemeinsame Link-Anzahl bestätigen den Hardlink.
Prüfungsrelevante Zusammenfassung
- Ein Hardlink ist ein zusätzlicher Verzeichniseintrag für dieselbe Datei.
- Mehrere Namen verweisen auf denselben Inode; kein Name ist technisch das Original.
ls -lizeigt Inode-Nummer und Link-Anzahl.ln quelle zielerstellt einen harten Link, sofern beide Pfade im selben Dateisystem liegen.- Änderungen über einen Namen sind über alle anderen Hardlink-Namen sichtbar.
rmentfernt einen Namen. Die Daten bleiben erreichbar, solange mindestens ein Hardlink besteht.- Ein Symlink speichert einen Pfad, hat einen eigenen Inode und kann nach dem Löschen seines Ziels ungültig werden.
Weitere Grundlagen findest du unter Harte Links unter Linux.