Das Dateisystem - Verzeichnishierarchie |
Strukturierung ist notwendig |
Abbildung 1: Die Linux-Verzeichnisstruktur
Bei der Unmenge von Dateien in Unix-Systemen (auf meinem System sind es 106839!) ist eine hierarchische Struktur unabdingbar. Lange Zeit brachte jedes Unix-Derivat seine eigenen Vorstellungen vom Aufbau seiner Dateiverwaltung mit, aber unterdessen ist sich ein Gremium, bestehend aus den wichtigsten Unix-Distributoren, System- und Paketentwicklern, mehr oder weniger einig geworden und erarbeitete den Filesystem Hierarchie Standard, der wichtige Strukturen definiert. Die meisten Distributionen folgen diesen Richtlinien, wobei Abweichungen oft durch unterschiedliche Auslegung des Standards begründet werden.
Neben der Beschreibung der vorgesehenen Verwendung jedes Verzeichnisses werden auch konkrete Kommandos genannt, die mindestens in diesen Verzeichnissen vorhanden sein müssen. Des Weiteren finden systemspezifische Vorgaben und optionale Komponenten Erwähnung.
Ausgangspunkt ist die Wurzel (auch als Root bezeichnet) |
Sobald der Kernel aktiv ist, lädt er als erstes das Root-Dateisystem, in dem alle für die Aufgaben des Kernels notwendigen Programme und Konfigurationsdateien angesiedelt sein müssen.
Zu den Programmen gehören:
Verzeichnisse in der Wurzel |
Wenden wir uns also zunächst dem Inhalt des Wurzelverzeichnisses zu. Verzeichnisse und Dateien, die als optionale Komponenten im Standard enthalten sind, werden farblich hervorgehoben.
Die wichtigsten Kommandos, um mit dem System arbeiten zu können, finden Sie hier.
Sie dürfen von jedem Benutzer ausgeführt werden. Zu den Kommandos gehören
cat
,
chgrp
,
chmod
,
chown
,
cp
,
date
,
dd
,
df
,
dmesg
,
echo
,
ed
,
false
,
kill
,
ln
,
login
,
ls
,
mkdir
,
more
,
mount
,
mv
,
ps
,
pwd
,
rm
,
rmdir
,
sed
,
setserial
,
sh
,
stty
,
su
,
sync
,
true
,
umount
,
uname
(sh
ist in Linuxsystemen zumeist ein Link auf bash
).
Hier finden Sie die statischen Dateien des Bootmanagers und die Kernel (In früheren Linux-Versionen wurden der »Haupt«-Kernel im Root-Verzeichnis installiert und nur die optionalen Kernel in diesem Verzeichnis.).
In diesem Verzeichnis stehen die Treiber zur Ansteuerung der gesamten Hardware (Festplatte, Floppy, RAM...). Gemäß der UNIX-Philosophie »Alles ist eine Datei« werden diese Treiber durch Dateien repräsentiert, die so genannten Gerätedateien (»device special files« oder »device nodes«). Einige dieser Gerätedateien erfüllen spezielle Aufgaben (Beispiele finden Sie an etlichen Stellen des Buches) und sind mit keiner realen Hardware verbunden. Dennoch stellen sie aus Sicht des Systems Treiber dar.
Wenn Sie sich den Inhalt des Verzeichnisses »/dev« betrachten, entdecken sie unzählige Einträge, deren Anzahl unmöglich der vorhandenen Hardware entsprechen kann. Tatsächlich wurde für jedes denkbare Stück Hardware vorsorglich ein solcher »Eintrittspunkt« geschaffen, dessen definierter Name es Anwendungsprogrammen erst ermöglicht, auf ein konkretes Gerät zuzugreifen. Solange keine entsprechende Hardware und der zugehörige Treiber installiert wurden, sind diese Eintrittspunkte nur »leere Hülsen« und würde eine Anwendung darauf zugreifen, erhielte sie eine Fehlermeldung, dass das angeforderte Gerät nicht verfügbar ist.
Obige Verfahrensweise beinhaltet jedoch einige Schwächen, auf die wir im einzelnen an dieser Stelle nicht eingehen werden. Als Lösung bahnt sich seit Kernelversion 2.4. das so genannte Device File System an, womit erst bei der Registrierung eines Treibers beim Kernel eine entsprechende Gerätedatei unterhalb von »/dev« generiert wird. Noch dazu werden Geräte entsprechend ihrer Klasse (bspw. IDE-Festplatten, Terminals, SCSI-Geräte) in separate Unterverzeichnisse eingeordnet, sodass der Inhalt von »/dev« die tatsächliche Hardware des Systems in struktuierter Form repräsentiert. Im Abschnitt Systemadministration>Dateisysteme widmen wir uns konkret diesem neuen Dateisystem.
Noch aktiviert keine Distribution standardmäßig das neue Verfahren und selbst bei dessen Verwendung werden zur Unterstützung älterer Programme die »alten« Gerätedateien zusätzlich verwendet (ein Prozess überwacht hierzu die Anforderungen der Programme und kümmert sich ggf. um das Mapping auf die neuen Einträge unter »/dev«), sodass nachfolgende Aussagen weiterhin ihre Gültigkeit behalten.
Drei Informationen sind für jedes Device relevant:
brw-rw-rw- 1 root disk 2, 0 Nov 8 20:48 /dev/fd0 crw-rw---- 1 root lp 6, 0 Nov 8 20:48 /dev/lp0 |
brw-rw-rw- 1 root disk 2, 0 Nov 8 20:48 fd0 crw-rw-rw- 1 root tty 2, 0 Nov 8 20:48 ptyp0 |
Diese Nummern spezifizieren den zu verwendenden Treiber. Befinden sich im System bspw. zwei IDE-Festplatten, werden beide über einunddenselben Treiber angesprochen. Nicht allein die Nummer benennt den Treiber, sondern die Art des Geräts (zeichen- und blockorientiert) ist ebenso entscheidend. Identische Nummern für zeichen- und blockorientierte Geräte (z.B. Nummer 2 für Pseudoterminals (c) und Floppys (b)) beziehen sich also auf unterschiedliche Treiber!
Die Hauptgerätenummern werden von einer zentralen Instanz verwaltet; der aktuelle Stand bei Auslieferung der Kernelquellen ist in der Datei »/usr/src/linux/Documentation/devices.txt« zu finden.
brw-rw-rw- 1 root disk 2, 0 Nov 8 20:48 /dev/fd0 |
Diese Nummer dient dem Treiber zu entscheiden, welche Instanz einer Hardware anzusprechen ist. Sind bspw. vier IDE-Festplatten im System installiert, erkennt der Treiber anhand der Nebengerätenummer, ob er den Master oder den Slave des ersten oder zweiten IDE-Controllers anzusteuern hat.
Als erstes Beispiel eines solchen »Pseudotreibers« soll hier /dev/null
, der
»Mülleimer von Unix« angeführt werden. Sie werden bei der täglichen Arbeit mit
Linux noch genühend Situationen erfahren, in denen Sie die Bildschirmausgaben von Programmen gern
unterdrücken möchten. Im vorhergehende Kapitel zu den Grundlagen der Bash haben Sie die
Umleitung der Ausgaben in eine Datei kennen gelernt. Das Resultat wäre eine Datei. Sie könnten
sich abschließend löschen oder aber gleich anstatt der regulären Datei den Mülleimer
verwenden:
user@sonne> find / -name "*" 2> /dev/null |
Sie verstehen das Beispiel nicht? Dann arbeiten Sie bitte nochmals den Abschnitt Ein/Ausgabe-Umleitung durch.
cdrom | ||
Link auf eine entsprechende Datei (z.B. cdu535) | ||
cua* | ||
(Veraltetes) Devices für serielle Schnittstellen, das für ausgehende Modemverbindungen verwendet wurde (und in manchen Distributionen noch immer wird). Physisch zeigt ein solches Device auf dasselbe Gerät wie /dev/ttys*, jedoch blockiert ein Programm nicht, wenn es das Gerät eröffnet und noch kein Verbindungssignal anliegt. Aktuell sollten die Schnittstellen /dev/ttyS* bevorzugt werden. | ||
fd* | ||
Diskettenlaufwerke | ||
hd* | ||
IDE-Festplatten | ||
kmem | ||
Speicherauszug (core) | ||
lp | ||
Parallele Schnittstellen | ||
mouse | ||
Link auf die entsprechende Datei | ||
port | ||
IO-Ports | ||
sd* | ||
SCSI-Festplatten | ||
tty* | ||
Terminalkonsolen | ||
ttys* | ||
(Veraltetes) Device für die seriellen Schnittstellen, das vornehmlich zur Überwachung eingehender Verbindungen genutzt wurde. Ein Programm, das diese Datei eröffnet, wird blockiert, solange das Modem kein »Carrier Detect« meldet. Aktuell sollten die Schnittstellen /dev/ttyS* bevorzugt werden. | ||
ttyS* | ||
(Neues) Device für die seriellen Schnittstellen, das sowohl für eingehende als auch für ausgehende Verbindungen genutzt werden sollte. Die bei /dev/cua* und /dev/ttys* angedeuteten Probleme mit blockierenden Programmen werden vollkommen durch den Kernel behandelt. Somit ist es (ohne Umwege) möglich, auf einer Schnittstelle auf eingehende Verbindungen zu warten. Solange eine solche Verbindung nicht eröffnet wurde, kann auf derselben Schnittstelle eine ausgehende Verbindung eröffnet werden. Für den Zeitraum einer aktiven Verbindung bleibt der jeweils andere Prozess blockiert. |
Enthält alle lokalen Konfigurationsdateien (Tastatur, X, Netzwerk...)
Alle Heimatverzeichnisse der Nutzer finden Sie standardmäßig hier. Nach dem Login landet jeder Benutzer i.d.R. in seinem »Home«. Heimatverzeichnisse können vom Systemverwalter auch an anderer Stelle angesiedelt werden.
Die beim Systemstart benötigten Bibliotheken stehen hier. Ebenso liegen die
Kernelmodule in einem eigenen Unterverzeichnis unterhalb von /lib
.
Mountpunkt für temporäre Partitionen
Software, die nicht zum üblichen Installationsumfang von Unix-Systemen gehören, werden oft unter diesem Zweig installiert. So werden nahezu alle kommerziellen Softwarepakete hier eingerichtet; auch die Programme zur KDE befinden sich hier.
Heimatverzeichnis des Administrators. In realen Unix-Installationen werden die Heimatverzeichnisse aller Benutzer oft auf einem Server gehalten. Bei einem Ausfall eines solchen Servers sollte aber zumindest Root in der Lage sein, vernünftig mit dem System zu arbeiten. Daher liegt dessen Heimatverzeichnis direkt unterhalb der Verzeichnisbaumwurzel.
Wichtige Systemprogramme (beim Booten benötigt; Ausführung erfordert Root-Rechte)
Temporäre Dateien können hier abgelegt werden, jeder Nutzer ist dazu berechtigt.
Verzeichnisse unter /usr |
Der Filesystem Hierarchie Standard bezeichnet die Verzeichnisse unter /usr
(user system ressources) als »zweite Hierarchie«. Schauen wir uns an, was dort stehen
sollte:
X11R6 |
X Window System (Version 11, Release 6) |
X386 |
X Window System (Version 11, Release 5 auf x86er) |
bin |
Die meisten Nutzerprogramme |
games |
Spiele und Lernprogramme |
include |
Headerdateien für C-Programme |
lib |
Allgemeine Bibliotheken (außer X11) |
local |
Lokale Hierarchie. Hier hat der Administrator die Möglichkeit, Nicht-Standard-Pakete einzuspielen. |
sbin |
(weniger wichtige) Systemprogramme |
share |
Architektur-unabhängige Dateien |
src |
Quelldateien zu den Paketen |
Links unter /usr |
Einige (symbolische) Links sind ebenso vorgeschrieben:
/usr/spool |
Link auf /var/spool |
/usr/tmp |
Link auf /var/tmp |
/usr/spool/lock |
Link auf /var/lock |
Verzeichnisse unter /var |
Es gibt eine Menge Daten, die permanenter Veränderung unterliegen oder nur kurze Zeit existieren. Protokollierungen fallen ebenso in diese Kategorie, wie auch Mails, zu druckende Dateien, News, ... Insbesondere auf Servern sollte dem Verzeichnis »/var« eine eigene Partition gegönnt werden.
account |
Prozessnutzungsprotokoll (falls unterstützt) |
cache |
Zwischenspeicher von Programmen |
crash |
Speicherauszug bei Systemabsturz (falls unterstützt) |
games |
Variable Spieledaten |
lock |
Sperren (Dateien, Geräte, etc.) |
log |
Protokolle über Systemvorgänge |
mail |
Mailboxen der Nutzer |
opt |
Variable Daten der optionalen Programme |
run |
Dateien zu laufenden Prozessen |
spool |
Von Anwendungen gespoolte Daten |
state |
Variable Status Informationen |
tmp |
Temporäre Dateien, die zwischen Reboots erhalten bleiben |
yp |
Dateien des Network Information Systems |
Linux Systeme |
Speziell für Linux-Systeme definiert der Standard Weiteres:
allgemein |
Der Name des Standard-Kernels ist vmlinux oder vmlinuz
|
/dev |
Enthält nur die im Dokument »Linux Allocated Devices« beschriebenen Links (sonst wie oben) |
/proc |
Enthält Kernel- und Prozessinformationen in einem virtuellen Dateisystem |
/sbin |
Enthält zusätzlich Routinen zum ext2 -Dateisystem und lilo |
/usr/src |
Enthält zusätzlich die Kernelquellen |
Des Weiteren werden im Standard Daten nach folgenden Kriterien unterschieden: