Der Filesystem Hierarchy Standard (FHS) ist eine Richtlinie für die Verzeichnisstruktur unter Unix-ähnlichen Betriebssystemen.
Der Standard richtet sich an Softwareentwickler, Systemintegratoren und Systemadministratoren. Er soll die Interoperabilität von Computerprogrammen fördern, indem er die Lage von Verzeichnissen und Dateien vorhersehbar macht.
Die Entwicklung dieser Richtlinie begann im August 1993 und war zunächst nur auf Linux bezogen. Zwischenzeitlich trugen einige Entwickler von FreeBSD dazu bei, einen umfassenden Standard für alle Unix-ähnlichen Systeme zu schaffen. Diese Zusammenarbeit wurde im Mai 2011 offiziell eingestellt, nachdem die Linux Foundation das Projekt übernommen hatte. Derzeit wird dieser Standard nur von Linux-Distributionen verwendet. Die erste Dokumentation solcher Hierarchie erschien in AT&T UNIX Version 7.
Seit etwa 2011 führen verschiedene, große Distributionen den so genannten Usrmerge (-) durch, welcher mit dem FHS formal per symbolischer Verknüpfung vereinbar ist. Dadurch wird zwar die Systematik des FHS nicht vollständig beibehalten, die Kompatibilität zu bestehenden Programmen ist damit aber weiterhin gewährleistet.
Dateikategorien Der FHS unterscheidet Dateien unter zwei Aspekten: „“ oder „“ Als „“ gelten jene Dateien, die sich ohne den Eingriff eines Systemadministrators nicht ändern. Alle anderen Dateien werden als „“ betrachtet. „“ oder „“ Als „“ gelten jene Dateien, die über ein Rechnernetz von anderen Computern genutzt werden können. Alle anderen Dateien werden als „“ betrachtet.
Aus diesen beiden Aspekten ergeben sich vier Kategorien von Dateien: „“ „“ „“ „“ Um Datensicherungen und Bereitstellungen im Rechnernetz effizienter zu gestalten, sieht der FHS vor, keine Dateien unterschiedlicher Kategorie im selben Verzeichnis zu speichern. Historisch gab es diese Trennung nicht.
Stammverzeichnis Das , meist in Form einer Partition, des Stammverzeichnisses muss all jene Dateien enthalten, die zum Hochfahren des Betriebssystems und zum Einbinden weiterer Partitionen notwendig sind. Um ein System reparieren zu können, muss sie auch die dazu notwendigen Hilfsmittel enthalten.
Um die Flexibilität und Zuverlässigkeit zu erhöhen, empfiehlt der FHS, Teile der Verzeichnisstruktur in anderen Partitionen anzulegen. Zusätzliche Partitionen sind unter Unix und ähnlichen Betriebssystemen transparent.
Hauptverzeichnisse 14 Verzeichnisse oder symbolische Verknüpfungen auf Verzeichnisse werden im Stammverzeichnis verlangt:
Binärdateien grundlegender Befehle historisch: „“ (Dienstprogramme wie Assembler und Compiler) statische Dateien des Bootloaders historisch: – Gerätedateien historisch: „“ (Geräte wie Festplatten und Systemkonsole) Host-spezifische Systemkonfiguration historisch: „“ (essenzielle Daten und gefährliche Wartungsprogramme wie und ) grundlegende dynamische Bibliotheken und Kernel-Module historisch: „“ (Objektbibliotheken und anderes Material) Einhängepunkt für Wechseldatenträger historisch: – für temporär eingehängtes Dateisystem historisch: – zusätzliche Anwendungsprogramme historisch: – für laufende Prozesse relevante Daten historisch: – essenzielle Binärdateien des Systems historisch: – Daten für Dienste historisch: – temporäre Dateien historisch: „“ (temporäre Dateien, üblicherweise auf schnellem Gerät) sekundäre Hierarchie historisch: „“ (Universalverzeichnis, üblicherweise Einhängepunkt eines weiteren Dateisystems) variable Daten historisch: –
Die Verzeichnisse , und sind so konzipiert, dass sie nicht in der Partition des Stammverzeichnisses liegen müssen.
Zusätzliche Verzeichnisse sind erforderlich, wenn entsprechende Untersysteme installiert sind:
Benutzerverzeichnisse: Verzeichnisse der Benutzer Benutzerverzeichnis des Root-Kontos alternative dynamische Bibliotheken, beispielsweise und für Multilib-Systeme (Bibliotheken für sowohl einen 32-Bit- als auch einen 64-Bit-Betriebsmodus)
Andere Verzeichnisse sollen im Stammverzeichnis nicht angelegt werden. Anwendungsprogramme sollen keine Dateien im Stammverzeichnis fordern oder anlegen.
/bin – grundlegende Systembefehle (für alle Benutzer) enthält alle Befehle, die sowohl vom Administrator als auch vom Benutzer aufgerufen werden können und auch dann benötigt werden, wenn keine anderen Dateisysteme eingehängt (auch: „gemountet“ von ) sind, zum Beispiel im . Darüber hinaus können auch Skripte, die solche Befehle verwenden, dort abgelegt werden.
Das Verzeichnis darf keine Unterverzeichnisse enthalten. Folgende Programme oder symbolische Links auf die Unix-Kommandos werden in mindestens benötigt: : Dateien aneinanderhängen () und zur Standardausgabe (stdout) schreiben : Ändern der Gruppenzugehörigkeit () : Ändern der Dateizugriffsrechte () : Ändern von Besitzer und Gruppenzugehörigkeit () : Kopieren von Dateien oder Verzeichnissen () : Zeigen oder Setzen von Systemdatum und Systemzeit : Konvertieren oder Kopieren von Daten () : Zeigen des freien Festplattenplatzes () : Zeigen oder Konfigurieren des Ringpuffers des Kernels () : Wiedergeben einer Textzeile : Erzeugen eines Fehlerstatuscodes : Zeigen oder Setzen des aktuellen Rechnernamens : Beenden eines Prozesses : Setzen von Verknüpfungen zwischen Dateien () : Benutzeridentität prüfen und Bedienoberfläche starten : Verzeichnisinhalt zeigen () : Erstellen eines Verzeichnisses () : Erstellen spezieller Gerätedateien () : Daten seitenweise blätternd zeigen : Einhängen von Dateisystemen : Verschieben oder Umbenennen von Dateien () : Prozessstatus zeigen () : Zeigen des Namens des aktuellen Verzeichnisses () : Löschen von Dateien oder Verzeichnissen () : Löschen leerer Verzeichnisse () : Editieren von Daten ohne Interaktion () : Unix-Shell (Kommandozeileninterpreter, ). Falls sh nicht die originale Bourne-Shell ist, muss sh ein Hard- oder Softlink auf die eingesetzte Shell sein. : Zeigen oder Setzen von Einstellungen eines Datenendgerätes () : startet eine Bedienoberfläche mit neuer Benutzeridentität () : Schreiben der Inhalte von Datenpuffern auf den Datenträger () : Erzeugen eines Erfolgsstatuscodes : Aushängen von Dateisystemen () : Zeigen diverser Systeminformationen ()
Falls benötigt, müssen die folgenden Kommandos (oder auf sie verweisende Verknüpfungen) ebenfalls im /bin-Verzeichnis installiert sein: : C-ähnlicher Kommandozeileninterpreter () : Editieren von Text () : Verwalten von Dateiarchiven () : Kopieren von Dateien in oder aus Archive(n) () : Komprimieren von Daten () : Dekomprimieren von Daten (meist als Verknüpfung zu gzip) : Dekomprimieren und zeigen von Daten () : Zeigen von Netzwerkstatusinformationen () : Senden und Empfangen von Datenpaketen per ICMP
Alle weiteren Kommandos, die zur Wiederherstellung benötigt werden, wie beispielsweise ftp, tftp oder diverse Archivierungsprogramme, haben hier ebenfalls ihren Platz.
/boot – statische Dateien des Bootloaders Dieses Verzeichnis enthält alle vom Bootloader für den Bootvorgang benötigten Dateien. Es kann u. U. auch (weitere) gespeicherte Master Boot Records enthalten, da in diesen Startprogramme für weitere Betriebssysteme enthalten sein können (). Auch Betriebssystem-Kernel können in diesem Verzeichnis abgelegt sein.
/dev – Gerätedateien Das Verzeichnis beinhaltet Spezial-Dateien () oder Gerätedateien (). Manche der Gerätedateien müssen manuell angelegt werden. In diesem Fall muss das Verzeichnis den Befehl bzw. enthalten, der diese Gerätedateien anhand der vorhandenen Hardware anlegen kann. Erwähnenswert sind , in der geschrieben werden kann, aber alles verworfen wird, , aus der Nullbytes in beliebiger Menge gelesen werden können, und (bzw. ), welche als Hardware-Zufallsgenerator dient.
udev hat seit Kernel 2.6 devfs abgelöst und sorgt nun mittels Konfigurationsdateien (standardmäßig in /etc/udev) im Userspace für die automatische Erstellung der Devices in .
/etc – spezifische Konfigurationsdateien stand ursprünglich für „alles übrige“ (lat. et cetera). Es hat sich dann aber als Konfigurationsverzeichnis etabliert und wird daher auch häufig als „“ interpretiert. Im Bezug auf bzw. im Unterschied zu Daten in und kann es auch als „“ gesehen werden. Das Verzeichnis und seine Unterverzeichnisse enthalten jede Art von Konfigurationsdateien. Diese Dateien müssen statische Dateien sein (s. o.). In diesem Verzeichnis dürfen sich keine Binärdateien befinden.
Folgende Unterverzeichnisse können u. a. in vorhanden sein:
Konfiguration für Programme in : Systemspezifische Konfigurationsdateien für zusätzlich installierte Softwarepakete müssen in diesem Verzeichnis in entsprechenden Unterverzeichnissen installiert werden (). Eine Regelung, wie das Verzeichnis aufgeteilt ist, existiert nicht.
Konfiguration des X Window Systems, optional: In diesem Verzeichnis werden alle Konfigurationsdateien des X11-Systems abgelegt. Das Verzeichnis beheimatet insbesondere die Dateien , und (soweit vorhanden). Wenn ein Window Manager mehr als eine Konfigurationsdatei besitzt, kann dafür ein eigenes Unterverzeichnis angelegt werden, sonst wird die Konfigurationsdatei direkt im Verzeichnis mit dem Dateinamen abgespeichert.
Konfiguration für SGML, optional: In diesem Verzeichnis speichern SGML-Systeme (soweit vorhanden) grundlegende Konfigurationen ab. Dateien mit der Endung bezeichnen herkömmliche Konfigurationsdateien, Dateien mit der Endung stellen spezielle DTD-Kataloge mit Verweisen auf andere Kataloge bereit.
Konfiguration für XML, optional: In diesem Verzeichnis werden Grundeinstellungen von evtl. vorhandenen XML-Systemen installiert. Konfigurationsdateien haben die Dateiendung , ein DTD-Katalog befindet sich in der Datei .
Konfiguration für Midnight Commander, optional
Enthält bei Debian-Systemen jene Konfigurationsdateien, die das Netzwerk betreffen Allgemein liegen Konfigurationen einzelner Dienste unter und/oder (der LDAP unter dem Debian-Derivat Ubuntu macht z. B. ohne eindeutige Dateibenennung beides). Bei Daemons fehlt oft dann das abschließende d, der NTP-Server z. B. hat den Prozess , aber die Konfigurationsdatei .
Folgende Konfigurationsdateien gehören auf jeden Fall (soweit vorhanden) in :
systemweite Initialisierungsdatei für den C-ähnlichen Befehlsinterpreter
Zugriffsrechte für NFS-Freigaben
Tabelle mit statischen Informationen zu einhängbaren Dateisystemen
enthält die Namen der vom ftp-Aufruf auszuschließenden Benutzer
statische Informationen zu den im Netzwerk verfügbaren Gateways
Parameter zur Übertragungsgeschwindigkeit und sonstigen Einstellungen der Terminals
zeilenweise Informationen zu den eingetragenen Benutzergruppen
Konfigurationsdaten zur Namensauflösung
statische Informationen zur Zuordnung von Rechnernamen zu IP-Adressen
Zugriffsberechtigungen für den TCP-Wrapper tcpd
Ausschlusskriterien für den TCP-Wrapper tcpd
zugelassene Rechner für rlogin, rsh, rcp
zugelassene Rechner für den Druckdienst lpd
Konfigurationsdatei für den Internet-Superserver inetd
Konfigurationsdatei für den Initialisierungsprozess init
Systemidentifikationsdatei zur Ausgabe von Informationen vor dem Anmeldevorgang
Systemidentifikationsdatei zur Ausgabe von Informationen vor dem Anmeldevorgang über das Netzwerk (zum Beispiel telnet)
Liste von Verzeichnissen mit dynamisch einzubindenden Bibliotheken
Mitteilung des Tages zur Ausgabe nach dem Anmeldevorgang (message of the day)
dynamisch erzeugte Informationen zu den eingehängten Dateisystemen
Konfigurationsdatei für mtools dem Befehl zur Bearbeitung von MS-DOS-Dateisystemen
statische Informationen zu den verfügbaren Netzwerken
Enthält den Benutzernamen, Beschreibung des Benutzers, Gruppen-ID, Benutzer-ID, das Heimat-Verzeichnis und das Login-Kommando (meist eine Shell). Früher enthielt diese Datei auch das Benutzerkennwort. Dieses ist jetzt in gespeichert.
Konfigurationsdatei für den Druckdienst lpd
systemweite Konfigurationsdatei für den Anmeldevorgang mittels sh