Linux-Praxisbuch/ Verzeichnisse unter Linux

Aus Wikibooks

Schon eine minimale Linux-Installation kommt mit einigen tausend Dateien daher, eine Vollinstallation der »großen« Distributionen dürfte einen Umfang von ca. 500.000 Dateien haben!

Wohin mit all den Daten?

In diesem Kapitel betrachten wir die für UNIX und Linux typische Verzeichnisordnung. Anhand eines Standards für die Rangordnung im Dateisystem, dem „Filesystem Hierarchie Standard” (kurz: FHS) verfolgen wir die Eingliederung der verschiedenen Dateiarten in die Verzeichnisse. Sie werden unter anderem lernen, wo Sie nach Konfigurationsdateien suchen müssen, welche Verzeichnisse Programme enthalten können und wo die Dokumentationen zu finden sind.

Und Sie erfahren, wie Sie auf eine Diskette oder CD-ROM zugreifen können.


Ziel des Kapitels

Nach dem Studium dieses Kapitels sollten Sie wissen:

  • welche drei Stufen die Verzeichnishierarchie hat,
  • in welchen Verzeichnissen Programme abgelegt sind,
  • wo Konfigurationsdateien liegen,
  • was Devices sind,
  • was mit dem Begriff „Mounten“ gemeint ist,
  • wie Sie eine Diskette ins Dateisystem einbinden.

Strukturierung ist notwendig

Abbildung 1: Die Linux-Verzeichnisstruktur

Bei der Unmenge von Dateien in Unix-Systemen (es können über 100.000 sein) ist eine hierarchische Ordnung, eine Aufteilung in Verzeichnisse und Unterverzeichnisse, das heißt eine Rangordung von Verzeichnissen unabdingbar. Lange Zeit brachte jedes Unix-Derivat seine eigenen Vorstellungen vom Aufbau seiner Dateiverwaltung mit, aber unterdessen hat ein Gremium, bestehend aus Unix-Distributoren, System- und Paketentwicklern, sich auf einen Standard geeinigt, der eine Verzeichnisordnung festlegt. Die meisten Distributionen folgen dieser Richtlinie, wobei Abweichungen oft durch unterschiedliche Auslegung des Standards begründet werden.

In diesem Standard wird beschrieben, welche Verzeichnisse vorhanden sein sollen und wozu jedes dieser Verzeichnisse verwendet werden soll. Zudem werden konkrete Kommandos angeführt, die mindestens in diesen Verzeichnissen vorhanden sein müssen. Des Weiteren werden systemspezifische Vorgaben und optionale Komponenten erwähnt.

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. Das Zeichen hierfür ist / am Anfang einer Pfadangabe (s. Abb.1).

Zu den Programmen gehören:

  • Dienstprogramme zum Prüfen und Reparieren des Dateisystems
  • Programme zum Sichern der Systemdaten und zur Installation neuer Systemteile
  • Eventuell wichtige Netzwerkprogramme

Übersicht über das Dateisystem

Das Konsolenkommando

man hier

liefert eine aktuelle Übersicht über Ihr Linuxdateisystem. Das Wort "hier" steht in diesem Fall für hierarchy und beschreibt die Hierarchie (auf Deutsch „Rangordnung“) des Dateisystems. „Man“ steht für Manual, das heißt „Handbuch“ oder „Bedienungsanleitung“.

Verzeichnisse in der Wurzel

Wenden wir uns zunächst dem Inhalt des Wurzelverzeichnisses zu. Verzeichnisse und Dateien, die als optionale Komponenten im Standard enthalten sind, werden farblich hervorgehoben. Haben wir uns aus dem Wurzelverzeichnis (erstes / ) herausbegeben trennt das nächste Zeichen / zwei Verzeichnisse, z. B. /usr/local.

/bin

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).

/boot

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.).

/dev

In diesem Verzeichnis stehen die Schnittstellen zur Ansteuerung der gesamten Hardware (Festplatte, Floppy, RAM...). Gemäß der UNIX-Philosophie »Alles ist eine Datei« werden diese Schnittstellen 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 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 strukturierter 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:

Art des Zugriffs

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 	
Blockorientiert (b) - gepufferter Zugriff, z. B. Festplatten
Zeichenorientiert (c) - ungepufferter Zugriff, z. B. Bildschirm, Drucker
Hauptgerätenummer (major device number)
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.

Nebengerätenummer (minor device number)
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.

Spezielle Devices

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ügend 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 diese abschließend löschen oder aber gleich anstatt der regulären Datei den Mülleimer verwenden:

user@linux> find / -name "*" 2> /dev/null 	

Wichtige Gerätedateien

  • 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.

/etc

Enthält alle lokalen Konfigurationsdateien (Tastatur, X, Netzwerk...)

/home

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.

/lib

Die beim Systemstart benötigten Bibliotheken stehen hier. Ebenso liegen die Kernelmodule in einem eigenen Unterverzeichnis unterhalb von /lib.

/mnt

Mountpunkt für temporäre Partitionen

/opt

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.

/root

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.

/sbin

Wichtige Systemprogramme (beim Booten benötigt; Ausführung erfordert Root-Rechte)

/tmp

Temporäre Dateien können hier abgelegt werden, jeder Nutzer ist dazu berechtigt.

/usr

usr steht für "unix system resources" und nicht für "Users", wie häufig vermutet wird. Siehe Verzeichnisse unter /usr.

/var

Variable Daten, siehe Verzeichnisse unter /var.

Verzeichnisse unter /usr

Der Filesystem Hierarchie Standard bezeichnet die Verzeichnisse unter /usr (unix 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:

  • Statische und variable Daten
  • Gemeinsam und exklusiv nutzbare Daten

absolute und relative Pfadangaben

Es gibt absolute Pfadangaben unter Linux, z. B. ist

/usr/bin

ein kompletter Pfad vom Root bis zum Zielverzeichnis (hier bin).

Und es gibt relative Pfadangaben. Relativ bezogen auf das Verzeichnis in dem man sich befindet. Ist man z. B. im Verzeichnis /usr so ist

./bin 

auch das Verzeichnis /usr/bin. Der Punkt vor dem Slash steht stellvertretend für das Verzeichnis in dem man sich gerade befindet - das aktuelle Verzeichnis.

Die absolute Pfadangabe zu dem jeweiligen aktuellen Verzeichnis kann man mit dem Befehl pwd (print working directory, dt. zeige Arbeitsverzeichnis) erfragen.

Es gibt 3 spezielle Pfadangaben:

  • . steht für das aktuelle Verzeichnis
  • .. steht für das Oberverzeichnis
  • ~ steht für das Homeverzeichnis

Die beiden Befehle

cd .
cd ./

haben also keinen sichtbaren Effekt und man bleibt im aktuellen Verzeichnis.