Zum Inhalt springen

Filesystem Hierarchy Standard

Der Filesystem Hierarchy Standard (FHS) ist eine Richtlinie, wie Linux-Distributionen ihren Verzeichnisbaum organisieren sollen — also welche Dateien wohin gehören. Theoretisch ist das völlig frei wählbar, aber ohne Konvention wäre jede Distribution anders aufgebaut.

Fast alle Distributionen halten sich im Wesentlichen daran, weichen an der einen oder anderen Stelle aber ab. Die letzte offizielle Fassung stammt aus dem Jahr 2015 — manche aktuelle Entwicklung (z. B. der usr-Merge) hat den Standard bereits überholt.

Weiterführend: FHS Spezifikation · Wikipedia

Der Standard klassifiziert Dateien entlang zweier Achsen:

Statisch (unveränderlich im Betrieb)Variabel (ändern sich laufend)
Shareable (teilbar zwischen Rechnern)/usr, /opt/var/mail, /var/spool
Unshareable (rechnerspezifisch)/etc, /boot/var/run, /var/lock
VerzeichnisInhalt
/bootDateien für den Systemstart (Kernel, initramfs, GRUB)
/devGerätedateien (von udev verwaltet)
/etcSystemweite Konfigurationsdateien
/homeHeimatverzeichnisse der Benutzer
/mntManueller Einhängepunkt (durch den Administrator)
/optOptionale Software, oft von Drittanbietern
/rootHeimatverzeichnis des Superusers
/runLaufzeit-Dateien (PID-Files, Sockets) — flüchtig, nur im RAM
/srvDaten von Diensten (Webserver, FTP)
/tmpTemporäre Dateien — wird oft beim Booten geleert
VerzeichnisInhalt
/procVirtuelles Dateisystem — Prozess- und Kernelinformationen
/sysVirtuelles Dateisystem — Kernel- und Hardware-Schnittstelle (sysfs)

Diese beiden Verzeichnisse enthalten keine echten Dateien — sie werden vom Kernel im Arbeitsspeicher gehalten und spiegeln den aktuellen Systemzustand wider.

/media war früher der Einhängepunkt für Wechselmedien (CD-ROMs, USB-Sticks). Mit dem Verschwinden von Laufwerken und dem Aufkommen automatischer Einhängepunkte (über udev und Desktop-Umgebungen) hat es praktisch keine Bedeutung mehr.

Historisch lag /usr oft auf einem Netzlaufwerk, das viele Clients gemeinsam nutzten. Heute enthält es den Großteil aller installierten Programme und Bibliotheken:

VerzeichnisInhalt
/usr/binAusführbare Programme (alle Benutzer)
/usr/sbinSystemverwaltungs-Programme (traditionell nur root)
/usr/libBibliotheken
/usr/shareArchitektur-unabhängige Daten (Manpages, Icons, Lokalisierungen)
/usr/includeHeader-Dateien für Entwickler
/usr/localManuell installierte Software (nicht über Paketverwaltung)

/usr/local spiegelt die Struktur von /usr — mit bin, lib, share usw. — und ist für Software gedacht, die der Administrator selbst installiert hat und die nicht durch Paket-Updates überschrieben werden soll.

Alles, was Programme im laufenden Betrieb schreiben:

VerzeichnisInhalt
/var/logLog-Dateien
/var/cacheCache-Daten von Anwendungen und Paketverwaltung
/var/spoolWarteschlangen (Drucker, Mail, Cron)
/var/libPersistente Programm-Daten (Datenbanken, Paketdatenbank)
/var/tmpTemporäre Dateien — bleiben über Neustarts erhalten

Die Grundidee: Statische Programmdateien gehören nach /usr, alles was das Programm später erzeugt oder verändert nach /var.

Traditionell gab es sowohl /bin als auch /usr/bin, sowohl /lib als auch /usr/lib. Die Trennung stammte aus der Zeit, als /usr auf einem separaten (oft kleinen) Datenträger lag — die allernötigsten Werkzeuge mussten deshalb direkt im Root-Filesystem verfügbar sein.

Diese Unterscheidung ist heute obsolet. Seit ca. 2010 haben fast alle Distributionen den sogenannten usr-Merge durchgeführt:

Terminal-Fenster
ls -la /bin
# lrwxrwxrwx 1 root root 7 /bin -> usr/bin
ls -la /lib
# lrwxrwxrwx 1 root root 7 /lib -> usr/lib

/bin, /sbin und /lib sind heute meist symbolische Links auf ihre Pendants unter /usr. Der FHS-Standard wird dabei nicht verletzt — cp liegt zwar physisch in /usr/bin, ist aber weiterhin als /bin/cp erreichbar.