Dateisystem-Hierarchie: Der Verzeichnisbaum

Dateisystem-Hierarchie: Der Verzeichnisbaum

Standard-Verzeichnisse /, /bin, /etc, /home, /var, /usr, /tmp und ihre Zwecke. Unterschied zwischen /bin und /usr/bin. Rolle von tmpfs und separate /var-Partition.

Linux und BSD organisieren alle Dateien in einem einzigen Verzeichnisbaum, der bei / (Root) beginnt. Jedes Verzeichnis hat einen definierten Zweck - /etc enthält Konfigurationsdateien, /var veränderliche Daten, /home Benutzer-Verzeichnisse. Diese klare Struktur ermöglicht Navigation und Wartung über alle Unix-Systeme hinweg.

Der Filesystem Hierarchy Standard (FHS) definiert diese Struktur seit 1994. Linux-Distributionen folgen diesem Standard weitgehend, BSD-Systeme haben eigene Konventionen mit ähnlichen Prinzipien. Die Grundstruktur bleibt identisch - wer sie einmal verstanden hat, findet sich auf jedem System zurecht.

Das Root-Verzeichnis (/)

Das Root-Verzeichnis bildet die Wurzel des gesamten Dateisystems. Alle anderen Verzeichnisse und Dateien zweigen von hier ab. /home/michael/dokumente/bericht.pdf ist der vollständige Pfad mit / als Ausgangspunkt - das erste / bezeichnet das Root-Verzeichnis, die weiteren / trennen Verzeichnisebenen.

Unix kennt keine Laufwerksbuchstaben wie Windows (C:, D:). USB-Sticks, Netzwerk-Shares oder zusätzliche Festplatten werden in den bestehenden Baum eingehängt (mounted) - typischerweise unter /mnt oder /media. Der Nutzer sieht einen nahtlosen Verzeichnisbaum, auch wenn Dateien physisch auf verschiedenen Datenträgern liegen.

Das Root-Verzeichnis selbst sollte klein bleiben. Viele Systeme verwenden separate Partitionen für /home, /var oder /usr - ein vollgelaufenes /var/log kann dann nicht das Root-Dateisystem blockieren. Ein 100% volles / macht das System unbootbar, da keine temporären Dateien mehr angelegt werden können.

System-Verzeichnisse für Programme

/bin - Essentielle Kommandos

Das /bin-Verzeichnis enthält grundlegende Programme, die zum Booten und zur System-Reparatur benötigt werden. ls, cp, mv, cat, mkdir und die Shell (bash, sh) liegen hier. Diese Programme funktionieren auch im Single-User-Modus, wenn /usr noch nicht gemountet ist.

$ ls -l /bin/
lrwxrwxrwx 1 root root 7 Apr 15  2024 /bin -> usr/bin

Moderne Linux-Distributionen verwenden /bin oft als symbolischen Link auf /usr/bin. Die historische Trennung hatte praktische Gründe: /bin musste auf der Root-Partition liegen und früh beim Boot verfügbar sein, /usr/bin konnte auf einer separaten Partition liegen. Diese Unterscheidung ist heute weniger relevant - die meisten Systeme mounten /usr beim Boot automatisch.

/sbin - System-Administration

/sbin enthält Programme für System-Verwaltung, die typischerweise Root-Rechte benötigen. fdisk für Partitionierung, fsck für Dateisystem-Checks, reboot und shutdown liegen hier. Normale Benutzer können diese Programme meist nicht ausführen - /sbin ist nicht im Standard-PATH.

$ ls /sbin/ | head -5
fsck
fsck.ext4
mkfs
mkfs.ext4
reboot

Auch /sbin ist auf modernen Systemen oft ein Link auf /usr/sbin. Die Trennung zwischen /bin und /sbin zeigt die Unterscheidung zwischen allgemeinen Kommandos (alle Benutzer) und Verwaltungs-Werkzeugen (primär Root).

/usr - Unix System Resources

Das /usr-Verzeichnis enthält den Großteil der installierten Software. Die Bezeichnung stammt aus den 1970ern, als /usr tatsächlich Benutzer-Verzeichnisse enthielt - heute ist es das Gegenteil von benutzerspezifischen Daten.

/usr/bin enthält die meisten Programme, die Benutzer täglich nutzen: Editoren, Compiler, Netzwerk-Tools. /usr/sbin hat zusätzliche Verwaltungs-Programme. /usr/lib enthält Bibliotheken, /usr/share architektur-unabhängige Daten wie Dokumentation oder Icons.

$ du -sh /usr
5,2G    /usr

/usr ist read-only für normale Benutzer. Nur der Paketmanager (apt, pacman, pkg_add) schreibt hier - bei Software-Installation oder -Updates. Diese Trennung zwischen System-Software (/usr) und veränderlichen Daten (/var, /home) ermöglicht einfachere Backups und Snapshots.

/usr/local - Lokale Zusatz-Software

/usr/local folgt der gleichen Struktur wie /usr mit /usr/local/bin, /usr/local/lib, etc. Hier installiert Software, die nicht über den Paketmanager kommt - selbst kompilierte Programme oder manuell installierte Anwendungen.

Der Paketmanager berührt /usr/local nie. Bei System-Updates oder Neuinstallationen bleibt dieser Bereich unverändert. Die klare Trennung verhindert Konflikte zwischen System-Paketen und manuell installierter Software.

Konfigurations- und Daten-Verzeichnisse

/etc - System-Konfiguration

Das /etc-Verzeichnis enthält alle System- und Service-Konfigurationsdateien. Die Namensherkunft ist unklar - “et cetera” oder “editable text configuration” sind populäre Theorien. Tatsache ist: Hier liegen die Konfigurationsdateien.

/etc/hostname definiert den Systemnamen, /etc/hosts die lokale DNS-Auflösung, /etc/fstab die zu mountenden Dateisysteme. Jeder Service hat typischerweise ein Unterverzeichnis oder eine Konfigurationsdatei: /etc/ssh/sshd_config für den SSH-Server, /etc/nginx/nginx.conf für nginx.

$ ls /etc/ | wc -l
247

Ein frisches Debian-System hat bereits über 200 Dateien und Verzeichnisse in /etc. Die meisten sind textbasiert und mit einem Editor änderbar. Distributions-spezifische Unterschiede zeigen sich hier deutlich - /etc/apt/ existiert nur auf Debian-basierten Systemen, /etc/pkg/ nur auf OpenBSD.

Konfigurationsänderungen in /etc werden nicht bei System-Updates überschrieben. Der Paketmanager erstellt .dpkg-old Backups (Debian) oder fragt nach, wenn Konflikte entstehen. Diese Stabilität ermöglicht verlässliche System-Konfiguration über Jahre hinweg.

/var - Veränderliche Daten

Das /var-Verzeichnis enthält Daten, die sich während des Betriebs ändern. Der Name kommt von “variable” - im Gegensatz zu den statischen Dateien in /usr.

/var/log sammelt Log-Dateien aller Services. /var/cache speichert temporäre Cache-Daten. /var/spool enthält Warteschlangen - Druckaufträge in /var/spool/cups, E-Mails in /var/spool/mail. /var/lib hat Service-spezifische Datenbanken und Zustände.

$ du -sh /var/*
24M     /var/cache
4,0K    /var/crash
892M    /var/lib
16K     /var/local
4,0K    /var/lock
847M    /var/log

Log-Dateien in /var/log wachsen kontinuierlich. Ohne Rotation erreichen sie Gigabyte-Größen und füllen die Partition. Moderne Systeme verwenden logrotate, um alte Logs zu komprimieren und zu löschen. Ein vollgelaufenes /var blockiert viele Services - sie können keine Logs mehr schreiben und stellen den Betrieb ein.

Viele Admins verwenden eine separate Partition für /var. Ein vollgelaufenes /var/log blockiert dann nicht das Root-Dateisystem. Das System bleibt bootbar, auch wenn /var 100% voll ist - der Admin kann sich einloggen und aufräumen.

/tmp - Temporäre Dateien

Das /tmp-Verzeichnis bietet Speicher für kurzlebige Dateien. Alle Programme und Benutzer können hier schreiben. Die Dateien werden beim Reboot gelöscht - /tmp ist nicht für dauerhafte Speicherung gedacht.

Viele moderne Systeme verwenden tmpfs für /tmp - ein RAM-basiertes Dateisystem. Schreibvorgänge nach /tmp landen dann im Arbeitsspeicher statt auf der Festplatte. Das ist schneller und schont SSDs. Der Nachteil: Große temporäre Dateien belegen RAM. Ein tmpfs für /tmp ist typischerweise auf 50% des verfügbaren RAMs begrenzt.

$ df -h /tmp
Dateisystem    Größe Benutzt Verf. Verw% Eingehängt auf
tmpfs           7,8G    156M  7,7G    2% /tmp

/var/tmp ist eine Alternative für temporäre Dateien, die Reboots überleben sollen. Programme verwenden /var/tmp für größere temporäre Daten oder wenn Persistenz über Reboots gewünscht ist. /var/tmp liegt auf der Festplatte, nicht im RAM.

Benutzer-bezogene Verzeichnisse

/home - Benutzer-Verzeichnisse

Das /home-Verzeichnis enthält die persönlichen Verzeichnisse aller normalen Benutzer. Jeder Benutzer hat ein Unterverzeichnis: /home/michael, /home/sandra. Hier liegen Dokumente, Downloads, Konfigurationsdateien und alle persönlichen Daten.

Benutzer haben vollständige Kontrolle über ihr eigenes /home-Verzeichnis. Andere Benutzer können standardmäßig nicht hineinschauen - die Berechtigungen schützen private Daten. Root kann alle /home-Verzeichnisse lesen, normale Benutzer nur das eigene.

$ ls -ld /home/michael
drwxr-x--- 42 michael michael 4096 Okt  6 14:23 /home/michael

Viele Admins verwenden eine separate Partition für /home. Bei Neuinstallation oder Distribution-Wechsel bleibt /home unberührt - nur das System wird neu installiert. Die persönlichen Daten, Konfigurationen und Projekte bleiben erhalten.

Versteckte Dateien (beginnend mit .) in /home enthalten Programm-Konfigurationen: .bashrc für die Shell, .gitconfig für Git, .ssh/ für SSH-Keys. Diese Dateien definieren die Arbeitsumgebung eines Benutzers - nach System-Neuinstallation funktioniert alles wie vorher.

/root - Root-Benutzer-Verzeichnis

Das /root-Verzeichnis ist das Home-Verzeichnis des Root-Benutzers. Es liegt nicht unter /home/root, sondern direkt auf der Root-Partition. Der Grund: Root muss sich auch dann einloggen können, wenn /home auf einer separaten Partition liegt und nicht mountbar ist.

/root folgt den gleichen Prinzipien wie normale Benutzer-Verzeichnisse. Versteckte Dateien wie /root/.bashrc konfigurieren die Root-Shell. Nur der Root-Benutzer kann auf /root zugreifen - normale Benutzer sehen nicht einmal den Inhalt.

$ sudo ls -ld /root
drwx------ 8 root root 4096 Sep 28 09:12 /root

Die Berechtigungen drwx------ zeigen: Nur der Eigentümer (root) hat Zugriff. Keine Gruppe, keine anderen Benutzer. Diese strikte Isolation schützt Root-Konfigurationen und -Daten vor unbefugtem Zugriff.

Spezial-Verzeichnisse

/boot - Boot-Loader und Kernel

Das /boot-Verzeichnis enthält alles, was zum Booten benötigt wird: Der Linux-Kernel, initramfs (temporäres Root-Dateisystem beim Boot), Boot-Loader-Konfiguration. GRUB oder andere Boot-Loader lesen hier die Kernel-Images.

$ ls /boot/
config-6.1.0-25-amd64
grub/
initrd.img-6.1.0-25-amd64
System.map-6.1.0-25-amd64
vmlinuz-6.1.0-25-amd64

vmlinuz-* ist das Kernel-Image (komprimiert), initrd.img-* das Initial RAM-Disk, config-* die Kernel-Konfiguration. Bei Kernel-Updates landen neue Versionen hier - alte bleiben oft für Fallback-Boots erhalten.

Manche Systeme verwenden eine separate /boot-Partition. Das war früher notwendig, da alte BIOS-Systeme nur die ersten 1024 Zylinder einer Festplatte lesen konnten. Mit UEFI ist diese Einschränkung verschwunden - eine separate /boot-Partition ist heute optional.

/dev - Geräte-Dateien

Das /dev-Verzeichnis enthält Geräte-Dateien (Device Files). Unix behandelt Hardware als Dateien - Festplatten, USB-Sticks, Terminals, Sound-Karten erscheinen alle als Dateien in /dev.

/dev/sda repräsentiert die erste SATA-Festplatte, /dev/sda1 die erste Partition darauf. /dev/tty sind virtuelle Terminals, /dev/null ist ein “Schwarzes Loch” für Daten - alles was dorthin geschrieben wird, verschwindet.

$ ls -l /dev/sda
brw-rw---- 1 root disk 8, 0 Okt  6 08:42 /dev/sda

Der erste Buchstabe b zeigt: Block-Device (blockweise Lese-/Schreibzugriffe). c wären Character-Devices (zeichenweise Zugriffe). Die Zahlen 8, 0 sind Major und Minor Numbers - sie identifizieren den Geräte-Treiber im Kernel.

/dev ist meist ein devtmpfs - ein spezielles Dateisystem, das der Kernel automatisch pflegt. Wenn ein USB-Stick eingesteckt wird, erscheint sofort /dev/sdb. Wird er entfernt, verschwindet die Datei. Kein Admin muss manuell Geräte-Dateien anlegen.

/proc - Kernel- und Prozess-Informationen

Das /proc-Verzeichnis ist kein echtes Dateisystem - es zeigt Kernel-Daten und Prozess-Informationen als Dateien. /proc/cpuinfo enthält CPU-Informationen, /proc/meminfo Speicher-Status. Jeder laufende Prozess hat ein Unterverzeichnis: /proc/1234/ für Prozess-ID 1234.

$ cat /proc/cpuinfo | grep "model name" | head -1
model name      : AMD Ryzen 9 5900X 12-Core Processor

Die Dateien in /proc existieren nicht auf der Festplatte. Der Kernel erzeugt den Inhalt on-the-fly beim Lesen. Schreibvorgänge in bestimmte /proc-Dateien ändern Kernel-Parameter - /proc/sys/ bietet Zugriff auf sysctl-Einstellungen.

/proc ist read-only für normale Benutzer, teilweise beschreibbar für Root. Programme wie top oder ps lesen /proc, um Prozess-Informationen anzuzeigen. Ohne /proc könnten diese Tools nicht funktionieren.

/sys - System-Dateisystem

Das /sys-Verzeichnis ähnelt /proc, fokussiert aber auf Hardware und Kernel-Subsysteme. Es macht den Kernel-internen Device-Tree als Dateisystem zugänglich. /sys/class/net/ zeigt Netzwerk-Interfaces, /sys/block/ Block-Devices.

$ ls /sys/class/net/
eth0  lo  wlan0

Moderne System-Tools lesen /sys für Hardware-Informationen. udev nutzt /sys, um Geräte-Regeln anzuwenden. Wenn ein USB-Stick eingesteckt wird, liest udev die Informationen aus /sys und erstellt passende Geräte-Dateien in /dev.

Wie /proc existiert /sys nur im RAM. Der Inhalt ist dynamisch und spiegelt den aktuellen Kernel-Zustand. Schreibzugriffe ändern Kernel-Einstellungen - das ist mächtig und sollte nur mit Verständnis der Konsequenzen erfolgen.

Praktische Navigation

Absolute vs. relative Pfade

Absolute Pfade beginnen mit / und beschreiben den Weg von Root: /home/michael/dokumente/bericht.pdf. Sie funktionieren unabhängig vom aktuellen Verzeichnis - cat /etc/hostname zeigt immer die gleiche Datei.

Relative Pfade haben kein führendes / und beziehen sich auf das aktuelle Verzeichnis. Bei Standort /home/michael führt cd dokumente nach /home/michael/dokumente. .. bezeichnet das Eltern-Verzeichnis, . das aktuelle Verzeichnis.

$ pwd
/home/michael/projekte/website

$ cd ../../sandra/dokumente
$ pwd
/home/sandra/dokumente

../../ bedeutet: Zwei Verzeichnisse nach oben (von website nach michael nach home), dann in sandra, dann in dokumente. Relative Pfade sind kürzer für nahe Ziele, absolute Pfade eindeutiger.

Standard-Pfade verstehen

Die Umgebungsvariable PATH definiert, wo die Shell nach Programmen sucht:

$ echo $PATH
/usr/local/bin:/usr/bin:/bin:/usr/local/sbin:/usr/sbin:/sbin

Bei Eingabe von ls sucht die Shell in /usr/local/bin (nicht gefunden), dann /usr/bin (gefunden), führt /usr/bin/ls aus. Die Reihenfolge ist wichtig - /usr/local/bin steht vorne, eigene Programme überschreiben System-Programme.

Root hat ein erweitertes PATH mit /sbin und /usr/sbin. Normale Benutzer können System-Administrations-Programme nur mit vollem Pfad aufrufen: /sbin/fdisk funktioniert, fdisk nicht (falls nicht im PATH).

Wo liegt welche Datei?

Das which-Kommando zeigt, welches Programm ausgeführt wird:

$ which python3
/usr/bin/python3

locate findet Dateien über eine Datenbank (muss aktualisiert sein):

$ locate nginx.conf
/etc/nginx/nginx.conf

find durchsucht das Dateisystem live:

$ find /etc -name "*.conf" -type f

Das durchsucht /etc nach allen Dateien mit Endung .conf. find ist langsamer als locate, aber immer aktuell und flexibler.

Verteilungs-Unterschiede

FHS-Abweichungen

OpenBSD folgt nicht dem FHS - es hat eigene Konventionen. /usr/local hat auf OpenBSD höhere Bedeutung als auf Linux. Base-System-Programme liegen in /usr, alle zusätzlichen Pakete gehen nach /usr/local. /etc/rc.d/ steuert Services, nicht systemd oder SysV-Init-Scripts.

FreeBSD nutzt /usr/local/etc/ für Konfigurationen installierter Pakete, nicht /etc. System-Konfiguration bleibt in /etc, Software-Konfiguration wandert nach /usr/local/etc/. Diese Trennung hilft bei System-Updates.

Solaris und andere kommerzielle Unix-Varianten haben zusätzliche Verzeichnisse wie /opt für große Software-Pakete. Jedes Paket bekommt ein Unterverzeichnis: /opt/software-name/. Linux-Distributionen nutzen /opt seltener - die meiste Software geht nach /usr.

Distributions-spezifische Pfade

Debian-Systeme haben /etc/apt/ für Paketmanager-Konfiguration, Red-Hat-basierte Systeme /etc/yum.repos.d/. Arch nutzt /etc/pacman.conf und /etc/pacman.d/. OpenBSD hat /etc/pkg.conf für pkg-Konfiguration.

Diese distributions-spezifischen Pfade werden in den jeweiligen Betriebssystem-Grundlagen-Artikeln behandelt:

  • Debian Grundlagen (geplant) zeigen /etc/apt/ und Debian-spezifische Strukturen
  • OpenBSD Grundlagen (geplant) erklären /etc/rc.d/ und BSD-Konventionen
  • Arch Grundlagen (geplant) behandeln /etc/pacman.d/ und systemd-Pfade

Zusammenfassung

Die Unix-Dateisystem-Hierarchie folgt klaren Prinzipien: System-Dateien in /usr, Konfiguration in /etc, veränderliche Daten in /var, Benutzer-Daten in /home. Diese Trennung ermöglicht einfachere Backups, Snapshots und Wartung.

Wer /etc/nginx/nginx.conf auf einem Debian-System findet, weiß: Auf jedem anderen Unix liegt nginx-Konfiguration in /etc/nginx/. Die Standard-Verzeichnisse sind vorhersagbar - Log-Dateien immer in /var/log, temporäre Dateien in /tmp, Programme in /usr/bin oder /usr/local/bin.

Die weiteren Artikel dieser Serie behandeln Berechtigungen für Verzeichnisse und Dateien, Links zwischen Dateien und das Mounting von Dateisystemen in den Verzeichnisbaum.


Verwendete Software und Versionen

Diese Betrachtung bezieht sich auf:

  • Filesystem Hierarchy Standard (FHS): 3.0
  • Betriebssysteme: Linux-Distributionen (Debian, Arch, etc.) und BSD-Systeme (OpenBSD, FreeBSD)
  • Kontext: Universal für alle Unix-artigen Systeme
  • Stand: Oktober 2025

Weiterführende Schritte:

michael von den Drachen

Softwareentwickler seit den 80ern. Systemkritiker seit immer. Betreibt produktive OpenBSD/Debian-Infrastruktur und entwickelt eigenes API-Gateway (furt).
Mehr über michael →
Dateisystem-Hierarchie: Der Verzeichnisbaum
← Nächster Artikel Berechtigungen und Eigentümer: Zugriffskontrolle