Die Dateisystem-Struktur

Unix ist vom Konzept her nicht für die Benutzung durch Heim- und Privatanwender angelegt. Im Gegenteil, es ist speziell an die Bedürfnisse von Großrechnersystemen angepaßt. Als Unix in den Bell Laboratories von AT&T entwickelt wurde, war es noch undenkbar, daß normale Studenten ihr eigenes Unix-System Zuhause auf oder unter dem Schreibtisch stehen haben.

Die Dateisystem-Struktur unter Unix ist komplett anders organisiert als bei herkömmlichen Endbenutzer-Betriebssystemen (gemeint sind hier DOS, Win95, OS/2 etc.). Ein Unix-Sytem kennt zum Beispiel keine Laufwerke. Die gesamte Struktur besteht aus einem großen Verzeichnisbaum, angefangen bei '/', dem Root- bzw. Wurzelverzeichnis.

Datenspeicher wie Festplatten, CD-ROMs, MOs, Disketten etc. werden an geeigneter Stelle in den Verzeichnisbaum "montiert" (engl. mount). Diese Geräte müssen nicht notwendigerweise am lokalen System angeschlossen sein, sondern können von einem anderen Rechner montiert werden. Für den Benutzer eines Unix-Systems ist es ohne weiteres nicht ersichtlich, auf welchem Gerät bzw. auf welchem Rechner die Daten tatsächlich liegen. Für die tägliche Arbeit sind diese Informationen auch unerheblich.

Das Einfügen in den Verzeichnisbaum geschieht mit dem Befehl "mount". Sollen sie wieder aus dem System entfernt werden, so ist der Befehl "umount" zu verwenden. In dem abzumontierenden Verzeichnis darf dabei keine Datei mehr geöffnet sein, sonst verweigert umount seinen Dienst.

Bevor ein Gerät auf diese Weise in das System eingebunden werden kann, muß auf ihm ein Dateisystem erzeugt werden. Dieses bestimmt, wie die Daten gespeichert werden - u.a. wie lang Dateinamen sein dürfen. Normalerweise hat jedes Betriebsystem sein eigenes Dateisystem. Linux ist hier keine Ausnahme, allerdings enthält Linux nicht nur die Linux-typischen Dateisysteme wie ext2 und xiafs, sondern auch die anderer Systeme wie MSDOS, VFAT, Novell etc. Folgendes Fragment soll einen kleinen Vorgeschmack auf die Vielseitigkeit von Linux geben.

   mount -t iso9660 -r /dev/scd0 /cdrom0
   mount -t ext2 /dev/sdc1 /home
   mount -t msdos /dev/sdc2 /dos
   mount -t vfat -r /dev/sdc3 /win95
   mount -t nfs -r tuonela:/pub /pub
   ncpmount -S FILESERV1 /netware -U joey -P  

  
Dabei ist tuonela ein NFS-Server und FILESERV1 ein Novell-Server. Die lokale DOS-Platte wird an /dos montiert und die Windows95-Partition ist über /win95 zu erreichen. Diese Befehle können auch abgekürzt werden, wenn die entsprechenden Daten in /etc/fstab geschrieben werden.

Die Daten auf Unix-Dateisystemen bestehen üblicherweise ausschließlich aus Dateien. Selbst Verzeichnisse sind Dateien - sie enthalten jedoch spezielle Verzeichnisinformationen, also Namen, Benutzerrechte und die exakte Position auf den Datenspeichern.

Im Gegensatz zu DOS werden einzelne Verzeichnisse in Pfaden mit einem normalen Schrägstrich voneinander getrennt. Ein weiterer Unterschied besteht darin, daß Dateinamen unter Unix je nach zugrundeliegender Kodierung bis zu 255 Zeichen lang sein können und mehrere Punkte enthälten dürfen. Liegt dem Verzeichnis ein DOS-Verzeichnis zugrunde, welches problemlos in den Verzeichnisbaum eingebunden werden kann, dann besteht natürlich weiterhin die unter DOS übliche 8.3 Konvention.

Da Unix ein Mehrbenutzer-Betriebssystem ist, existieren für jede Datei Zugriffsrechte. Diese sind aufgeteilt in einen User-, Gruppen- und Weltanteil. Pro Anteil können Lese-, Schreib- und Ausführungsrechte (für Programme) vergeben werden.

Ein Benutzer gehört immer mindestens einer Benutzergruppe an (siehe /etc/group). Jede Datei gehört genau einem Benutzer und einer Gruppe. Auf diese Weise können bestimmte Dateien für bestimmte Personenkreise zum Lesen oder Schreiben zugänglich gemacht werden. So kann z.B. die Benutzung der Diskettenlaufwerke oder der Modems eingeschränkt werden, indem sie nur für eine bestimmte Gruppe beschreibbar sind. In diese Gruppen werden nur authorisierte Personen eingetragen.

Die Organisation der Daten

Daten gehören verschiedenen Kategorien an. Unter Unix werden die meisten externen Geräte durch spezielle Dateien, sogenannte Devices, repräsentiert. So ist /dev/sda die erste SCSI-Festplatte und /dev/sda1 die erste Partition darauf. Mit /dev/lp0 ist die erste parallele Schnittstelle bezeichnet u.s.w. Auf diese Weise existieren klar definierte Schnittstellen zur angeschlossenen Hardware.

Das Konzpt von Unix ist zwar schon recht alt, dennoch hat sich bisher kein Standard durchgesetzt, wo welche Dateien zu speichern sind. Fast jedes Unix-System hat seine eigenen Regeln aufgestellt. Wer mit mehreren unterschiedlichen System arbeitet, wird sich über kurz oder lang darüber ärgern.

Selbst die einzelnen Linux-Distributionen hatten ihre Dateien verschieden angeordnet. Wer früher auf einem Rechner Slackware, auf einem zweiten Debian GNU/Linux und auf einem dritten die LST installiert hatte, der fand viele Dateien auf jedem Rechner in einem anderen Verzeichnissen wieder. Es herrschte also Chaos.

Abbildung 1: Dateisystemstruktur unter Unix

Daher haben sich '94 mehrere Entwickler von Linux und Linux-spezifischer Software zusammengesetzt und eine einheitliche "Linux Filesystem Structure" ausgearbeitet. Ziel dieser Arbeit war es, eine einheitliche Verzeichnisstruktur für Linux-basierte Systeme zu schaffen. Als Ergebnis wurde das im Anhang benannte Dokument geschrieben. Alle gängigen Distributionen halten sich weitestgehend an diesen Standard. Dadurch sind sie generell einfacher zu warten, es ist klar, wo welche Dateien zu suchen sind.

/dev

Alle Gerätedateien sind im Verzeichnis /dev zusammengefaßt. Bei Solaris existieren dort sogar noch weitere Unterverzeichnisse zur besseren Lesbarkeit. Als einzige Ausnahme sollte in diesem Verzeichnis neben den speziellen Gerätedateien ein Skript MAKEDEV stehen, welches die Gerätedateien erzeugt.

/bin und /sbin

Essentielle Programme, die zum Starten und zum Basisbetrieb des Systems benötigt werden, befinden sich in /bin und /sbin. Letzteres steht für System-Binaries, enthält also Programme, die nur für den System-Administrator interessant sind. Die Programme in /bin sind für alle Benutzer wichtig, dort befindet sich z.B. das Programm "ls".

/boot

Unter Linux werden unveränderliche Dateien, die zum Booten, also noch vor dem Hochfahren des Systems, benötigt werden, im Verzeichnis /boot abgelegt. Dort befinden sich normalerweise verschiedene Kernel sowie verschiedene Programme, die vom Bootloader LILO benötigt werden. Dieser legt dort eine Kopie des ursprünglichen Master Boot Records ab, bevor er ihn überschreibt.

/usr

Normale Programmpakete werden üblicherweise unterhalb von /usr installiert. Dieses Verzeichnis ist weiter unterteilt, um es übersichtlicher zu halten. Größere Programmpakete benötigen oft nicht nur eine Handvoll ausführbarer Programme sondern Bibliotheken und Konfigurationsdateien. Zusätzlich werden sie mit Dokumentation in unterschiedlichen Formaten ausgeliefert, welche in eigenen Verzeichnissen einsortiert wird.

bin Enthält normale Programme und Skripte.
sbin Programme, die nur für die Systemadministration interessant sind und auch nur von dieser aufgerufen werden sollten.
man Dokumentation von Programmen, Dateien und Funktionen als Manual-Seiten.
info Dokumentation im Info-Format.
doc Dokumentation der installierten Pakete in beliebigem Format.
lib Zusätzliche Dateien für die verschiedenen Programmpakete. Perl und Emacs suchen dort z.B. ihre Dateien.
include Headerdateien für C- und C++ Programmierung
src Quellcode z.B. vom Linux-Kernel

Zusätzlich liegen in /usr standardmäßig noch zwei weitere Hierarchien: /usr/local und /usr/X11R6. In diesen befindet sich erneut die gleiche Unterteilung wie in /usr.

Alle lokal installierten Programmpakete, die nicht von vorhnherein in der Distribution enthalten sind, werden üblicheweise unterhalb von /usr/local installiert. So kann diese Hierarchie bei einem Betriebssystem-Update komplett abgehängt oder auf Band ausgelagert und anschließend wieder eingespielt werden.

Da sich mittlerweile ziemlich viele Programme angesammelt haben, die unter X11 laufen, hat man sich entschieden, für diese unter /usr/X11 bzw. /usr/X11R6 eine eigene Hierarchie einzurichten.

/home

Userdaten wie z.B. Heimatverzeichnisse der eingetragenen Benutzer werden normalerweise unterhalb eines eigenen Verzeichnisbaums gespeichert. Bei größeren Systemen gilt dieses ebenfalls für spezielle Arbeitsverzeichnisse für verschiedene Gruppen, die unter /project oder /home/project liegen.

Meistens werden für diese Daten ebenfalls eine oder mehrere physikalische Platten verwendet. In einem größeren Cluster von Maschinen befinden sich diese Verzeichnisse zentral auf einem Server und werden per NFS (Network File System) auf den Arbeitsrechnern montiert.

/var

Dieses Verzeichnis enthält per definitionem variable Daten. Es beinhaltet Spoolverzeichnisse z.B. für Mail, News, Proxies etc. sowie Logdateien und veränderliche Dateien, welche für den Betrieb verschiedener Programme benötigt werden.

Analog zu /usr/lib gibt es ein Verzeichnis /var/lib, indem für jedes Programm, welches derartige Dateien erzeugt, ein eigenes Unterverzeichnis angelegt wird.

/cdrom, /floppy, /mnt, /hdb, /dos

Diese Verzeichnisse sind sogenannte Mountpoints für temporäre oder dauerhafte Einbindungen von externen Geräten bzw. Festplattenpartitionen oder Verzeichnisse anderer Systeme.

Systemweite Konfiguration in /etc

Das wichtigste Verzeichnis für das System ist /etc. In diesem liegen die systemweiten Konfigurationsdateien aller installierten Programme (so jedenfalls die Theorie). Früher waren diese über das gesamte System verteilt und ließen sich daher schlecht warten und sichern. Mittlerweile reicht es für eine Sicherung der Konfigurationen aus, wenn ein Backup von /etc erzeugt wird.

Analog zum /usr-Verzeichnis enthält auch dieses ein eigenes Unterverzeichnis für Konfigurationsdateien der Programme.

Ein spezielles Verzeichnis ist /etc/skel. In ihm sind Vorgaben für persönliche Konfigurationsdateien der Benutzer gespeichert. Sie werden in das Verzeichnis eines neuen Benutzers kopiert, wenn er mit dem adduser-Befehl angelegt wird.

Dieses Verzeichnis enthält zwar viele Dateien, belegt jedoch meistens nur 1 bis 3 Megabytes. Da fast alle Konfigurationsdateien unter Unix simple Textdateien sind, belegen sie kaum Speicherplatz.

Viele Programme benötigen nur eine einzige Datei, um ihre Einstellungen zu lesen. Wenn ein Paket jedoch gleich einen ganzen Satz an Konfigurationsdateien verwendet, dann wird von den Leuten, von denen die Distribution zusammengestellt wird, meist ein eigenes Unterverzeichnis unterhalb von /etc angelegt.

Benutzerspezifische Konfiguration

Neben der globalen Konfiguration in /etc ist es bei vielen Anwendungsprogrammen zusätzlich möglich, das Programm pro Anwender an eigene Bedürfnisse anzupassen. Dieses geschieht über sogenannte Dot-Files (dot ist das englische Wort für Punkt). Sie liegen im Heimatverzeichnis des Anwenders und ihr Name beginnt gewöhnlich mit einem `.'.

Wie Sie sicherlich schon festgestellt haben, werden Dateien und Verzeichnisse, welche mit einem Punkt beginnen, nicht ohne weiteres von "ls" angezeigt. Wenn Sie diese Dateien sehen möchen, benutzen Sie stattdessen "ls -a".

Auch hier gilt, wenn ein Programm mehrere Dateien benötigt, dann wird meistens ein eigenes Unterverzeichnis angelegt, in dem sie gespeichert werden. Normalerweise können diese benutzerspezifischen Konfigurationsdateien systemweite Einstellungen überschreiben. Sie werden nach der systemweiten Konfiguration gelesen. Bei einigen Programmen wird die entsprechende Datei aus /etc jedoch garnicht mehr gelesen, wenn eine benutzerspezifische existiert (z.B. beim FVWM). Hier ersetzt sie komplett die systemweite. Das jeweilige Verhalten ist abhängig vom Programm und anhand der Manual-Seiten zu klären.

Das Newssystem als Beispiel

Ein recht umfangreiches Paket ist das Newssystem INN. Dank seiner Komplexität läßt sich an ihm jedoch die Dateisystemstruktur gut verdeutlichen.

Die Konfigurationsdateien wie z.B. newsfeeds (Daten zu angeschlossenen Systemen) oder expire.ctl (Angaben, welche Newsgruppen wielange aufgehoben werden sollen) werden in /etc/news gespeichert.

Programme, die vom Administrator zum Start benötigt werden, liegen in /usr/sbin (z.B. in.nnrpd oder innd). User-Programme wie z.B. rnews, welches vom UUCP-Subsystem aufgerufen wird, liegen in /usr/bin.

Variable Daten wie die Active-Datei, welche eine Liste der auf diesem System vorhandenen Newsartikel enthält, liegt in /var/lib/news. Die eigentlichen Newsartikel werden im "echten" Spoolverzeichnis in /var/spool/news gespeichert, während die Logdateien in /var/log/news abgelegt werden.

Die Dokumentation erstreckt sich im Fall der Manual-Seiten über verschiedene Abschnitte in /usr/man sowie einem Verzeichnis in /usr/doc.

Martin Schulze

Quelle: Linux-Special vom Toolbox-Verlag '97


© Joey, 26 Dec '97