Links unter Linux ermöglichen es, auf Dateien und Verzeichnisse von mehreren Orten aus zuzugreifen. Symbolic Links und Hard Links funktionieren unterschiedlich.

Grundkonzept

Inode erklärt

Jede Datei hat einen Inode (Index Node):

┌─────────────────────────┐
│        Inode 12345      │
├─────────────────────────┤
│ Berechtigungen          │
│ Eigentümer              │
│ Größe                   │
│ Zeitstempel             │
│ Zeiger auf Datenblöcke  │
└─────────────────────────┘
           ↓
┌─────────────────────────┐
│    Datenblöcke          │
│    (Dateiinhalt)        │
└─────────────────────────┘

Der Dateiname ist nur ein Verweis auf den Inode.

Mehrere Namen zeigen auf denselben Inode:

datei.txt ──────┐
                ├──→ Inode 12345 → Daten
hardlink.txt ───┘

Ein Verweis auf einen Dateinamen (Pfad):

symlink.txt → datei.txt → Inode 12345 → Daten

Vergleich

| Eigenschaft | Hard Link | Symbolic Link | |-------------|-----------|---------------| | Zeigt auf | Inode | Pfad (Name) | | Verzeichnisse | Nein | Ja | | Dateisystem-übergreifend | Nein | Ja | | Funktioniert wenn Original gelöscht | Ja | Nein (dangling) | | Eigene Berechtigungen | Nein | Ja (meist ignoriert) | | Erkennung | Schwer | Einfach |

Grundsyntax

ln -s ziel link-name

Beispiele

# Symlink für Datei
ln -s /var/log/syslog ~/syslog-link

# Symlink für Verzeichnis
ln -s /var/www/html ~/webroot

# Relativer Symlink
cd /home/user
ln -s ../shared/config.txt config.txt

Prüfen

# Symlink anzeigen
ls -l symlink.txt
# Ausgabe: lrwxrwxrwx ... symlink.txt -> /pfad/zur/datei.txt

# Ziel auflösen
readlink symlink.txt
readlink -f symlink.txt  # Vollständiger Pfad

Grundsyntax

ln ziel link-name

Beispiele

# Hard Link erstellen
ln original.txt hardlink.txt

# Beide zeigen auf gleiche Daten
echo "Hallo" > original.txt
cat hardlink.txt  # Gibt "Hallo" aus

Inode prüfen

# Inode-Nummer anzeigen
ls -li original.txt hardlink.txt

# Ausgabe (gleiche Inode!):
# 12345 -rw-r--r-- 2 user user 6 Jan 26 10:00 original.txt
# 12345 -rw-r--r-- 2 user user 6 Jan 26 10:00 hardlink.txt

Praktische Anwendungsfälle

# Nginx Sites aktivieren
ln -s /etc/nginx/sites-available/mysite \
      /etc/nginx/sites-enabled/mysite

# Deaktivieren = Symlink löschen
rm /etc/nginx/sites-enabled/mysite
# Mehrere Node.js-Versionen
/opt/node-16/
/opt/node-18/
/opt/node-20/

# Aktive Version als Symlink
ln -s /opt/node-20 /opt/node

# PATH zeigt auf /opt/node/bin
# Wechsel: Symlink ändern
ln -sfn /opt/node-18 /opt/node
# Geteilte Konfiguration für mehrere Websites
/var/www/site1/shared-config.php -> /var/www/shared/config.php
/var/www/site2/shared-config.php -> /var/www/shared/config.php
# rsync mit Hard Links für inkrementelle Backups
rsync -av --link-dest=/backup/daily.1 \
      /data/ /backup/daily.0/

# Unveränderte Dateien werden verlinkt, nicht kopiert
# Spart enorm Speicherplatz
# Hard Link als "Backup"
ln wichtig.txt wichtig-backup.txt

# Wenn wichtig.txt gelöscht wird:
rm wichtig.txt
# Daten bleiben über wichtig-backup.txt erreichbar!
# Symlink-Berechtigungen sind meist 777 (werden ignoriert)
ls -l
# lrwxrwxrwx ... link -> target

# Es gelten die Berechtigungen des Ziels
chmod 000 target.txt
cat link  # Permission denied
# Symlink auf Verzeichnis
ln -s /var/log ~/logs

# Navigation
cd ~/logs        # Funktioniert
ls ~/logs        # Zeigt /var/log Inhalt

# Vorsicht bei relativen Pfaden!
cd /home/user
ln -s ../logs ~/loglink
# Symlink enthält: ../logs
# Funktioniert nur wenn Ziel relativ zum Link existiert
# Symlink erstellen
ln -s /tmp/testfile link

# Original löschen
rm /tmp/testfile

# Symlink ist nun "dangling"
ls -l link
# lrwxrwxrwx ... link -> /tmp/testfile (rot in vielen Terminals)

cat link
# cat: link: No such file or directory
# Alle defekten Symlinks im Verzeichnis finden
find /pfad -xtype l

# System-weit (langsam)
find / -xtype l 2>/dev/null

Wichtige Optionen

# -f: Existierendes Ziel überschreiben
ln -sf neues-ziel link

# -n: Symlink auf Verzeichnis nicht folgen
ln -sfn neues-verzeichnis link

# -v: Verbose (zeigt was passiert)
ln -sv ziel link
# -f: Existierendes Ziel überschreiben
ln -f original hardlink

# -b: Backup des Ziels erstellen
ln -b original hardlink
# Symlink löschen (nicht das Ziel!)
rm symlink

# Vorsicht bei Verzeichnis-Symlinks:
rm symlink       # Korrekt: löscht den Link
rm symlink/      # FALSCH: versucht Verzeichnisinhalt zu löschen

# Sicher: unlink verwenden
unlink symlink
if [ -L "$datei" ]; then
    echo "$datei ist ein Symlink"
fi

# Prüfen ob existierender Symlink
if [ -L "$datei" ] && [ -e "$datei" ]; then
    echo "Gültiger Symlink"
fi

Ziel ermitteln

# Direktes Ziel
target=$(readlink "$symlink")

# Vollständig aufgelöster Pfad
target=$(readlink -f "$symlink")

# Kanonischer Pfad (auch für normale Dateien)
realpath "$datei"

Häufige Probleme

Problem: Relativer vs. absoluter Pfad

# Absoluter Pfad (empfohlen für System-Symlinks)
ln -s /var/www/html /home/user/webroot
# Funktioniert immer

# Relativer Pfad (kann brechen)
cd /home/user
ln -s ../../../var/www/html webroot
# Funktioniert nur von /home/user aus
ln -s b a
ln -s a b

ls -l
# a -> b
# b -> a

cat a
# Too many levels of symbolic links
# Falsch: Erstellt Link im aktuellen Verzeichnis
ln -s /etc/nginx/sites-available/site

# Richtig: Zielverzeichnis angeben
ln -s /etc/nginx/sites-available/site /etc/nginx/sites-enabled/

Best Practices

1. Absolute Pfade für System-Symlinks verwenden 2. Relative Pfade nur bei beweglichen Strukturen 3. Symlinks für Verzeichnisse und Dateisystem-übergreifend 4. Hard Links für Backup-Szenarien und Datensicherheit 5. Regelmäßig auf dangling Symlinks prüfen 6. -n Option beim Überschreiben von Verzeichnis-Symlinks

Fazit

Symbolic Links sind flexibler und häufiger im Einsatz – sie funktionieren mit Verzeichnissen und über Dateisysteme hinweg. Hard Links sind für spezielle Fälle wie inkrementelle Backups nützlich. Verstehen Sie den Unterschied zwischen Inode-Verweis (Hard Link) und Pfad-Verweis (Symlink), um die richtige Wahl zu treffen.