Skip to content

10 Das Dateisystem

10 Das Dateisystem

Lernziele

  • Die Begriffe »Datei« und »Dateisystem« verstehen

  • Die verschiedenen Dateitypen kennen

  • Sich im Verzeichnisbaum eines Linux-Systems zurechtfinden

  • Wissen, wie externe Dateisysteme in den Verzeichnisbaum eingebunden werden

Vorkenntnisse

  • Linux-Grundkenntnisse (etwa aus den vorherigen Kapiteln)

  • Umgang mit Dateien und Verzeichnissen (Kapitel 6)

10.1 Begriffe

Der Begriff „Datei” steht ganz allgemein für eine abgeschlossene Ansammlung von Daten. Für die Art der enthaltenen Daten gibt es keine Einschränkungen: Eine Datei kann ein nur wenige Buchstaben langer Text sein, aber auch ein mehrere Megabyte großes Archiv, das das gesamte Lebenswerk eines Anwenders umfasst. Dateien müssen nicht unbedingt gewöhnlichen Text enthalten. Auch Bilder, Klänge, ausführbare Programme und vieles andere mehr werden in Form von Dateien auf dem Datenträger abgelegt. Um die Art des Inhalts einer Datei herauszufinden, können Sie den Befehl „file” verwenden.

$ file /bin/ls /usr/bin/groups /etc/passwd
/bin/ls: ELF 32-bit LSB executable, Intel 80386,✄
✁ version 1 (SYSV), for GNU/Linux 2.4.1,✄
✁ dynamically linked (uses shared libs), for GNU/Linux 2.4.1, stripped
/usr/bin/groups: Bourne shell script text executable
/etc/passwd: ASCII text

💡 Das Programm „file” erkennt den Typ einer Datei anhand von Regeln, die im Verzeichnis „/usr/share/file” gespeichert sind. Die Regeln sind im Klartext in der Datei /usr/share/file/magic zu finden.

Sie können eigene Regeln definieren, indem Sie diese im Verzeichnis /etc/magic ablegen. Näheres dazu erfahren Sie in der man-Seite magic(5).

Zum ordnungsgemäßen Betrieb benötigt ein Linux-System einige Tausend verschiedene Dateien. Hinzu kommen die von den verschiedenen Benutzern angelegten „eigenen” Dateien.

Ein Dateisystem legt fest, nach welcher Methode die Daten auf den Datenträgern angeordnet und verwaltet werden. Auf der Festplatte liegen letzten Endes nur Bytes, die das System wiederfinden können muss – und das möglichst effizient, flexibel und auch für sehr große Dateien. Die Details der Dateiverwaltung können unterschiedlich ausgelegt sein – Linux kennt zahlreiche verschiedene Dateisysteme (zum Beispiel ext2, ext3, ext4, ReiserFS, XFS, JFS und btrfs) –, aber die logische Sicht auf die Dateien, die den Benutzern angezeigt wird, ist im Großen und Ganzen dieselbe: eine baumartige Hierarchie von Datei- und Verzeichnisnamen mit Dateien unterschiedlicher Typen. (Siehe hierzu auch Kapitel 6.)

💡 In der Linux-Szene wird der Begriff „Dateisystem” in mehreren Bedeutungen verwendet. Neben der in diesem Abschnitt eingeführten Bedeutung „Methode, Bytes auf einem Medium zu arrangieren” bezeichnen manche Leute damit auch das, was wir als „Verzeichnisbaum” bezeichnen. Außerdem wird ein konkretes Medium (Festplatte, USB-Stick usw.) mitsamt den darauf befindlichen Daten als „Dateisystem” bezeichnet – etwa in dem Sinn, dass harte Links (Abschnitt 6.4.2) nicht „über Dateisystemgrenzen hinweg”, also nicht zwischen zwei verschiedenen Partitionen auf der Festplatte oder zwischen der Festplatte und einem USB-Stick, funktionieren.

10.2 Dateitypen

In Linux-Systemen gilt der Grundsatz: „Alles ist eine Datei”. Das mag zunächst verwirrend erscheinen, ist aber sehr nützlich. Grundsätzlich können sechs Dateitypen unterschieden werden:

  • Normale Dateien (engl. plain files)

    Zu dieser Gruppe gehören neben Texten, Grafiken und Audiodaten auch ausführbare Programme. Normale Dateien können mit den üblichen Werkzeugen (Editoren, cat, Shell-Ausgabeumlenkung usw.) erzeugt werden.

  • Verzeichnisse (engl. directories)

    Sie werden auch „Ordner” genannt und dienen, wie bereits beschrieben, zur Strukturierung des Speicherplatzes. Ein Verzeichnis ist im Prinzip eine Tabelle, die Dateinamen mit Inode-Nummern zuordnet. Verzeichnisse werden mit dem Befehl mkdir angelegt.

  • Symbolische Links

    Sie enthalten eine Pfadangabe, die bei Verwendung des Links auf eine andere Datei verweist (ähnlich den „Verknüpfungen” unter Windows). Siehe auch Abschnitt 6.4.2. Symbolische Links werden mit dem Befehl „ln -s” angelegt.

  • Gerätedateien (engl. devices)

    Diese Dateien stellen Schnittstellen zu beliebigen Geräten, wie etwa Laufwerken, dar. So repräsentiert die Datei /dev/fd0 beispielsweise das erste Diskettenlaufwerk. Jeder Schreib- oder Lesezugriff auf eine solche Datei wird an das zugehörige Gerät weitergeleitet. Gerätedateien werden mit dem Kommando mknod angelegt. Dies ist normalerweise Aufgabe des Systemadministrators und wird in dieser Unterlage daher nicht weiter erklärt.

  • FIFOs

    Sie werden oft auch named pipes genannt. Ähnlich wie die Pipes der Shell (Kapitel 8) erlauben sie die direkte Kommunikation zwischen Programmen ohne Verwendung von Zwischendateien: Ein Prozess öffnet den FIFO zum Schreiben, ein anderer zum Lesen. Im Gegensatz zu den Pipes, die die Shell für ihre Pipelines benutzt und die sich aus Sicht von Programmen zwar wie Dateien benehmen, aber „anonym” sind – sie existieren nicht im Dateisystem, sondern nur zwischen Prozessen, die in einem Verwandtschaftsverhältnis stehen –, haben FIFOs Dateinamen und können darum von beliebigen Programmen wie Dateien geöffnet werden. Außerdem können für FIFOs Zugriffsrechte gesetzt werden (für Pipes ist dies nicht möglich). FIFOs werden mit dem Kommando mkfifo angelegt.

  • Unix-Domain-Sockets

    Ähnlich wie FIFOs sind Unix-Domain-Sockets ein Mittel zur Interprozesskommunikation. Sie verwenden im Wesentlichen dieselbe Programmierschnittstelle wie die „echte” Netzwerkkommunikation über TCP/IP, funktionieren jedoch nur, wenn die Kommunikationspartner auf demselben Rechner laufen. Dafür sind Unix-Domain-Sockets deutlich effizienter als TCP/IP. Im Gegensatz zu FIFOs ermöglichen Unix-Domain-Sockets eine bidirektionale Kommunikation, sodass beide beteiligten Programme sowohl Daten lesen als auch schreiben können. Unix-Domain-Sockets werden beispielsweise vom Grafiksystem X11 verwendet, wenn X-Server und -Clients auf demselben Rechner laufen. Zum Anlegen von Unix-Domain-Sockets gibt es kein spezielles Programm.

Tabelle 10.1: Linux-Dateitypen

Typ ls -l ls -F Anlegen mit …
Normale Datei - name Diverse Programme
Verzeichnis d name/ mkdir
Symbolisches Link l name@ ln -s
Gerätedatei b oder c name mknod
FIFO (named pipe) p name mkfifo
Unix-Domain-Socket s name= kein Kommando

Übungen

✏️ 10.1 [3] Suchen Sie in Ihrem System nach Beispielen für die verschiedenen Dateitypen. Tabelle 10.1 zeigt Ihnen, woran Sie die betreffenden Dateien erkennen können.

$ cd /
$ ls -l
insgesamt 125
drwxr-xr-x 2  root root 4096  Dez 20 12:37 bin
drwxr-xr-x 2  root root 4096  Jan 27 13:19 boot
lrwxrwxrwx 1  root root 17    Dez 20 12:51 cdrecorder -> /media/cdrecorder
lrwxrwxrwx 1  root root 12    Dez 20 12:51 cdrom -> /media/cdrom
drwxr-xr-x 27 root root 49152 Mär 4  07:49 dev
drwxr-xr-x 40 root root 4096  Mär 4  09:16 etc
lrwxrwxrwx 1  root root 13    Dez 20 12:51 floppy -> /media/floppy
drwxr-xr-x 6  root root 4096  Dez 20 16:28 home
drwxr-xr-x 6  root root 4096  Dez 20 12:36 lib
drwxr-xr-x 6  root root 4096  Feb 2  12:43 media
drwxr-xr-x 2  root root 4096  Mär 21 2002  mnt
drwxr-xr-x 14 root root 4096  Mär 3  12:54 opt
dr-xr-xr-x 95 root root 0     Mär 4  08:49 proc
drwx-----  11 root root 4096  Mär 3  16:09 root
drwxr-xr-x 4  root root 4096  Dez 20 13:09 sbin
drwxr-xr-x 6  root root 4096  Dez 20 12:36 srv
drwxrwxrwt 23 root root 4096  Mär 4  10:45 tmp
drwxr-xr-x 13 root root 4096  Dez 20 12:55 usr
drwxr-xr-x 17 root root 4096  Dez 20 13:02 var

Bild 10.1: Inhalt des Wurzelverzeichnisses (SUSE)

10.3 Der Linux-Verzeichnisbaum

Ein Linux-System besteht oft aus hunderttausenden Dateien. Um den Überblick zu behalten, gibt es für die Verzeichnisstruktur und die Dateien gewisse Konventionen, den Filesystem Hierarchy Standard (FHS). Die meisten Distributionen halten sich an diesen Standard, allerdings sind kleinere Abweichungen möglich. Der FHS beschreibt alle Verzeichnisse der ersten Hierarchieebene und definiert außerdem eine zweite Ebene unterhalb von /usr.

Der Verzeichnisbaum beginnt mit dem Wurzelverzeichnis „/“. Zur Unterscheidung: Es gibt auch ein Verzeichnis „/root”, das das Heimatverzeichnis des Benutzers root ist. Das Wurzelverzeichnis enthält entweder nur Unterverzeichnisse oder, sofern kein spezielles Verzeichnis „/boot” existiert, zusätzlich den Betriebssystemkern.

Mit dem Befehl „ls -la /“ können Sie sich die Unterverzeichnisse im Wurzelverzeichnis auflisten lassen. Das Ergebnis sieht beispielsweise so aus wie in Bild 10.1.

Die einzelnen Verzeichnisse folgen dem FHS und haben daher in allen Distributionen weitgehend den gleichen Inhalt. Im Folgenden werden die einzelnen Verzeichnisse genauer betrachtet.

💡 Über den FHS besteht zwar weithin Einigkeit, er ist aber genauso wenig „verbindlich” wie irgendetwas bei Linux. Einerseits gibt es sicherlich Linux-Systeme (wie das auf Ihrer FRITZ!Box oder in Ihrem digitalen Videorecorder), bei denen im Wesentlichen nur der Hersteller Änderungen vornimmt und bei denen es nichts bringt, den FHS bis ins kleinste Detail einzuhalten. Andererseits können Sie auf Ihrem System natürlich machen, was Sie wollen, müssen aber gegebenenfalls die Konsequenzen tragen. Ihr Distributor sichert Ihnen zu, dass er sich an seinen Teil des FHS hält, erwartet aber auf der anderen Seite, dass Sie sich nicht beschweren, wenn Sie sich nicht zu 100 % an die Regeln halten und dann Probleme auftreten. Wenn Sie beispielsweise ein Programm in /usr/bin installieren und die betreffende Datei beim nächsten System-Upgrade überschrieben wird, sind Sie selbst schuld, da Sie laut FHS Ihre eigenen Programme nicht in dieses Verzeichnis schreiben sollen (richtig wäre /usr/local/bin).

Im Verzeichnis /boot liegt das Betriebssystem im engeren Sinne: vmlinuz ist der Kernel von Linux. Im Verzeichnis /boot befinden sich außerdem Dateien, die für den Bootloader (in der Regel GRUB) von Bedeutung sind.

Bei manchen Systemen befindet sich das Verzeichnis /boot auf einer separaten Partition. Das kann nötig sein, wenn das eigentliche Dateisystem verschlüsselt ist oder der Bootloader aus anderen Gründen nicht darauf zugreifen kann, etwa weil besondere Treiber für den Zugriff auf ein Hardware-RAID-System benötigt werden.

  • Allgemeine Systemprogramme – /bin

    Unter /bin befinden sich die wichtigsten ausführbaren Programme (meist Systemprogramme), die zum Starten des Systems unbedingt notwendig sind. Dazu gehören beispielsweise mount und mkdir. Viele dieser Programme sind so elementar, dass sie nicht nur zum Starten, sondern auch während des Systembetriebs ständig benötigt werden, zum Beispiel ls oder grep. In diesem Verzeichnis stehen außerdem Programme, die nötig sind, um ein System wieder flott zu machen, bei dem nur das Dateisystem mit dem Wurzelverzeichnis zur Verfügung steht. Weitere Programme, die beim Start oder zur Reparatur nicht unbedingt benötigt werden, befinden sich unter /usr/bin.

  • Spezielle Systemprogramme – /sbin

    Ähnlich wie unter /bin sind auch hier Programme zu finden, die zum Systemstart oder für Reparaturen benötigt werden. Allerdings handelt es sich hierbei zum größten Teil um Systemkonfigurationswerkzeuge, die eigentlich nur der Benutzer root ausführen kann. „Normale” Benutzer können mit manchen dieser Programme Informationen abfragen, aber nichts ändern. Analog zu /bin gibt es auch das Verzeichnis /usr/sbin, in dem weitere systemnahe Programme zu finden sind.

  • Systembibliotheken – /lib

    Hier finden sich die Shared Libraries der Programme in Form von Dateien und (symbolischen) Links in den Verzeichnissen /bin und /sbin. Shared Libraries sind Programmteile, die von verschiedenen Programmen genutzt werden. Durch die gemeinsame Verwendung solcher Bibliotheken werden Systemressourcen gespart, da die meisten Prozesse teilweise gleiche Bestandteile haben, die dann nur einmal geladen werden müssen. Außerdem ist es einfacher, Fehler in solchen Bibliotheken zu korrigieren, wenn es sie nur einmal im System gibt und alle Programme den betreffenden Programmcode aus einer zentralen Datei holen. Unter /lib/modules liegen übrigens auch die Kernelmodule, also nicht notwendigerweise benötigter Systemkern-Programmcode in Form von Gerätetreibern, Dateisystemen, Netzwerkprotokollen und Ähnlichem. Diese Module können vom Systemkern bei Bedarf nachgeladen und nach Gebrauch wieder entfernt werden.

  • Gerätedateien – /dev

    In diesem Verzeichnis und seinen Unterverzeichnissen befinden sich zahlreiche Einträge für Gerätedateien. Gerätedateien bilden die Schnittstelle zwischen der Shell (oder allgemein dem Teil des Systems, den Benutzer:innen auf der Kommandozeile oder als Programmierer:innen zu sehen bekommen) und den Gerätetreibern im Systemkern. Im Gegensatz zu anderen Dateien haben sie keinen „Inhalt”, sondern verweisen über „Gerätenummern” auf einen Treiber im Systemkern.

    💡 Früher war es unter Linux-Distributoren üblich, für jedes denkbare Gerät einen Dateieintrag in /dev zu erstellen. So verfügte beispielsweise ein auf einem Notebook installiertes Linux-System über die erforderlichen Gerätedateien für zehn Festplatten mit je 63 Partitionen, acht ISDN-Adapter, 16 serielle und 4 parallele Schnittstellen usw. Heutzutage geht der Trend weg von den übervollen /dev-Verzeichnissen mit einem Eintrag für jedes vorstellbare Gerät. Stattdessen gibt es enger an den laufenden Kernel gekoppelte Systeme, in denen nur Einträge für tatsächlich existierende Geräte erscheinen. In diesem Zusammenhang ist udev (kurz für Userspace /dev) das Stichwort, das in Linux-Administration I genauer besprochen wird.

    Linux unterscheidet zwischen zeichenorientierten Geräten (engl. character devices) und blockorientierten Geräten (engl. block devices). Ein zeichenorientiertes Gerät ist beispielsweise ein Terminal, eine Maus oder ein Modem, also ein Gerät, das einzelne Zeichen liefert oder verarbeitet. Ein blockorientiertes Gerät ist ein Gerät, das Daten blockweise behandelt. Hierzu gehören beispielsweise Festplatten oder Disketten, auf denen Sie keine Bytes einzeln lesen oder schreiben können, sondern nur in Gruppen à 512 (oder so). Je nach Kategorie sind die Gerätedateien in der Ausgabe von „ls -l” mit einem „c” oder einem „b” gekennzeichnet.

    txt crw-rw-rw- 1 root root 10. 4 Oct 16 11:11 amigamouse brw-rw---- 1 root disk 8. 1 Oct 16 11:11 sda1 brw-rw---- 1 root disk 8. 2 Oct 16 11:11 sda2 crw-rw-rw- 1 root root 1. 3 Oct 16 11:11 null

    Anstelle der Speichergröße sind hier zwei Zahlen angegeben: Die erste gibt die Treibernummer (engl. major device number) an. Sie kennzeichnet den Gerätetyp und legt fest, welcher Treiber im Kernel für dessen Verwaltung zuständig ist. So haben beispielsweise alle SCSI-Festplatten traditionell die Treibernummer 8. Die zweite Zahl ist die Gerätenummer (engl. minor device number). Sie dient dem Treiber zur Unterscheidung verschiedener ähnlicher oder verwandter Geräte oder auch zur Kennzeichnung verschiedener Partitionen einer Festplatte.

    Erwähnenswert sind außerdem einige Pseudogeräte. Das Null-Gerät /dev/null ist quasi ein Mülleimer für Ausgaben eines Programms, die nicht gebraucht werden, aber irgendwohin geleitet werden müssen. Bei einem Aufruf wie

    bash $ programm >/dev/null

    wird die Standardausgabe, die sonst auf dem Terminal erscheinen würde, verworfen. Wenn /dev/null gelesen wird, reagiert es wie eine leere Datei und liefert sofort das Dateiende. Für /dev/null müssen alle Benutzer Schreib- und Leserechte haben.

    Die „Geräte” /dev/random bzw. /dev/urandom liefern zufällige Bytes in „kryptographischer” Qualität. Diese werden erzeugt, indem „Rauschen” im System gesammelt wird, beispielsweise die Zeitabstände zwischen dem Eintreffen unvorhersehbarer Ereignisse wie Tastendrücke. Die Daten aus /dev/random eignen sich zur Erzeugung von Schlüsseln für gängige Verschlüsselungsverfahren. Die Datei /dev/zero liefert Nullbytes in beliebiger Menge. Sie können diese unter anderem zum Erzeugen und zum Überschreiben von Dateien mit dem Befehl dd verwenden.

  • Konfigurationsdateien – /etc

    Das Verzeichnis /etc ist sehr wichtig, denn hier befinden sich die Konfigurationsdateien der meisten Programme. In den Unterverzeichnissen /etc/inittab und /etc/init.d beispielsweise sind die meisten systemspezifischen Daten gespeichert, die zum Starten von Systemdiensten erforderlich sind. Die wichtigsten Dateien werden im Folgenden etwas detaillierter erklärt. Mit wenigen Ausnahmen hat nur der Benutzer root Schreibrechte, jeder Benutzer hat jedoch Leserechte.

  • /etc/fstab

    In dieser Liste sind alle einhängbaren Dateisysteme mit ihren Eigenschaften (Typ, Zugriffsart und Mount-Point) aufgeführt.

  • /etc/hosts

    Diese Datei ist eine der Konfigurationsdateien des TCP/IP-Netzwerks. In ihr werden den Namen der Netzwerkrechner ihre IP-Adressen zugeordnet. In kleinen Netzwerken und bei Einzelrechnern kann diese Datei einen Nameserver ersetzen.

  • /etc/inittab

    Die Datei /etc/inittab ist die Konfigurationsdatei für das init-Programm und somit auch für den Systemstart.

  • /etc/init.d

    In diesem Verzeichnis befinden sich die Init-Skripte für die verschiedenen Systemdienste. Mithilfe dieser Skripte werden die Dienste beim Systemstart bzw. beim Herunterfahren gestartet bzw. gestoppt.

    Bei den Red-Hat-Distributionen heißt dieses Verzeichnis „/etc/rc.d/init.d”.

  • /etc/issue

    In der Datei /etc/issue ist der Begrüßungstext hinterlegt, der vor der Anmeldeaufforderung ausgegeben wird. Nach der Installation eines neuen Systems wird in diesem Text in der Regel der Name des Herstellers angezeigt.

  • /etc/motd

    Hier steht die „Nachricht des Tages“ (engl. „Message of the Day“), die nach einer erfolgreichen Anmeldung automatisch auf dem Bildschirm erscheint, bevor die Shell die erste Eingabeaufforderung ausgibt. Mithilfe dieser Datei kann der Systemadministrator aktuelle Informationen und Neuigkeiten weitergeben1.

  • /etc/mtab

    Dies ist eine Liste aller eingehängten Dateisysteme inklusive ihrer Mount-Points. Der Unterschied zwischen /etc/mtab und /etc/fstab besteht darin, dass in /etc/mtab alle aktuell eingehängten Dateisysteme aufgeführt sind, während in /etc/fstab nur die Voreinstellungen und Optionen dafür stehen, welche Dateisysteme wie eingehängt werden können – typischerweise beim Systemstart, aber auch zu einem späteren Zeitpunkt. Über die Kommandozeile können Sie natürlich beliebige Dateisysteme einhängen, wo Sie wollen, und dies wird hier auch protokolliert.

    💡 Eigentlich gehört es sich nicht, diese Art von Informationen in /etc abzulegen, da die Dateien dort prinzipiell statisch sein sollen. Hier hat die Tradition offensichtlich die Oberhand gewonnen.

  • /etc/passwd

    In der Datei /etc/passwd ist eine Liste aller dem System bekannten Benutzer zusammen mit diversen anderen benutzerspezifischen Informationen zu finden. In modernen Systemen befinden sich die Kennwörter übrigens trotz des Namens dieser Datei nicht hier, sondern in der Datei /etc/shadow. Diese Datei ist für normale Benutzer nicht lesbar.

  • Zubehör – /opt

    In diesem Verzeichnis können Drittanbieter fertige Softwarepakete bereitstellen, die sich installieren lassen, ohne mit den Dateien einer Linux-Distribution oder den lokal angelegten Dateien zu kollidieren. Solche Softwarepakete belegen ein Unterverzeichnis namens /opt/Paketname. Rein rechtlich sollte dieses Verzeichnis unmittelbar nach der Installation einer Distribution auf einer neuen Festplatte also leer sein.

  • Unveränderliche Dateien – /usr

    In /usr befinden sich in verschiedenen Unterverzeichnissen Programme und Dateien, die weder für den Systemstart noch für die Systemreparatur notwendig sind und auch sonst nicht unverzichtbar sind. Die wichtigsten Verzeichnisse sind::

  • /usr/bin

    Systemprogramme, die nicht für den Systemstart gebraucht werden und/oder anderweitig nicht so wichtig sind.

  • /usr/sbin

    Weitere Systemprogramme für root.

  • /usr/lib

    Weitere, nicht von Programmen in /bin oder /sbin benötigte Bibliotheken.

  • /usr/local

    Dies ist das Verzeichnis für Dateien, die der lokale Systemadministrator installiert hat. Die Idee dahinter entspricht dem /opt-Verzeichnis: Die Distribution darf hier nichts ablegen.

  • /usr/share

    Daten, die von der Rechnerarchitektur unabhängig sind. Prinzipiell könnte sich ein Linux-Netz, das beispielsweise aus Intel-, SPARC- und PowerPC-Rechnern besteht, eine gemeinsame Kopie von /usr/share auf einem zentralen Rechner teilen. Heute ist Festplattenplatz jedoch so günstig, dass sich keine Distribution die Mühe macht, dies tatsächlich umzusetzen.

    • /usr/share/doc

      Dokumentation – zum Beispiel HOWTOs

    • /usr/share/info

      Info-Seiten

    • /usr/share/man

      Handbuchseiten (in Unterverzeichnissen)

  • /usr

    schreibgeschützt

  • /usr/src

    Quellcode für den Kernel und weitere Programme (sofern vorhanden)

💡 Der Name „/usr” wird häufig als „Unix system resources” interpretiert, was jedoch historisch nicht korrekt ist. Ursprünglich stammt dieses Verzeichnis aus der Zeit, in der ein Rechner über eine kleine, schnelle und eine große, langsame Festplatte verfügte. Auf die kleine Festplatte kamen alle häufig verwendeten Programme und Dateien. Auf die große, langsame Festplatte, die unter /usr eingehängt war, kamen große Programme und Dateien, die nicht auf die kleine Platte passten oder die nicht so oft benötigt wurden. Heute können Sie diese Trennung anders ausnutzen: Wenn Sie es geschickt anstellen, können Sie /usr auf eine eigene Partition legen und diese schreibgeschützt in den Verzeichnisbaum einbinden. Grundsätzlich ist es sogar möglich, /usr von einem zentralen Server zu importieren. So können Sie auf Arbeitsplatzrechnern Plattenplatz sparen und die Wartung vereinfachen, da nur der zentrale Server aktualisiert werden muss. Dies ist jedoch aufgrund der gesunkenen Plattenpreise nicht mehr notwendig. Die gängigen Linux-Distributionen unterstützen dies ohnehin nicht.

  • Das Fenster zum Kernel – /proc

    Dies ist eines der interessantesten und wichtigsten Verzeichnisse. /proc ist ein sogenanntes Pseudo-Dateisystem. Es belegt keinen Platz auf der Festplatte. Die Verzeichnisse und Dateien werden erst erzeugt, wenn sich jemand für ihren Inhalt interessiert. Hier finden Sie sämtliche Informationen zu den laufenden Prozessen sowie weitere Informationen, die der Kernel über die Hardware des Rechners besitzt. In einigen Dateien finden Sie beispielsweise eine komplette Hardwareanalyse. Die wichtigsten Dateien sind nachfolgend aufgeführt:

  • /proc/cpuinfo

    Hier finden Sie Informationen zum Typ und zur Taktfrequenz der CPU.

  • /proc/devices

    Hier finden Sie eine vollständige Liste der vom Kernel unterstützten Geräte mit deren Gerätenummern. Beim Erstellen der Gerätedateien wird auf diese Datei zugegriffen.

  • /proc/dma

    Eine Liste der belegten DMA-Kanäle. Das ist auf heutigen PCI-basierten Systemen nicht mehr besonders interessant oder wichtig.

  • /proc/interrupts

    Es handelt sich um eine Liste aller belegten Hardwareinterrupts. Angegeben sind die Interruptnummer, die Anzahl der bisher ausgelösten Interrupts und die Bezeichnung der möglichen auslösenden Geräte. Ein Interrupt taucht in dieser Liste nur auf, wenn er tatsächlich von einem Treiber im Kernel beansprucht wird.

  • /proc/ioports

    Ähnlich wie /proc/interrupts, aber für I/O-Ports.

  • /proc/kcore

    Aufgrund ihrer Größe fällt diese Datei ins Auge. Sie ist der Zugang zum gesamten Arbeitsspeicher des Rechners, quasi ein Abbild des RAM, und wird zum Debuggen des Systemkerns benötigt. Sie kann nur mit Root-Rechten gelesen werden. Lassen Sie am besten die Finger davon!

  • /proc/loadavg

    In dieser Datei werden drei Zahlen ausgegeben, die die Auslastung der CPU in den letzten 1, 5 und 15 Minuten messen. Normalerweise werden diese Zahlen vom Programm „uptime” ausgegeben.

  • /proc/meminfo

    Zeigt die Speicherauslastung sowie die Auslastung des Swap-Bereichs an. Diese Datei wird vom Befehl „free” verwendet.

  • /proc/mounts

    Es folgt erneut eine Liste aller aktuell gemounteten Dateisysteme, die weitgehend mit /etc/mtab übereinstimmt.

  • /proc/scsi

    In diesem Verzeichnis befindet sich eine Datei namens „scsi”, in der die erkannten Geräte aufgelistet sind. Für jeden Typ von SCSI-Hostadapter im System gibt es ein Unterverzeichnis, in dem in einer Datei 0 (bzw. 1, 2 usw. bei mehreren gleichen Adaptern) Informationen über den Adapter gespeichert sind.

  • /proc/version

    Enthält die Versionsnummer sowie das Übersetzungsdatum des aktuellen Kernels.

    💡 Bevor es /proc gab, mussten Programme wie das Prozessstatus-Anzeigeprogramm ps einiges über die internen Datenstrukturen des Linux-Kerns wissen, um Systeminformationen aus dem Kern liefern zu können. Sie brauchten auch entsprechende Zugriffsrechte, um die betreffenden Daten aus dem laufenden Kern zu lesen. Da sich die Datenstrukturen im Zuge der Weiterentwicklung von Linux häufig änderten, war es oft nötig, zu einer neuen Kernel-Version auch neue Versionen dieser Dienstprogramme zu installieren, die an die Änderungen angepasst waren. Das /proc-Dateisystem stellt eine Abstraktionsschicht zwischen den internen Datenstrukturen und den Dienstprogrammen bereit. Heute müssen Sie nur noch sicherstellen, dass bei einer Änderung einer internen Datenstruktur das Format der Dateien in /proc gleich bleibt – und ps & Co. funktionieren weiterhin wie gewohnt.

  • Hardwaresteuerung – /sys

    Dieses Verzeichnis ist im Linux-Kernel ab der Version 2.6 verfügbar und wird ähnlich wie /proc vom Kernel selbst nach Bedarf bereitgestellt. Es erlaubt in einer umfangreichen Hierarchie von Unterverzeichnissen eine konsistente Sicht auf die verfügbare Hardware sowie diverse Steuerungseingriffe.

    💡 Tendenziell sollen alle Einträge von /proc, die nichts mit einzelnen Prozessen zu tun haben, nach und nach nach /sys wandern. Wann dieses strategische Ziel erreicht sein wird, ist allerdings unklar.

  • Veränderliche Dateien – /var

    Hier befinden sich veränderliche Dateien, die auf verschiedene Verzeichnisse verteilt sind. Beim Aufruf verschiedener Programme generiert der Benutzer Daten, meist ohne sich dessen im Detail bewusst zu sein. Ein Beispiel hierfür ist der Aufruf von man, bei dem komprimierte Hilfedaten entpackt werden (und die entpackten Versionen eine Weile aufgehoben werden – für den Fall, dass sie gleich wieder gebraucht werden). Ähnliches erfolgt, wenn gedruckt werden soll. Der Druckauftrag muss zwischengespeichert werden, beispielsweise unter /var/spool/cups. Unter /var/log werden An- und Abmeldevorgänge sowie weitere Systemereignisse protokolliert (die Log-Dateien). Unter /var/spool/cron stehen Informationen für das regelmäßige, zeitgesteuerte Starten von Kommandos und in /var/mail befindet sich die ungelesene elektronische Post der Benutzer.

    💡 Nur, damit Sie es einmal gehört haben (es könnte in der Prüfung vorkommen): Das Systemprotokoll wird auf Linux-Rechnern normalerweise über den „Syslog“-Dienst geregelt. Ein Programm namens „syslogd” nimmt Nachrichten von anderen Programmen entgegen und sortiert sie anhand ihrer Herkunft und Priorität (von „Debugginghilfe” über „Fehler” bis hin zu „Katastrophe, System schmiert gerade ab”) in Dateien im Verzeichnis „/var/log” ein. Dort können Sie sie dann finden. Außer in Dateien kann der Syslog-Dienst seine Nachrichten auch an andere Orte schicken, beispielsweise auf die Konsole oder über das Netz an einen anderen Rechner, der als zentrale Management-Station arbeitet und alle Protokollnachrichten aus Ihrem Rechenzentrum konsolidiert.

    💡 Außer dem Syslog-Dienst gibt es bei manchen Linux-Distributionen auch noch einen Klogd-Dienst. Seine Aufgabe ist es, Nachrichten vom Betriebssystemkern entgegenzunehmen und an den Syslog-Dienst weiterzureichen. Andere Distributionen kommen ohne einen separaten klogd aus, da deren syslogd diese Aufgabe selbst übernehmen kann.

    💡 Der Linux-Betriebssystemkern spuckt schon jede Menge Nachrichten aus, bevor das System überhaupt so weit ist, dass der Syslog-Dienst (und gegebenenfalls der klogd-Dienst) läuft und diese Nachrichten tatsächlich entgegennehmen kann. Da diese Nachrichten trotzdem wichtig sein können, speichert der Linux-Kern sie intern ab. Sie können mit dem Kommando dmesg darauf zugreifen.

  • Vergängliche Daten – /tmp

    Viele Dienstprogramme benötigen temporären Speicherplatz, beispielsweise manche Editoren oder Sortierprogramme. Im Verzeichnis /tmp können beliebige Programme temporäre Dateien ablegen. Beim Booten löschen viele Distributionen zumindest wahlweise alle Dateien unterhalb dieses Verzeichnisses. Sie sollten dort also nichts unterbringen, was Ihnen dauerhaft wichtig ist.

    💡 Nach Konvention wird /tmp beim Booten geleert, /var/tmp jedoch nicht. Ob Ihre Distribution das auch so handhabt, sollten Sie bei Gelegenheit prüfen.

  • Serverdateien – /srv

    Hier finden Sie Dateien, die von verschiedenen Dienstprogrammen angeboten werden, wie etwa:

    txt drwxr-xr-x 2 root root 4096 Sep 13 01:14 ftp drwxr-xr-x 5 root root 4096 Sep 9 23:00 www

    Dieses Verzeichnis ist eine vergleichsweise neue Erfindung und es ist durchaus möglich, dass es auf Ihrem System noch nicht vorhanden ist. Leider konnte man sich nicht auf einen anderen guten Platz für Web-Seiten, FTP-Angebote oder Ähnliches einigen (letzten Endes ja der Grund für die Einführung von /srv), sodass diese Daten auf einem System ohne /srv irgendwo ganz anders liegen können, etwa in Unterverzeichnissen von /usr/local oder /var.

  • Zugriff auf CD-ROMs und Disketten – /media

    Dieses Verzeichnis wird oftmals automatisch angelegt und enthält weitere leere Verzeichnisse wie /media/cdrom und /media/floppy. Sie dienen als Mountpunkt für CD-ROMs und Floppies. Je nach Ausstattung mit Wechselmedien sollten Sie sich nicht dazu gezwungen fühlen, neue Verzeichnisse wie /media/dvd anzulegen, wenn diese als Mountpoints sinnvoll sind, aber von Ihrem Distributionshersteller nicht vorgesehen wurden.

  • Zugriff auf andere Datenträger – /mnt

    Dieses ebenfalls leere Verzeichnis dient dem kurzfristigen Einbinden weiterer Dateisysteme. Bei manchen Distributionen, etwa denen von Red Hat, können sich hier (und nicht unter /media) Verzeichnisse als Mountpunkte für CD-ROM, Diskette usw. befinden.

  • Heimatverzeichnisse für Benutzer – /home

    Unter diesem Eintrag befinden sich die Heimatverzeichnisse aller Benutzer, mit Ausnahme von root. Dieser hat ein eigenes Verzeichnis.

    💡 Wenn Sie mehr als einige hundert Benutzer haben, ist es aus Datenschutz- und Effizienzgründen sinnvoll, die Heimatverzeichnisse nicht alle direkt unter /home zu platzieren. In einem solchen Fall können Sie beispielsweise die primäre Gruppe der Benutzer als weiteres Unterscheidungskriterium heranziehen.

    bash /home/support/hugo /home/entwickl/emil ✁✁✁✁✁

Tabelle 10.2: Zuordnung einiger Verzeichnisse zum FHS-Schema

statisch dynamisch
lokal /etc, /bin, /sbin, /lib /dev, /var/log
entfernt /usr, /opt /home, /var/mail
  • Heimatverzeichnis des Administrators – /root

    Dabei handelt es sich um ein ganz normales Heimatverzeichnis, wie es auch die übrigen Benutzer haben. Der entscheidende Unterschied ist, dass es nicht im Ordner „/home“, sondern im Wurzelverzeichnis („/“) liegt.

    Das Verzeichnis /home liegt oftmals auf einem separaten Dateisystem, entweder auf einer separaten Partition oder Festplatte. So soll sichergestellt werden, dass root auch dann in seiner gewohnten Umgebung arbeiten kann, wenn dieses separate Dateisystem einmal nicht angesprochen werden kann.

  • Das virtuelle Fundbüro – lost+found

    (Nur bei ext-Dateisystemen, nicht vom FHS vorgeschrieben.) Hier werden Dateien gespeichert, die ein Dateisystemcheck nach einem Systemabsturz auf der Festplatte findet. Diese Dateien sehen zwar vernünftig aus, scheinen aber in keinem Verzeichnis zu stehen. Das Prüfprogramm legt in lost+found auf demselben Dateisystem Links auf solche Dateien an. So kann sich der Systemverwalter anschauen, in welches Verzeichnis die Datei tatsächlich gehört. lost+found wird bereits „auf Vorrat” bereitgestellt, damit das Prüfprogramm es an einer festen Stelle finden kann (es hat nach Konvention auf den ext-Dateisystemen immer die Inode-Nummer 11).

💡 Eine andere Motivation für die Verzeichnisanordnung ist wie folgt: Der FHS unterteilt Dateien und Verzeichnisse grob nach zwei Kriterien: Müssen sie lokal verfügbar sein oder können sie auch über das Netz von einem anderen Rechner bezogen werden? Und sind ihre Inhalte statisch (Veränderung nur durch Intervention des Administrators) oder ändern sie sich im laufenden Betrieb? (Tabelle 10.2)

Die Idee hinter dieser Einteilung ist es, die Pflege des Systems zu vereinfachen. Verzeichnisse können leicht auf Dateiserver ausgelagert und damit zentral administriert werden. Verzeichnisse, die keine dynamischen Daten enthalten, können nur zum Lesen eingebunden werden und sind somit absturzresistenter.

Übungen

✏️ 10.2 [1] Wie viele Programme sind an den „gängigen” Plätzen auf Ihrem System installiert?

✏️ 10.3 [2] Wird grep mit mehr als einem Dateinamen als Parameter aufgerufen, gibt das Programm vor jeder passenden Zeile den Namen der betreffenden Datei aus. Dies kann ein Problem darstellen, wenn grep mit einem Shell-Dateisuchmuster (zum Beispiel „*.txt”) aufgerufen wird, da das genaue Format der grep-Ausgabe in diesem Fall nicht vorhersehbar ist. Dadurch können Programme weiter hinten in einer Pipeline durcheinanderkommen. Wie können Sie die Ausgabe des Dateinamens erzwingen, selbst wenn das Suchmuster nur zu einem einzigen Dateinamen expandiert? (Tipp: Eine dafür nützliche „Datei” steht im Verzeichnis /dev.)

✏️ 10.4 [3] Das Kommando „cp bla.txt /dev/null” tut im Wesentlichen nichts. Das Kommando „mv bla.txt /dev/null” – entsprechende Zugriffsrechte vorausgesetzt – ersetzt hingegen /dev/null durch bla.txt. Warum?

✏️ 10.5 [2] Welche Softwarepakete sind auf Ihrem System unter /opt installiert? Welche davon stammen aus der Distribution und welche von Drittanbietern? Sollte eine Distribution eine „Schnupperversion” eines Programms von Drittanbietern unter /opt installieren oder an einem anderen Ort? Was halten Sie davon?

✏️ 10.6 [1] Warum ist es unklug, Sicherheitskopien des Verzeichnisses /proc anzulegen?

10.4 Verzeichnisbaum und Dateisysteme

Der Verzeichnisbaum eines Linux-Systems erstreckt sich normalerweise über mehrere Partitionen auf der Festplatte. Auch Wechselmedien wie CD-ROMs, USB-Sticks und Ähnliches sowie tragbare MP3-Player, Digitalkameras und ähnliche Geräte, die wie Speichermedien aussehen, müssen berücksichtigt werden. Wenn Sie Microsoft Windows ein bisschen kennen, dann wissen Sie vielleicht, dass dieses Problem dort so gelöst wird, dass die verschiedenen „Laufwerke” über Buchstaben identifiziert werden. Bei Linux werden dagegen alle verfügbaren Plattenpartitionen und Medien in den Verzeichnisbaum eingegliedert, der bei „/” anfängt.

Grundsätzlich spricht nichts dagegen, ein Linux-System komplett auf einer einzigen Plattenpartition zu installieren. Es ist allerdings gängig, zumindest das Verzeichnis „/home”, in dem die Heimatverzeichnisse der Benutzer liegen, auf eine eigene Partition zu legen. Das hat den Vorteil, dass Sie das Betriebssystem, also die Linux-Distribution, komplett neu installieren können, ohne um die Sicherheit Ihrer eigenen Daten fürchten zu müssen. Sie müssen nur im richtigen Moment aufpassen, nämlich wenn Sie in der Installationsroutine die Zielpartition(en) für die Installation auswählen. Auch die Erstellung von Sicherheitskopien wird so vereinfacht.

Bei größeren Serversystemen ist es üblich, anderen Verzeichnissen – typischerweise /tmp, /var/tmp oder /var/spool – eigene Partitionen zuzuweisen. Das Ziel dabei ist, dass Benutzer den Systembetrieb nicht stören können, indem sie wichtige Partitionen komplett mit Daten füllen. Wenn beispielsweise das Verzeichnis /var voll ist, können keine Protokolldaten mehr geschrieben werden. Daher möchte man vermeiden, dass Benutzer das Dateisystem mit ungelesenen E-Mails, nicht gedruckten Druckjobs oder riesigen Dateien in /var/tmp blockieren. Allerdings wird das System durch so viele Partitionen auch unübersichtlich und unflexibel.

💡 Mehr über die Partitionierung und Strategien dafür finden Sie in der Linux-Front-Schulungsunterlage „Linux-Administration I”.

Die Datei /etc/fstab beschreibt die Zusammensetzung des Systems aus verschiedenen Partitionen. Beim Systemstart wird dafür gesorgt, dass die unterschiedlichen Dateisysteme an den richtigen Stellen „eingebunden” – der Linux-Insider sagt „gemountet” – werden. Als einfacher Benutzer müssen Sie sich darum nicht kümmern. Was Sie aber möglicherweise interessiert, ist, wie Sie an die Inhalte Ihrer CD-ROMs und USB-Sticks gelangen. Auch diese müssen Sie einhängen. Wir tun also gut daran, uns kurz mit dem Thema zu beschäftigen, auch wenn es eigentlich das Territorium der Administratoren ist. Zum Einhängen eines Mediums benötigen Sie außer dem Namen der Gerätedatei des Mediums (in der Regel ein blockorientiertes Gerät wie /dev/sda1) ein Verzeichnis irgendwo im Verzeichnisbaum, in dem der Inhalt des Mediums erscheinen soll – den sogenannten Mountpoint. Dabei kann es sich um jedes beliebige Verzeichnis handeln.

💡 Das Verzeichnis muss dabei nicht leer sein. Wenn Sie jedoch einen Datenträger „darübergemountet“ haben, können Sie nicht mehr auf den ursprünglichen Verzeichnisinhalt zugreifen. (Der Inhalt erscheint wieder, wenn Sie den Datenträger aushängen.)

⚠️ Grundsätzlich könnte jemand ein Wechselmedium über ein wichtiges Systemverzeichnis wie /etc mounten (idealerweise mit einer Datei namens passwd, die einen root-Eintrag ohne Kennwort enthält). Aus diesem Grund ist das Einhängen von Dateisystemen an beliebigen Stellen im Dateisystem zu Recht dem Systemverwalter vorbehalten, der keinen Bedarf für solche Sperenzchen haben dürfte – er ist schließlich root.

💡 Die „Gerätedatei für das Medium” haben wir weiter oben /dev/sda1 genannt. Dies ist eigentlich die erste Partition auf der ersten SCSI-Festplatte im System. Der Name kann je nachdem, was Sie mit welcher Sorte Medium vorhaben, völlig anders lauten. Es ist aber ein naheliegender Name für USB-Sticks, die vom System aus technischen Gründen so behandelt werden, als wären sie SCSI-Geräte.

Mit diesen Informationen – Gerätename und Mount-Point – kann ein Systemadministrator das Medium wie folgt einbinden:

# mount /dev/sda1 /media/usb

Eine Datei namens „datei” auf dem Medium würde dann als „/media/usb/datei” im Verzeichnisbaum erscheinen. Mit einem Kommando wie

# umount /media/usb # Achtung: kein »n«

kann der Administrator diese Einbindung auch wieder lösen.

10.5 Kommandos in diesem Kapitel

Kommando Beschreibung manpage
dmesg Gibt den Inhalt des Kernel-Nachrichtenpuffers aus dmesg(8)
file Rät den Typ einer Datei anhand des Inhalts file(1)
free Zeigt die Speicherauslastung und die Auslastung des Swap-Bereichs an free(1)
klogd Akzeptiert Protokollnachrichten des Systemkerns klogd(8)
mkfifo Legt FIFOs (benannte Pipes) an mkfifo(1)
mknod Legt Gerätedateien an mknod(1)
syslogd Bearbeitet Systemprotokoll-Meldungen syslogd(8)
uptime Gibt die Zeit seit dem letzten Systemstart sowie die CPU-Auslastung aus uptime(1)

10.6 Zusammenfassung

  • Dateien sind abgeschlossene Ansammlungen von Daten, die unter einem Namen gespeichert sind. Linux verwendet die Abstraktion „Datei” auch für Geräte und andere Objekte.

  • Die Methode der Anordnung von Daten und Verwaltungsinformationen auf einem Speichermedium nennt man Dateisystem. Der Begriff bezeichnet sowohl die gesamte baumartige Hierarchie von Verzeichnissen und Dateien im System als auch ein konkretes Medium mit den darauf befindlichen Daten.

  • Linux-Dateisysteme enthalten normale Dateien, Verzeichnisse, symbolische Links, zwei Sorten von Gerätedateien, FIFOs und Unix-Domain-Sockets.

  • Der Filesystem Hierarchy Standard (FHS) beschreibt die Bedeutung der wichtigsten Verzeichnisse in einem Linux-System und wird von den meisten Distributionen eingehalten.


  1. Man sagt, dass die einzige Gemeinsamkeit aller Unix-Systeme der Welt die message of the day ist, die darauf hinweist, dass die Platten zu 98% voll sind und die Benutzer überflüssige Dateien entsorgen mögen.