1.104.4 – Verwalten von Diskquotas

Prüfungskandidaten sollten in der Lage sein, Diskquotas für Benutzer zu verwalten. Dieses Lernziel beinhaltet das Einrichten von Diskquotas für ein Dateisystem, das Bearbeiten, Prüfen und Erstellen von Berichten über Userquotas.

Die wichtigsten Dateien, Bezeichnungen und Anwendungen:

* quota
* edquota
* repquota
* quotaon
Das Erstellen von Diskquotas hatte in der ersten Version der LPI101 Prüfung nur eine Bewertung von 1, es ist also fragwürdig, ob überhaupt nur eine Frage zu diesem Thema in der Prüfung vorkommt. Trotzdem ist es ein offizielles Thema und wird daher hier behandelt. Abgesehen von der niedrigen Bewertung ist es aber doch so, daß es ein sehr praktischer Mechanismus ist, den man in der Systemverwaltung häufig brauchen kann.

Worum geht es? Quotas sind Mechanismen, die es erlauben, bestimmten Usern oder Gruppen einen eingeschränkten Platz auf einem bestimmten Dateisystem zu gewähren. Das heißt, es ist z.B. möglich, einem User fest vorzugeben, wieviel Platz er in seinem Homeverzeichnis nutzen darf. Damit kann verhindert werden, daß ein User übermäßig viel Platz in Anspruch nimmt und so den anderen Usern Platz wegnimmt. In der Praxis findet man diesen Mechanismus häufig bei Webservern, die bestimmten Usern eine eingeschränkte Menge Platz anbieten, um Webseiten darauf abzulegen.

Das Prinzip der Quotas läuft darauf hinaus, daß der Kernel bei jedem schreibenden Zugriff eines Users auf ein Dateisystem überprüft, ob der User noch Platz hat, oder ob er seine Quote schon erreicht hat. Um das zu gewährleisten, muß schon beim Mounten des Dateisystems festgelegt werden, daß dieses Dateisystem eine Quotierung des Platzes haben soll. Das wird in der Regel in der Datei /etc/fstab festgelegt, wo bei den Optionen eines Dateisystems die Begriffe usrquota bzw. grpquota angefügt werden. Userquotas sind Einschränkungen für einzelne User, Gruppenquotas entsprechend Einschränkungen für bestimmte Usergruppen.

Voraussetzungen
Die erste Voraussetzung zur Verwendung von Disk-Quotas ist die Verwendung eines Kernels, der quotas unterstützt. Das sollte heute standardmäßig jeder Kernel anbieten.

Als nächstes muß in /etc/fstab angegeben werden, welche Dateisysteme Disk-Quota benutzen sollen. Jedes Dateisystem, das dieses Feature anbieten soll muß hier bei den Mount-Optionen den Begriff usrquota für Userquotas und/oder grpquota für Gruppenquotas enthalten. Eine /etc/fstab-Datei könnte also dann folgendermaßen aussehen:

/dev/hda2 / ext2 defaults,usrquota 1 1
/dev/hda3 swap swap defaults 0 2
/dev/hda5 /usr ext2 defaults 1 2
/dev/hda6 /opt ext2 defaults 1 2
/dev/hda7 /home ext2 defaults,usrquota 1 2

Wir haben also sowohl für das Wurzeldateisystem (hier /dev/hda2), als auch für das Dateisystem, auf dem die Homeverzeichnisse liegen (/home auf /dev/hda7) Userquotas angegeben.
Anlegen der Quotafiles mit quotacheck
Die Angabe, welche User auf welchem Dateisystem wieviel Platz bzw. wieviel Inodes benutzen dürfen, steht auf der Wurzel des jeweiligen Dateisystems in den Dateien quota.user bzw. quota.group. Diese Dateien sind Binärdateien, die zunächst einmal angelegt sein müssen. Dazu dient das Programm quotacheck. Um dieses Programm zu benutzen sind root-Privilegien nötig.

Das Programm quotacheck kann entweder für jedes Dateisystem einzeln aufgerufen werden, indem ihm die entsprechende Gerätedatei als Parameter mit angegeben wird, oder es wird mit dem Parameter -a aufgerufen und arbeitet so alle Dateisysteme ab, die in der Datei /etc/fstab eine Quotaangabe gesetzt haben.

Im einfachsten Fall schreiben wir also (als root) die Zeile

quotacheck -avug

was bedeutet, daß alle Dateisysteme bearbeitet werden, die Quotas unterstützen (-a), daß dort sowohl Userquotas (-u), als auch Gruppenquotas (-g) berücksichtigt werden und daß das Programm uns auch mitteilt, was es gerade tut (-v).

Dieser Befehl sollte immer dann angewandt werden, wenn ein neues Dateisystem mit quotas erstellt wurde oder wenn Dateisysteme nicht sauber heruntergefahren wurden, also typischerweise nach einem Systemabsturz, wenn auch fsck ausgeführt wird. Die meisten Distributionen bieten bereits fertige Startdateien an, die diese Aufgabe übernehmen.

Nach der Abarbeitung dieses Befehls existieren auf allen Dateisystemen, die die Mountoption usrquota gesetzt hatten die Datei quota.user und auf allen Dateisystemen, die die grpquota-Option aktiviert hatten die Datei quota.group. Diese Dateien enthalten binär codiert alle wichtigen Angaben über die festgelegten User- bzw. Gruppenquotas, insbesondere auch die Angaben, welche User wieviel Platz bzw. wieviele Dateien auf diesem Dateisystem im Augenblick in Anspruch nehmen.

Quotas definieren mit edquota
Nachdem die Quotadateien jetzt angelegt sind, müssen wir als nächstes die Beschränkungen definieren, die für den jeweiligen User bzw. die Gruppe gewünscht sind. Auch das darf natürlich nur root vornehmen. Für diese Aufgabe existiert das Programm edquota.

1.104.3 – Ein- und Aushängen von Dateisystemen

zurück zu 1.104 – Linux Dateisysteme
Prüfungskandidaten sollten in der Lage sein, das Einhängen (Mounten) eines Dateisystems zu konfigurieren. Dieses Lernziel beinhaltet die Fähigkeit, Dateisysteme manuell ein- und auszuhängen, die Konfiguration des Mountens von Dateisystemen bei Systemstart und das Konfigurieren von wechselbaren Datenträgern, die von Benutzern gemountet werden können, wie z.B. Bänder, Disketten und CDs.

Die wichtigsten Dateien, Bezeichnungen und Anwendungen:

* /etc/fstab
* mount
* umount
Unter Linux/Unix werden die verschiedenen Laufwerke nicht wie etwa unter Windows als einzelne Dateisysteme mit eigenem Laufwerksbuchstaben verwaltet, sondern sie werden zu einem einzigen Baum zusammengebaut. Der englische Begriff to mount (anbringen, montieren) steht für das Einhängen der verschiedenen Dateisysteme in den Dateibaum. Dieses Einhängen geschieht entweder automatisch beim Systemstart, oder einzelne Dateisysteme werden manuell während des Betriebs gemountet. Dieses manuelle Mounten bezieht sich in der Regel auf Wechsemedien, wie etwa Disketten, CD-ROMs oder auch Netzverbindungen (im Windows-Jargon: Netzlaufwerke)

In diesem Zusammenhang sind für uns zwei Programme und zwei Dateien wichtig. Die Programme sind diejenigen, die wir zum Einhängen (mount) und Abhängen (umount) benötigen, die Dateien zeigen, was wohin eingehängt werden soll (/etc/fstab) und was gerade eingehängt ist (/etc/mtab). Diese vier Elemente sollen hier dargestellt werden.
Das Programm mount
Mit dem Programm mount werden Dateisysteme an bestimmte Plätze, also in bestimmte Verzeichnisse eingehängt, neudeutsch gemountet. Die grundsätzliche Form des Programms ist simpel:

mount [-t Dateisystemtyp] [ -o Optionen] [Gerätedatei] [Mountpoint]

Die meisten Dateisystemtypen werden heute von mount selbstständig erkannt, die Angabe des Dateisystemtyps kann daher meist weggelassen werden. Die Optionen sind abhängig vom verwendeten Dateisystemtyp, sie werden später noch etwas genauer dargestellt. Wichtig ist also zunächst einmal die Angabe, welches Gerät (Gerätedatei in /dev) soll wohin eingehängt werden.

Um z.B. eine Diskette (/dev/fd0) ins Verzeichnis /floppy einzuhängen würde der Befehl

mount /dev/fd0 /floppy

genügen. Nachdem dieser Befehl ausgeführt wurde ist der Inhalt der Diskette im Verzeichnis /floppy zu finden. Eventuelle Inhalte, die vorher in diesem Verzeichnis waren sind jetzt unsichtbar, sobald das Diskettenlaufwerk aber wieder abgehängt ist, sind sie wieder vorhanden.

Sobald ein Dateisystem mit dem mount-Befehl eingehängt wurde (und dabei nicht die Option -n gesetzt wurde) wird ein Eintrag in die Datei /etc/mtab geschrieben, der das Dateisystem und den Mountpoint beschreibt.

Existiert bereits ein Eintrag in /etc/fstab, der das zu mountende Dateisystem beschreibt, so genügt dem mount-Befehl die Angabe entweder der Gerätedatei oder des Mountpoints, um das Dateisystem einzuhängen.

Soll statt eines lokalen Dateisystems ein NFS-Verzeichnis gemountet werden, so muß statt der Gerätedatei der Rechnername des NFS-Servers, gefolgt von einem Doppelpunkt “:” und dem freigegebenen Verzeichnispfad angegeben werden. So würde die Zeile

mount einstein.my.domain:/usr/public /mnt

das Verzeichnis /usr/public des Rechners einstein.my.domain in das lokale Verzeichnis /mnt einhängen.

Der mount-Befehl kann auch einfach mit dem Parameter -a aufgerufen werden, ohne Nennung eines Dateisystems. Dann werden alle Dateisysteme eingehängt, die in der Datei /etc/fstab stehen und dort nicht die Option noauto gesetzt haben. Das passiert gewöhnlich beim Hochfahren des Systems.
Die Optionen zum Einhängen der Dateisysteme
Das Programm mount kann mit dem -o Kommandozeilenparameter verschiedene Optionen setzen, wie ein Dateisystem gemountet werden soll. Die selben Optionen können auch in der Datei /etc/fstab angegeben werden (siehe unten).

Folgende Optionen werden von allen Dateisystemen verstanden:

async
Alle Ein-/Ausgabe Operationen des Dateisystems werden asynchron vorgenommen.
atime
Die Zugriffszeit der Inodes (atime) werden bei jedem Zugriff gesetzt. (Voreinstellung)
auto
Wenn diese Option in /etc/fstab steht, wird das Dateisystem gemountet, wenn mount mit der Option -a aufgerufen wird.
defaults
Entspricht den voreingestellten Optionen: rw, suid, dev, exec, auto, nouser und async
dev
Gerätedateien auf dem Dateisystem sind gültig und werden interpretiert.
exec
Erlaubt die Ausführung von Binärdateien auf dem Dateisystem.
noatime
Die Inode-Zugriffszeiten (atime) werden nicht bei jedem Zugriff gesetzt.
noauto
Wenn ein Eintrag in /etc/fstab diese Option gesetzt hat, so wird dieses Dateisystem nicht durch den Befehl mount -a eingehängt. Also wird es auch nicht beim Systemstart automatisch gemountet.
nodev
Gerätedateien auf diesem Dateisystem werden nicht interpretiert.
noexec
Verbietet die Ausführung von Binärdateien auf diesem Dateisystem.
nosuid
Die SUID und SGID Bits von Programmen auf diesem Dateisystem werden ignoriert.
nouser
Ein Normaluser (nicht root) darf dieses Dateisystem nicht mounten.
remount
Ein bereits gemountetes Dateisystem soll neu gemountet werden. Das wird meist benutzt, um die Optionen eines bereits gemounteten Dateisystems neu zu setzen, insbesondere um ein ReadOnly Dateisystem wieder beschreibbar zu mounten.
ro
Read Only – Das Dateisystem wird ReadOnly (nur lesbar) gemountet.
rw
ReadWrite – Das Dateisystem wird ReadWrite (les- und schreibbar) gemountet.
suid
SUID und SGID Bits werden interpretiert.
sync
Alle Ein- und Ausgabeoperationen werden synchron durchgeführt.
user
Erlaubt einem Normaluser, das Dateisystem zu mounten.

Neben diesen Optionen, die für alle verwendeten Dateisystemtypen gelten, existieren noch viele verschiedene Optionen für jeden einzelnen Dateisystemtyp. Diese Optionen hier darzustellen würde einerseits den Rahmen dieser Darstellung sprengen und andererseits sind sie auch nicht notwendiger Bestandteil der LPIC 101 Prüfung. Wer sie nachlesen will, kann das auf der Handbuchseite des mount-Befehls tun.
Das Programm umount
Das Programm umount (nicht unmount !!) hängt ein oder mehrere eingehängte Dateisysteme wieder ab. Das abzuhängende Dateisystem kann entweder durch die Nennung der entsprechenden Gerätedatei oder durch die Angabe des Mountpoints spezifiziert werden.

Ein Dateisystem kann nicht abgehängt werden, wenn es in Benutzung (busy) ist. Das ist in der Regel dann der Fall, wenn ein Prozess ein Verzeichnis dieses Dateisystems als aktuelles Arbeitsverzeichnis hat.

Wird umount mit dem Parameter -a aufgerufen, so werden alle Dateisysteme abgehängt, die in der Datei /etc/mtab aufgelistet sind. Das passiert gewöhnlich während des Shutdowns.
Die Datei /etc/mtab
Die Datei /etc/mtab enthält immer eine Liste aller gerade gemounteten Dateisysteme. Diese Datei wird niemals von Hand editiert, sie ist ausschließlich von den Programmen mount und umount zu beschreiben. Es existieren zwar für beide Befehle jeweils die Option -n, die verhindert, daß dieser Eintrag gemacht wird, das dient aber nur dazu, daß auch auf Systemen, deren /etc-Verzeichnis ReadOnly gemountet ist, beide Befehle funktionieren.
Die Datei /etc/fstab
Die Datei /etc/fstab ist sozusagen die Bauanleitung des Systems, in der genau steht, welches Dateisystem wohin gemountet werden soll. Es obliegt dem Systemadministrator, diese Datei zu erstellen und zu pflegen. Jedes Dateisystem wird durch eine separate Zeile in der fstab repräsentiert; innerhalb einer Zeile werden die Felder durch Tabs oder Leerzeichen getrennt. Die Reihenfolge der Zeilen in der fstab ist wichtig, da fsck(8), mount(8), und umount(8) diese Datei sequentiell abarbeiten.

Das erste Feld, (fs_spec), beschreibt das zu mountende blockorientierte Device oder remote filesystem.

Das zweite Feld, (fs_file), gibt den Mountpunkt für das Dateisystem an. Bei Swap-Partitionen sollte hier `none” stehen.

Das dritte Feld, (fs_vfstype), beschreibt den Typ des Dateisystems. Hier steht entweder (bei festen Partitionen) das jeweilige Kürzel für das Dateisystem, das auf der Partition angelegt ist (ext2, minix, vfat, swap, …) oder (bei Wechselplattenlaufwerken wie Zip- oder Diskettenlaufwerken) auto, damit der mountbefehl den jeweiligen Typ selbst erkennt. Bei NFS-Verbindungen steht hier entsprechend der Begriff nfs.

Das vierte Feld, (fs_mntops), beschreibt die zum Dateisystem gehörenden Mountoptionen. Hier werden die Optionen, die oben näher beschrieben wurden, als eine durch Kommas getrennte Liste angegeben. Falls keine speziellen Optionen gewünscht sind, wird hier der Begriff defaults eingegeben.

Das fünfte Feld, (fs_freq), wird von dump(8) benutzt um zu entscheiden welche Dateisysteme gedumpt werden müssen. Eine 1 bedeutet, daß das Dateisystem mit dump bearbeitet werden soll, eine 0 bedeutet, daß es nicht gedumpt werden muß. Ist das fünfte Feld nicht vorhanden, wird für diesen Wert Null angenommen und dump geht davon aus, daß das Dateisystem nicht gedumpt werden muß.

Das sechste Feld, (fs_passno), wird von fsck(8) benutzt um die Reihenfolge, in der die Dateisysteme während des Reboots geprüft werden, festzulegen. Das root Dateisystem sollte mit einer fs_passno von 1 versehen sein, andere Dateisysteme mit einer fs_passno von 2. Dateisysteme innerhalb eines Laufwerks werden sequentiell geprüft, Dateisysteme auf verschiedenen Laufwerken jedoch gleichzeitig, um parallel arbeitende Hardware zu unterstützen. Ist das sechste Feld nicht vorhanden oder Null, wird sinnigerweise eine Null zurückgegeben und fsck geht davon aus, daß das Dateisystem keiner Prüfung bedarf.

Normalerweise darf nur root Dateisysteme an- und abhängen. Das macht bei Festplattenpartitionen durchaus Sinn, ist aber für PC-Hardware mit Wechselmedien wie Disketten, CD-Laufwerke oder ZIP-Disks sehr unpraktisch. Wenn also gewünscht wird, daß ein Normaluser bestimmte Laufwerke auch mounten darf, so sollte bei den Optionen nach dem “defaults” noch ein “user” stehen. Damit dieses Laufwerk dann aber beim Start nicht automatisch gemountet wird (und so eine Fehlermeldung provoziert, wenn z.B. keine Diskette eingelegt ist) sollte auch noch die Option “noauto” benutzt werden.

Ein typischer Eintrag in einem sehr einfachen Linux-System könnte also folgendermaßen aussehen:

/dev/hda2 / ext2 defaults 1 1
/dev/hda3 swap swap defaults 0 2
/dev/hda5 /usr ext2 defaults 1 2
/dev/hdb /cdrom auto ro,noauto,user 0 0
/dev/fd0 /floppy auto defaults,noauto,user 0 0

1.104.2 – Erhaltung der Dateisystemintegrität

zurück zu 1.104 – Linux Dateisysteme
Prüfungskandidaten sollten in der Lage sein, die Integrität von Dateisystemen zu prüfen, freien Speicherplatz und Inodes zu überwachen und einfache Dateisystemprobleme zu beheben. Dieses Lernziel beinhaltet die Kommandos, die für die Verwaltung eines Standard-Dateisystems notwendig sind sowie die zusätzlichen Notwendigkeiten eines Journaling Dateisystems.

Die wichtigsten Dateien, Bezeichnungen und Anwendungen:

* du
* df
* fsck
* e2fsck
* mke2fs
* debugfs
* dumpe2fs
* tune2fs
Dieser Bereich hat eine verhältnismäßig hohe Bewertung und es kommen in der LPI 101 Prüfung wirklich einige Fragen zu diesem Thema an die Reihe. Zunächst einmal ist es notwendig, die Architektur der Unix-Dateisysteme zu verstehen, das wurde bereits auf den letzten Seiten erklärt. Ein großer Schwerpunkt liegt im Verständnis des I-Node-Systems. So ist z.B. eine häufige Fehlerursache das Fehlen von freien I-Nodes. Obwohl auf einer Platte noch haufenweise Megabytes frei wären kann keine Datei mehr angelegt werden. Daher sind Techniken notwendig, die das Erkennen solcher Probleme ermöglichen.

Das Programm fsck und seine Verwandten
Wie schon beim Anlegen von Dateisystemen, so ist auch beim Reparieren bzw. Prüfen der Systeme für jedes Dateisystem ein spezielles Programm vorhanden, das genau das jeweilige System kennt. Wie beim Anlegen gibt es aber eben auch wieder ein sogenanntes Frontend, das dann die jeweiligen Programme aufruft. Dieses Frontend heißt fsck (FileSystemChecK). Dieses Frontend ruft dann die einzelnen Filesystem-Checker für die jeweiligen Dateisysteme auf, als da wären:

* e2fsck bzw. fsck.ext2 für das Second Extended Filesystem
* reiserfsck für das ReiserFS
* fsck.minix für Minix Dateisysteme
* fsck.msdos für DOS-FAT-Systeme
* fsck.vfat für Windows-VFAT-Systeme
* fsck.xfs für XFS-Dateisysteme

Grundsätzlich ist jedes dieser Programme dafür gedacht, die Konsistenz eines Dateisystems zu überprüfen und gegebenenfalls zu reparieren.

Die Anwendung des fsck-Programms sollte immer nur auf nicht gemounteten Dateisystemen stattfinden, da sonst die Gefahr droht, daß ein Schreibzugriff eines anderen Prozesses (wie etwa die ständige Synchronisation) Veränderungen vornimmt, die den Check bzw. die Reparatur durcheinanderbringen und so den Schaden nur vergrößern. Das ist allerdings ein Problem beim Überprüfen des Wurzel-Dateisystems, da es nicht so einfach möglich ist, es zu checken, ohne es zu mounten. In diesem Fall sollte grundsätzlich in den Single-User-Mode gewechselt werden und das Wurzeldateisystem sollte Read-Only gemountet sein!

Beim Systemstart wird das Programm fsck mit der Option -A aufgerufen, was das Programm veranlasst, alle Dateisysteme zu überprüfen, die in /etc/fstab aufgelistet sind. Die Reihenfolge ist dabei grundsätzlich durch die Angabe des sechsten Feldes innerhalb der /etc/fstab Datei geklärt. Das Wurzeldateisystem wird zuerst überprüft und dann werden entsprechend den Nummern in diesem sechsten Feld (fs_passno) die anderen Dateisysteme der Reihe nach abgearbeitet. Wenn mehrere solcher Systeme die gleiche Nummer haben, dann wird versucht, sie gleichzeitig zu bearbeiten.

Soll ein Dateisystem manuell (nicht beim Systemstart) überprüft werden, so gibt es ein paar Dinge zu bedenken. Neben der Tatsache, die oben schon erwähnt wurde, daß das System nicht gemountet sein sollte, gibt es ein paar zu bemerkende Optionsschalter, die bekannt sein müssen.

Die grundsätzliche Aufrufform ist

fsck Optionen Dateisystem

Um das Dateisystem jetzt manuell zu überprüfen, sollten zumindestens die wichtigsten Optionen bekannt sein, sonst kann es schlimmstenfalls dazu kommen, daß es gar nicht überprüft wird. Die folgenden Optionen beziehen sich hauptsächlich auf das EXT2 Dateisystem, das im Augenblick sicherlich der Standard unter Linux ist.

-f
force – die Überprüfung wird erzwungen, auch wenn das Dateisystem ein gesetztes Valid-Flag hat. Das ist im Handbetrieb fast immer der Fall, daher ist das -f ein sehr wichtiger Parameter.
-p
preen – Automatische Reparatur ohne jede Nachfrage.
-n
no – Das Dateisystem wird ReadOnly geöffnet und alle Fragen, ob eine bestimmte Aktion durchgeführt werden soll, werden automatisch mit n(ein) beantwortet. Es werden also keine Veränderungen durchgeführt, aber man kann sehen, was passieren würde…
-y
yes – Das genaue Gegenteil von -n. Alle gestellten Fragen werden mit y(es) beantwortet.

Die Angabe des Dateisystems erfolgt in Form der entsprechenden Gerätedatei. Ein manueller Aufruf könnte also z.B. so aussehen:

e2fsck -f /dev/hda7

Damit würde das Dateisystem auf der siebten Partition (der dritten logischen Partition innerhalb der erweiterten Partition) des Masters des ersten IDE-Kanals zwingend (-f) überprüft.

Die Überprüfung und Reparatur von Journaling-Dateisystemen läuft grundsätzlich anders ab, als die von herkömmlichen Dateisystemen. Hier wird – im Falle einer Inkonsistenz – der Transaction-Log – eben das Journal – zurückverfolgt und alle Transaktionen rückgängig gemacht, bis das System wieder konsistent ist. Dieser Vorgang ist wesentlich schneller, als der bei einem traditionellen Dateisystem, da nicht die ganze Platte überprüft werden muß.

Das Programm df
Das Programm df (Disk Free) dient dazu, die Belegung einzelner Dateisysteme (oder aller gemounteten Dateisysteme) zu ermitteln. Die Anwendung ist sehr einfach, wird df ohne Parameter angewandt, so zeigt es alle gemounteten Dateisysteme etwa in der folgenden Form:

Filesystem 1k-blocks Used Available Use% Mounted on
/dev/hda2 2071328 1051656 914448 53% /
/dev/hda5 3099108 1737096 1204580 59% /usr
/dev/hda6 2071296 767708 1198364 39% /opt
/dev/hda7 2071296 215212 1750860 11% /home

Aus dieser Ausgabe ist also zu entnehmen, welche Dateisysteme gerade gemountet sind, wieviel 1 Kilobyte-Blocks insgesammt zur Verfügung stehen (1k-blocks), wieviel davon belegt sind (Used), wieviel also noch frei sind (Available), die prozentuale Auslastung – also wieviel Prozent sind belegt (Use%) und schließlich der Mountpoint, an dem das Dateisystem eingehängt ist.

Wird stattdessen der Befehl df mit einem bestimmten Dateisystem aufgerufen, entweder durch die Nennung des Mountpoints oder durch die Angabe der entsprechenden Gerätedatei, so werden nur die Angaben über dieses Dateisystem ausgegeben. Hätten wir also entweder

df /usr

oder

df /dev/hda5

eingegeben, so wäre es zur folgenden Ausgabe gekommen:

Filesystem 1k-blocks Used Available Use% Mounted on
/dev/hda5 3099108 1737096 1204580 59% /usr

Ein wichtiger Parameter für df ist noch die Angabe -i oder –inodes. Wird df mit dieser Option aufgerufen, so werden statt den Angaben über die Kilobyte-Blöcke jetzt Angaben über die I-Nodes gemacht. die Ausgabe sähe jetzt also folgendermaßen aus:

Filesystem Inodes IUsed IFree IUse% Mounted on
/dev/hda2 263296 16769 246527 6% /
/dev/hda5 393600 100095 293505 25% /usr
/dev/hda6 263296 32595 230701 12% /opt
/dev/hda7 263296 11088 252208 4% /home

Jetzt sehen wir also die Anzahl aller Inodes, die Anzahl der benutzten Inodes (IUsed), die Anzahl der freien Inodes (IFree) und wieder die prozentuale Auslastung (IUse%).

Diese Angaben sind auserordentlich wichtig, weil – wie oben schon erwähnt – es dazu kommen kann, daß zwar noch reichlich Platz in Kilobyte auf einer Partition sein kann, jedoch keine Inodes mehr frei sind, weil sehr viele, sehr kleine Dateien darauf gespeichert sind.

Auch hier gibt es einen wichtigen Hinweis für moderne Journaling-Dateisysteme. Diese Systeme speichern ihre Daten in einer völlig anderen Struktur ab, in sogenannten B-Bäumen. Das hat zur Folge, daß solche Systeme keinen reservierten Platz für die Inodes aufweisen, also Inodes dynamisch anlegen können, wenn sie benötigt werden. Aus diesem Grund zeigt df -i bei solchen Systemen keine realen Werte für die Inodes an.

Das Programm du
Das Programm du (Disk Usage) zeigt den Platzbedarf einzelner Dateien bzw. Verzeichnisse an. Das ist z.B. wichtig, wenn es darum geht, herauszufinden, welches Verzeichnis besonders viel Platz benötigt auf einer Partition, von der der df-Befehl gezeigt hatte, daß der Platz langsam knapp wird.

Das Programm ist in der Regel nur sinnvoll mit Kommandozeilenparametern anwendbar, weil es sonst alle Dateien und Verzeichnisse zeigt und die Ausgabe so etwas unübersichtlich wird. Der wichtigste Optionsschalter ist -s, der dafür sorgt, daß nur die Summe der verwendeten Bytes aller übergebenen Verzeichnisse ausgibt. So ist schnell feststellbar, wieviel Platz ein Verzeichnis mit allen darin enthaltenen Dateien und Unterverzeichnissen benötigt. Der Aufruf

du -s /opt

führt dann nur noch zu einer Ausgabe, die etwa folgendermaßen aussehen könnte:

767708 /opt

Die Angaben erfolgen normalerweise in Kilobyte, die obige Ausgabe besagt also, daß 760 Megabyte im /opt-Verzeichnis belegt sind. Wenn wir jetzt wissen wollen, wie sich diese Summe zusammensetzt, dann können wir einfach alle Verzeichnisse mitangeben, indem wir schreiben:

du -s /opt/*

und bekommen jetzt eine Auflistung wie folgt:

20 /opt/Office51
20 /opt/fsuite
88556 /opt/gnome
157568 /opt/kde
184220 /opt/kde2
16 /opt/lost+found
31372 /opt/netscape
20924 /opt/netscape6
4 /opt/nps
258728 /opt/office52
4 /opt/oracle
8 /opt/skyrix
9476 /opt/slab
11764 /opt/tfd
8 /opt/tngfw
4 /opt/virtuoso-lite
5012 /opt/www

Jetzt lässt sich also schon ziemlich genau sagen, wer hier den vielen Platz braucht…

Werkzeuge für den Umgang mit Ext2-Dateisystemen
In dieser Stufe der Linux-Zertifizierung werden für die hier genannten Werkzeuge noch keine umfassenden Kenntnisse verlangt. Wichtig ist, zu wissen, daß sie existieren und welche Aktionen damit vorgenommen werden können. An dieser Stelle also nur eine kurze Beschreibung der entsprechenden Tools mit jeweils einem Hinweis auf die Handbuchseiten. Ich habe die entsprechenden Handbuchseiten übersetzt, ein Studium dieser Information kann sicherlich nicht schaden.

* mke2fs
Das Werkzeug zum Anlegen des Dateisystems wurde in Abschnitt 1.104.1 – Erzeugen von Partitionen und Dateisystemen bereits ausführlich besprochen.
* debugfs
Ein mächtiges Werkzeug, um ein EXT2-Dateisystem zu bearbeiten. Mit diesem Programm ist es möglich, manuell alle möglichen Einstellungen des Dateisystems zu verändern, aber auch es auf einen Schlag unbrauchbar zu machen.
* dumpe2fs
Gibt den Superblock und Block-Gruppeninformationen eines EXT2-Dateisystems auf die Standard-Ausgabe aus. So kann diese wichtige Information zwischengespeichert werden um damit ein Dateisystem manuell wiederherzustellen.
* tune2fs
Ermöglicht wichtige Einstellungen von Dateisystem-Parametern des EXT2-Dateisystems.

1.104.1 – Erzeugen von Partitionen und Dateisystemen

zurück zu 1.104 – Linux Dateisysteme
Prüfungskandidaten sollten in der Lage sein, Plattenpartitionen zu konfigurieren und Dateisysteme auf Medien wie Festplatten zu erzeugen. Dieses Lernziel beinhaltet verschiedene mkfs Kommandos zur Erzeugung von verschiedenen Dateisystemen auf Partitionen, einschließlich ext2, ext3, reiserfs, vfat und xfs.

Die wichtigsten Dateien, Bezeichnungen und Anwendungen:

* fdisk
* mkfs

Wie in jedem Betriebssystem, so müssen Festplatten auch unter Linux vorbereitet werden, um vom System benutzt werden zu können. Die beiden Schritte, die nötig sind, sind

* Partitionieren einer Festplatte
* Dateisystem auf den Partitionen erstellen (unter DOS wird das “formatieren” genannt)

Für jede dieser beiden Aufgaben gibt es ein (bzw. mehrere) Programm(e) um sie zu bewältigen.
Partitionieren einer Festplatte mit fdisk
Eine neue Festplatte ist komplett leer. Damit ein beliebiges Betriebssystem auf die Platte zugreifen kann, müssen zunächst einmal bestimmte Bereiche auf der Platte angelegt werden, die das System nutzen kann – die sogenannten Partitionen. Selbst wenn eine Platte nicht unterteilt werden soll, also als ein Bereich genutzt werden soll, muß eine Partition erstellt werden.

Festplatten bestehen aus einer bis mehreren runden übereinanderliegenden Magnetscheiben, die in konzentrische Kreise (Spuren) eingeteilt werden. Alle übereinanderliegenden Spuren werden Zylinder genannt und gemeinsam angesprochen. Das liegt an der Tatsache, daß für jede Scheibenoberfläche ein Schreib/Lesekopf existiert. Alle diese Schreib/Leseköpfe sind starr miteinander verbunden. Wenn einer davon auf der Spur 5 seiner Plattenoberfläche ist, so sind alle anderen auch auf der Spur 5 jeweils ihrer Oberfläche. Daher werden Schreib- und Lesevorgänge immer auf allen untereinanderliegenden Spuren gleichzeitig durchgeführt. So entsteht der Begriff Zylinder, eben alle übereinanderliegenden Spuren.

Partitionen sind jetzt ringförmige Bereiche auf einer Platte. Eine Partition wird durch einen Start- und einen Endzylinder begrenzt. Der erste Zylinder (Zylinder 0) ist nie Teil einer Partition, sondern enthält Verwaltungsinformationen, wie den Master-Boot-Sektor und die Tabelle mit den Partitionsinformationen.

Wenn eine Platte z.B. 1024 Zylinder besitzt und in zwei Partitionen aufgeteilt werden soll, so entstünde etwa eine Aufteilung wie die folgende:

Partition Startzylinder Endzylinder
1 1 512
2 513 1023

Jede physikalische Festplatte kann bis zu vier sogenannte primäre Partitionen (primary partitions) aufnehmen. Das liegt daran, daß auf dem Zylinder 0 nur Platz gelassen wurde für vier Einträge in der Partitionstabelle (partition-table).

Eine dieser vier primären Partitionen darf eine sogenannte erweiterte Partition (extended partition) sein, die ihrerseits wieder behandelt wird, wie eine physikalische Festplatte und selbst wieder Unterpartitionen (logical partitions) aufnehmen kann. Linux kann bis zu 11 solcher logischer Partitionen pro erweiterter Partition verwalten.

Linux hat eine eindeutige Namenskonvention für Festplatten und Partitionen. Dabei wird unterschieden zwischen IDE- und SCSI-Festplatten. Die Namen für die IDE-Festplatten sind:

/dev/hda
Der Master des ersten IDE-Kanals
/dev/hdb
Der Slave des ersten IDE-Kanals
/dev/hdc
Der Master des zweiten IDE-Kanals
/dev/hdd
Der Slave des zweiten IDE-Kanals
/dev/hde
Der Master des dritten IDE-Kanals
/dev/hdf
Der Slave des dritten IDE-Kanals

SCSI-Festplatten werden der Reihe nach mit Buchstaben von a bis z durchnummeriert, zuerst alle Platten des ersten SCSI-Hostadapters, dann die des zweiten usw. Für jeden Hostadapter gilt, daß die Platten der Reihe nach durchnummeriert werden, die Platte mit der niedrigsten SCSI-ID zuerst, bis zur Platte mit der höchsten SCSI-ID. Der Name der SCSI-Platten beginnt immer mit /dev/sd. Also wäre die erste SCSI-Platte /dev/sda, die nächsten /dev/sdb, /dev/sdc usw.

Die Partitionen jeder Platte sind jetzt einfach als Nummern an diese Namen angehängt. Die primären Partitionen tragen die Nummern 1 bis 4, wobei eine dieser primären Partitionen – unabhängig von ihrer Nummer – eine erweiterte Partition sein kann. Die logischen Partitionen (Unterpartitionen) innerhalb der erweiterten Partition tragen die Nummern 5 bis 15. Daraus lassen sich also aus den Namen der Partitionen eindeutige Informationen gewinnen. Ein paar Beispiele:

/dev/hda1
Die erste primäre Partition des Masters des ersten IDE-Kanals
/dev/hdb5
Die erste logische Partition des Slaves des ersten IDE-Kanals

Wenn eine solche Bezeichnung also eine Nummer hat, so ist die jeweilige Partition angesprochen, wenn sie keine Nummer hat, so ist die ganze physikalische Platte gemeint.

Um jetzt eine bestimmte Platte zu partitionieren, müssen wir also zunächst einmal wissen, wie diese Platte heißt. Das Programm zum Partitionieren von Festplatten heißt fdisk und wird zusammen mit dem Namen der zu partitionierenden Platte aufgerufen. Wollen wir also auf der ersten SCSI-Festplatte im System (/dev/sda) Partitionen einrichten, so schreiben wir:

fdisk /dev/sda

Es erscheint zunächst mal die wenig aussagekräftige Zeile

Command (m for help):

Also drücken wir doch mal das m:

Command action
a toggle a bootable flag
b edit bsd disklabel
c toggle the dos compatibility flag
d delete a partition
l list known partition types
m print this menu
n add a new partition
o create a new empty DOS partition table
p print the partition table
q quit without saving changes
s create a new empty Sun disklabel
t change a partition’s system id
u change display/entry units
v verify the partition table
w write table to disk and exit
x extra functionality (experts only)

Command (m for help):

Für uns sind nur ein paar wenige dieser Befehle notwendig, insbesondere die folgenden:

a
Bootflag ein- und ausschalten. Manche Systeme, wie etwa DOS/Windows können nur von Partitionen booten, die den sogenannten Bootflag gesetzt haben oder – im DOS-Jargon – aktiviert sind. Linux benötigt diesen Flag überhaupt nicht.
d
Delete – Löschen einer Partition. Hier muß die jeweilige Partitionsnummer angegeben werden. Mit dem p-Befehl kann die Partitionstabelle angezeigt werden, die uns die gewünschte Nummer zeigt. Erweiterte Partitionen, die noch logische Partitionen enthalten können nicht gelöscht werden.
l
Liste aller Partitionstypen. Jede Partition hat eine hexadezimale Kenn-Nummer, die vom jeweiligen System gesetzt wird und dieser Partition einen bestimmten Typ zuweist. Linux benutzt dabei drei Kenn-Nummern, 82 für eine Swap-Partition (eine Erweiterung des Arbeitsspeichers), 83 für eine normale Linux-Plattenpartition und 8e für eine Partition des Logical Volume Managers.
n
Neue Partition anlegen. Wenn die Platte bisher keine erweiterte Partition besitzt, dann wird zunächst gefragt, ob eine primäre oder eine erweiterte Partition erstellt werden soll. Gibt es schon eine erweiterte Partition, so wird statt dessen nach primärer und logischer Partition gefragt. Existieren schon vier primäre Partitionen und eine davon ist eine erweiterte, dann fällt diese Frage weg, denn es können dann ja nur logische Partitionen angelegt werden.

Die nächste Frage ist die nach der Nummer der anzulegenden Partition und dann müssen Start- und Endzylinder angegeben werden. Statt einem End-Zylinder kann auch eine Größenangabe gemacht werden, die mit einem Pluszeichen (+) eingeleitet werden muß und einen Größenpostfix M oder K für Mega- oder Kilobyte besitzen darf. So bedeutet +256M eben eine Partitionsgröße von 256 Megabyte.
p
Print Partition-Table – Gibt die Partitionstabelle der Platte aus.
t
Wechselt den Typ der Partition. Hier kann dann einer der Typen angegeben werden, die mit dem l-Befehl angezeigt wurden.
q
Quit – Beendet das Programm ohne die vorgenommenen Änderungen tatsächlich vorzunehmen. Es bleibt also alles beim Alten.
w
Write Partition-Table – Schreibt die vorgenommenen Änderungen in die Partitionstabelle und beendet das Programm.

Mit diesen Befehlen sind alle denkbaren Aktionen durchzuführen, die wir für den Umgang mit Linux normalerweise brauchen. Wenn Sie allerdings nur die Partitionstabelle einer physikalischen Festplatte anzeigen wollen, so können Sie fdisk auch einfach mit dem Parameter -l aufrufen, dann zeigt es nur die Partitionstabelle des anfgegebenen Laufwerks (oder aller Laufwerke, wenn keines angegeben wurde) und beendet sich dann sofort wieder.
Erstellen eines Dateisystems mit mkfs und seinen Verwandten

Bevor eine Partition (oder eine Diskette) von Linux benutzt werden kann, muß zunächst ein Dateisystem erstellt werden. Das ist die gleiche Prozedur, die unter DOS/Windows “Formatieren” genannt wird. Das Prinzip eines Unix/Linux Dateisystems unterscheidet sich aber grundlegend von dem des DOS/Windows Dateisystems. So finden Sie hier zunächst einmal ein kurzen Überblick über den Aufbau von Unix-Inode-Systemen, dessen Verständnis im Folgenden vorausgesetzt wird, wenn wir im Einzelnen das Erstellen des Dateisystems besprechen. Dieses Verständnis wird insbesondere auch im nächsten Kapitel wichtig sein.

Das I-Node System

Unix-Dateisysteme sind nach einem anderen Prinzip aufgebaut, als etwa DOS-FAT-Systeme. Es gibt zwar viele verschiedene Dateisysteme unter Unix, gemeinsam haben sie jedoch eben das Prinzip der Funktionsweise. Und dieses Prinzip beruht auf den sogenannten I-Nodes.

Jede Partition enthält ein Dateisystem, dieses Dateisystem wiederum enthält eine Art Inhaltsverzeichnis, die I-Node-Liste. Die einzelnen Elemente der I-Node-Liste sind die Dateiköpfe, also die Orte wo Dateiattribute, Größe usw. gespeichert sind. Diese Dateiköpfe werden I-Nodes genannt.

Wie unter DOS auch, so verwalten Unix-Dateisysteme nicht zwangsläufig die Sektoren einer Festplattenpartition sondern Zuordnungseinheiten, die hier aber nicht Cluster sondern Block heißen. Beim Anlegen eines Dateisystems kann die Blockgröße angegeben werden, die auf dieser Partition verwendet werden soll. Typische Blockgrößen sind 512, 1024 oder 2048 Byte. Voreingestellt sind meist 1024 Byte pro Block.

Anders als unter DOS werden diese Blöcke aber nicht in einer Tabelle (FAT) zusammengefasst, sondern die I-Nodes enthalten selbst die Verweise auf diese Blöcke. Das Format eines typischen I-Nodes sieht etwa so aus:

Typ und Zugriffsrechte
Anzahl der Hardlinks
Benutzernummer (UID)
Gruppennummer (GID)
Größe der Datei in Bytes
Datum der letzten Veränderung (mtime)
Datum der letzten Statusänderung (ctime)
Datum des letzten Zugriffs (atime)
Adresse von Datenblock 0

Adresse von Datenblock 9
Adresse des ersten Indirektionsblocks
Adresse des Zweifach-Indirektionsblocks
Adresse des Dreifach Indirektionsblocks

Nach den Datumsfeldern stehen zehn Felder, die direkt die Adressen der Datenblöcke beinhalten können. Benutzt die Datei weniger Platz sind die Felder einfach leer.

Ist die Datei größer als 10 Blöcke (also größer als 10*1024 oder 10*2048 oder 10*512), so enthält das nächste Feld der I-Node eine Adresse eines Blockes, der wiederum bis zu 128 Adressen anderer Blöcke enthalten kann. Sollte das auch noch nicht ausreichen, so enthält der nächste I-Node-Eintrag eine Adresse eines Zweifach-Indirektionsblocks, eines Blocks, der bis zu 128 Adressen auf Blöcke mit wiederum 128 Adressen enthält. Und falls auch das noch zu wenig sein sollte, so enthält der nächste Eintrag die Adresse eines Blockes, der wiederum 128 Adressen von Zweifach-Indirektionsblöcken enthalten kann. Damit sind dann Dateigrößen von 1, 2 oder 4 Gigabyte (je nach Blockgröße von 512, 1024 oder 2048 Byte) möglich.

Zu beachten ist, daß der Dateiname nicht in der I-Node auftaucht. Die I-Node ist sozusagen nur die Referenz auf die Datenblöcke, die eine Datei benutzt und der Ort, an dem die Attribute wie Eigentümer, Gruppe, Größe und Zugriffsdaten gespeichert sind.

Je nach verwendetem Dateisystem liegt das Wurzelverzeichnis auf einer festgelegten I-Node, meist 1 oder 2. Grundsätzlich ist es aber dem Dateisystem bekannt, welche I-Node das Wurzelverzeichnis enthält.

Jedes Verzeichnis (Ordner, Directory) – auch das Wurzelverzeichnis ist unter Unix nichts anderes als eine Datei, deren Inhalt einfach die Dateinamen der enthaltenen Dateien samt ihren I-Node-Nummern enthält. Damit wird auch klar, warum Unix kein Problem mit Hard-Links hat, also mit Dateien mit mehreren Namen. Es handelt sich ja nur um verschiedene Namenseinträge, die eben die selbe I-Node-Nummer besitzen.

Das Standard Linux-Dateisystem ext2 hat zusätzlich zu den gezeigten I-Node Einträgen noch verschiedene andere, die das System in mancherlei Hinsicht noch leistungsfähiger macht. Für den Anwender ergenen sich dadrch keinerlei Veränderungen, in der Praxis sind aber einige positive Effekte feststellbar.

So benutzt das ext2 System beispielsweise bis zu 12 direkte Datenblockadressen, es hat noch ein zusätzliches Datumsfeld für das Datum des Löschens der Datei (für später zu entwickelnde Undelete-Funktion) und es bietet weitere Attribute, die hier nicht genauer dargestellt werden sollen weil das den allgemeinen Unix-Rahmen dieses Kurses sprengen würde.

Der Superblock

Ein Unix-Dateisystem besitzt einen sogenannten Superblock, einen Block, der die grundlegenden Informationen zum Dateisystem selbst enthält. Einige wichtige Daten des Superblocks sind:

* Die Größe des Dateisystems in Blöcken
* Die Größe der Blöcke in Bytes
* Zeiger auf den ersten freien Datenblock
* Zeiger auf erste freie I-Node
* Verschiedene Statusbits (Flags)

Auch hier unterscheiden sich die verschiedenen Unix-Dateisysteme voneinander, was an zusätzlichen Informationen im Superblock gespeichert ist. Das wesentliche an dieser Struktur ist, daß der Superblock beim Mounten eines Dateisystems in den Speicher gelesen wird und alle Veränderungen dort vorgenommen werden. Erst beim Wiederabhängen des Dateisystems werden diese Veränderungen physikalisch auf der Platte gespeichert. Das erklärt auch, daß es nach einem Systemabsturz zu Inkonsistenzen in einem Dateisystem kommen kann.

Noch vor dem Superblock steht der sogenannte Bootblock auf der Platte, der in etwa dem Bootsektor der DOS-Partitionen entspricht. Zusammengefasst kann man also ein Unix-Dateisystem etwa wie folgt darstellen:

pic

Der häufigste Dateisystemtyp unter Linux ist das Second Extended Filesystem oder kurz EXT2. Es unterscheidet sich in einzelnen Details vom Standard-Unix-Dateisystem, benutzt aber die selben Techniken, was I-Nodes angeht. Für das Verständnis der LPIC-Level1 Prüfung reicht das Wissen um diesen Standard. Für die speziell Interessierten findet sich hier noch Informationen über das EXT2 Filesystem:

Das EXT2 Dateisystem

Im Wesentlichen entspricht das Second Extended Filesystem (EXT2) von Linux dem Unix-Inode-System, das an anderer Stelle schon beschrieben wurde. Es gibt aber ein paar wesentliche Unterschiede, die hier kurz erläutert werden sollen.

Der Aufbau einer EXT2 Inode

Die wesentlichen Unterschiede des EXT2 Systems zum “normalen” I-Node-System liegen in der Struktur der I-Nodes selbst. Hier sind einige Felder hinzugekommen, die für bestimmte Erweiterungen vorgesehen wurden, die im folgenden genauer erklärt werden. Doch zunächst einmal die Struktur der Inode selbst:

permission links owner group
size creation time
modification time access time
deletion time blockcount
flags file version (NFS)
file ACL dir ACL
fragment addr. fr. size frag. nr reserved
1. block data 2. block data
3. block data 4. block data
5. block data 6. block data
7. block data 8. block data
9. block data 10. block data
11. block data 12. block data
simple indirect double indirect
triple indirect reserved
reserved reserved

Die wesentlichen Unterschiede zum bisher beschriebenen I-Node-System sind:

* Neben den drei Standard-POSIX-Zeitmarken (ctime, atime, mtime) gibt es hier eine vierte Zeitmarke, die die Löschzeit (deletion time) speichert. Das ist gedacht für Spezialprogramme zum Wiederherstellen versehentlich gelöschter Dateien.
* Ein Feld für flags ist hinzugekommen. Diese Flags ermöglichen es, daß Dateien bestimmte Eigenschaften bekommen, die weiter unten genauer beschrieben werden.
* Der Eintrag file version kann vom NFS-Server zur Unterscheidung verschiedener Versionen einer Datei verwendet werden.
* Zwei Einträge für eine erweiterte Zugriffskontrolle für Dateien (file ACL) und Verzeichnisse (dir ACL) sind hinzugekommen. ACL steht für Access Control List.
* Die Unterstützung fragmentierter Datenzonen ist vorgesehen.
* Es stehen 12 direkte Adressfelder für Datenblocks zur Verfügung.

Die Flags des EXT2 Filesystems

Jede Datei in einem EXT2 Dateisystem kann neben den normalen Unix-Zugriffsrechten noch einen Satz zusätzlicher Flags bekommen, die hier noch erläutert werden sollen. Um sich die Flags (oder auch Attribute) anzusehen, wird das Programm lsattr benutzt, zum Ändern der Attribute wird chattr benutzt. Es gibt die Attribute A,a,c,d,i,S,s und u.

* Wenn eine Datei mit gesetztem A-Attribut verändert wird, so wird das atime Feld nicht verändert.
* Eine Datei, die das a-Attribut gesetzt hat, kann nur im Append-Mode geöffnet werden. Das heißt, Daten können an diese Datei angehängt werden, bestehende Daten jedoch nicht gelöscht.
* Eine Datei mit dem c-Attribut wird automatisch vom Kernel komprimiert, bevor sie auf die Platte geschrieben wird. Wenn sie gelesen wird, dann entkomprimiert der Kernel die Datei wieder, ein Anwender merkt also nichts von der Kompression.
* Eine Datei mit gesetztem d-Attribut ist kein Kandidat für ein Backup mit dem dump Befehl.
* Eine Datei mit gesetztem i-Attribut kann nicht verändert werden, sie kann nicht gelöscht oder umbenannt werden, kein Link kann auf sie erstellt werden und keine Daten können in ihr verändert werden. Dieses Attribut kann nur vom Superuser gesetzt oder entfernt werden.
* Wenn eine Datei mit gesetztem s-Attribut gelöscht wird, dann werden die Bytes der Datei mit Nullen überschrieben. Ein sicheres Löschen, das keine Wiederherstellung erlaubt.
* Wenn eine Datei, deren S-Attribut gesetzt ist, verändert wird, dann wird diese Veränderung synchron auf die Platte geschrieben, ohne lange im Cache zu liegen.
* Wenn eine Datei mit gesetztem u-Attribut gelöscht wird, dann wird ihr Inhalt gesichert, so daß sie wiederhergestellt werden kann.

Erweiterungen des Superblocks

Der Superblock eines EXT2-Dateisystems enthält ein sogenanntes Valid-Flag. Sobald dieses Dateisystem gemountet wird, wird das Valid-Flag gelöscht. Erst beim Umount wird es wieder gesetzt. Sollte das System abstürzen, so bleibt das Valid-Flag ungesetzt – beim nächsten Start kann also erkannt werden, daß dieses Dateisystem nicht ordnungsgemäß abgehängt worden ist.

Das Programm zur Überprüfung eines EXT2 Dateisystems (e2fsck) überprüft dieses Valid-Flag und prüft (falls es nicht durch die -f Option gezwungen wurde) nur dann das Dateisystem, wenn das Valid-Flag nicht gesetzt war. So kann beim Systemstart einfach für jede Partition das e2fsck-Programm aufgerufen werden. Es wird nur dann aktiv, wenn es nötig ist.

Der Superblock enthält weiterhin eine Angabe über die maximale Anzahl von Mount-Vorgängen, die zwischen zwei System-Checks ablaufen dürfen. Jedesmal, wenn ein Dateisystem gemountet wird, wird ein Zähler (mount-count) um eins erhöht. Wird bei einem Systemstart festgestellt, daß der Wert des Zählers den Wert der maximalen Mountvorgänge überschreitet, so wird ein Systemcheck erzwungen.

Im Superblock steht noch eine Angabe, die festlegt, wieviel Prozent eines Dateisystems für den Superuser root reserviert wird. Standardmäßig sind es 5 Prozent.

Um diese Werte zu manipulieren steht das Programm tune2fs zur Verfügung. Dieses Programm sollte aber nur für Dateisysteme verwendet werden, die gerade nicht read-write gemountet sind!

Das Programm, mit dem wir Dateisysteme erstellen heißt mkfs (Make FileSystem) und ist eigentlich nur ein Frontend für weitere Programme, die dann für jedes Linux-Dateisystem extra zur Verfügung stehen, wie etwa mkfs.ext2, mkfs.minix, mkfs.msdos oder mkfs.xiafs.

Der grundsätzliche Aufruf von mkfs ist

mkfs [ -t Dateisystemtyp ] [ Optionen ] Gerätedatei [ Blocks ]

Dabei sind die Optionen abhängig vom verwendeten Dateisystemtyp. Wird der Dateisystemtyp weggelassen wird heutzutage EXT2 angenommen, aber darauf gibt es keine Garantie. Werden die Blocks weggelassen, so werden alle zur Verfügung stehenden Blocks verwendet.

Das Programm zur Erstellung von EXT2-Dateisystemen kennt die folgenden wichtigen Parameter:

-b Blockgröße
Spezifiziert die Größe der Blocks in Byte. Gültige Größen sind 1024, 2048 und 4096.
-c
Checkt das Gerät nach schlechten Blocks ab, bevor das Dateisystem erstellt wird.
-i Bytes-Per_Inode
Stellt das Verhältnis von Plattenplatz zur Menge der Inodes ein. Je größer der angegebene Wert ist, um so weniger Inodes werden erstellt. Dieser Wert sollte grundsätzlich kleiner als die Blockgröße des Dateisystems sein.
-N Anzahl der Inodes
Gibt die absolute Anzahl der zu erstellenden Inodes an. Wird anstatt des -i Parameters verwendet bzw. überschreibt dessen Einstellungen.

In der Regel ist es ausreichend, ein Dateisystem mit den Standard-Parametern anzulegen, also einfach gar keine Parameter anzugeben. ein einfaches

mkfs /dev/hdb5

legt ein solches Dateisystem auf der Partition 5 der zweiten IDE-Platte an. In Ausnahmefällen ist es aber notwendig, bestimmte Parameter zu verändern. So werden beispielsweise beim Anlegen eines EXT2-Dateisystems auf einer Diskette nur 184 Inodes angelegt. Normalerweise würde das sicher auch reichen, um die 1,44 MByte Diskettenplatz aufzuteilen. Wenn wir aber etwa eine Bootdiskette erstellen wollen, die schon alleine hunderte von Gerätedateien im /dev-Verzeichnis braucht, ist diese Einstellung definitiv nicht brauchbar. Hier müssten wir also mit dem -N Parameter manuell die Anzahl der zu erstellenden Inodes hochsetzen.

Explizites Anlegen eines EXT2- oder EXT3-Dateisystems
Um sicherzugehen, daß tatsächlich ein Dateisystem des Typs EXT2 (second extended) oder seine Erweiterung zum Journaling Dateisystem (ext3) erzeugt wird, muß entweder der Dateisystemtyp mit der Option -t ext2 angegeben werden, oder es wird gleich das entsprechende Programm mke2fs aufgerufen.

Mit diesem Programm können beide Dateisystemtypen erzeugt werden. Um ein Journaling-Dateisystem vom Typ ext3 zu erzeugen muß der Parameter -j (journaling) mit angegeben werden.

Anstatt mke2fs kann auch mkfs.ext2 oder mkfs.ext3 angegeben werden.
Explizites Anlegen eines Reiser-Dateisystems
Wenn ein Dateisystem des Typs REISERFS angelegt werden soll, so muß dem mkfs-Programm der Parameter -t reiserfs angegeben werden, oder es wird das Programm mkreiserfs direkt aufgerufen.

Anstatt mkreiserfs kann auch mkfs.reiserfs angegeben werden.

Eine explizite Angabe der anzulegenden Inodes entfällt bei dieser Dateisystemart, weil das Reiserfs die Inodes dynamisch anlegt, je nach Bedarf.
Explizites Anlegen eines XFS-Dateisystems
Wenn ein Dateisystem des Typs XFS angelegt werden soll, so muß dem mkfs-Programm der Parameter -t xfs angegeben werden, oder es wird das Programm mkfs.xfs direkt aufgerufen.
Explizites Anlegen eines VFAT-Dateisystems
Wenn ein Dateisystem des Typs VFAT (Windows Dateisystem) angelegt werden soll, so muß dem mkfs-Programm der Parameter -t vfat angegeben werden, oder es wird das Programm mkdosfs direkt aufgerufen.

Anstatt mkdosfs kann auch mkfs.vfat angegeben werden.

1.104 Journaling Dateisysteme

zurück zu 1.104 – Linux Dateisysteme
Ein großer Nachteil der traditionellen Unix-Dateisysteme ist die interne Verwaltung von Dateisysteminformationen. Der Superblock eines Dateisystems wird beim Mounten des Dateisystems in den Arbeitsspeicher geladen und alle Veränderungen des Superblocks werden dort vorgenommen. Die eigentlichen Veränderungen am Dateisystem (Anlegen, Verändern oder Löschen von Dateien) werden aber tatsächlich minütlich auf der Platte vorgenommen. Erst beim Abhängen des Dateisystems (in der Regel beim Herunterfahren) wird der im Speicher liegende Superblock physikalisch auf die Platte geschrieben.

Dieser Mechanismus spart zwar Zeit, weil Zugriffe auf den Arbeitsspeicher wesentlich schneller erledigt werden können, als Zugriffe auf die Platte, aber er birgt große Risiken. Wenn ein solches Dateisystem nicht korrekt abgehängt wird, etwa bei einem Systemabsturz oder Stromausfall, dann kann der aktuelle Superblock nicht mehr auf die Platte geschrieben werden. Der Zustand des Dateisystems ist dann inkonsistent, das bedeutet, daß der Superblock nicht mehr die tatsächliche aktuelle Situation des Dateisystems beschreibt, sondern die, die das Dateisystem beim vorletzten Mounten aufwies.

Linux reagiert auf diese Inkonsistenz mit einem erzwungenen Dateisystemcheck beim Booten, wenn das System merkt, daß eine Platte nicht korrekt abgehängt wurde. Dieser Systemchek kann – je nach Partitionsgröße – sehr lange dauern und im schlimmsten Fall einen manuellen Eingriff erfordert. Das bedeutet, daß ein abgestürzter Server lange nicht mehr zur Verfügung steht und eventuell sogar nicht mehr automatisch wieder hochfährt.

Um dieses Problem zu lösen, wurden moderne Dateisysteme mit einem neuen Mechanismus ausgestattet, dem Journaling. Dabei wird jede Transaktion zwischen dem System und der Platte in einem Journal mitprotokolliert, so daß nach einem Absturz in sehr kurzer Zeit wieder ein konsistenter Zustand hergestellt werden kann. Das bedeutet nicht, daß alle Daten wiederhergestellt werden können, die durch den Absturz womöglich verlorengingen, sondern nur, daß es zu keiner Diskrepanz zwischen Superblock und Dateisystem kommen kann.

Dazu wird beim Systemstart – falls es zu einem Absturz gekommen war – das Journal gelesen und die darin enthaltenen Transaktionen werden quasi Stück für Stück rückgängig gemacht, bis es wieder zu einem konsistenten Zustand kommt. Dieser Vorgang kann wesentlich schneller ausgeführt werden, als ein Dateisystemcheck eines herkömmlichen Dateisystems, weil nicht die ganze Platte überprüft werden muß. Die Dauer ist auch nicht abhängig von der Größe der Partition.

Linux bietet heute mehrere Dateisystemtypen an, die das Journaling beherrschen. Bemerkenswert sind dabei die folgenden:

Ext3fs
Ext3fs ist nicht wie der Name vermuten ließe ein echter Nachfolger von Ext2fs, dem Standard-Dateisystem unter Linux. Ext3fs ist vielmehr eine Erweiterung von Ext2fs, da sich am Dateisystem so gut wie nichts entscheidendes zum “Vorgänger” verändert hat. Die Erweiterung beschränkt sich – etwas übertrieben gesagt – im wesentlichen auf das Hinzufügen einer Datei – dem Logfile. Das Ziel bei der Entwicklung von Ext3fs war es mit minimalen Änderungen eine komplette Lösung zu finden, die das Journaling unterstützt. Hierfür wurde dann eine Kopie des Ext2fs-Quellcodes gemacht und eine textuelle Ersetzung durchgeführt mit der “ext2” durch “ext3” ersetzt wurde. Hinzugefügt wurde dann eine vom Dateisystem selbst völlig unabhängige Schicht die das Journaling übernimmt. Das Dateisystem selber hat nichts mit dem Journaling zu tun. Die einzige Änderung die das System hinter sich hat ist, dass es jede Aktion die Schreibend auf die Festplatte zugreift in eine Transaktion packt. D.h. es wird der Journaling-Schicht mitgeteilt, welche Blöcke innerhalb einer Transaktion geändert werden sollen. Den Rest übernimmt dann die neue Journaling-Schicht.

ReiserFS
Beim Dateisystem des Hans Reiser werden im Journal alle Metadatenänderungen protokolliert, die mehr als einen Block betreffen. Bei einem Systemabsturz ist also lediglich sichergestellt, dass das System sehr schnell wieder in einen konsistenten zustand gesetzt wird. Datenverluste kann es weiterhin geben, da ja “nur” die Metadaten im Journal gesichert werden.

Die Datenstruktur wird hier in einem B*-Baum gespeichert. In den Blättern werden vier verschiedene Arten von Datensätzen gespeichert:

* direkte Datensätze: Alle kleinen Dateien (< 1 Block) werden direkt im Baum gespeichert. (Eine 10 Zeichen große Datei landet bei Ext2fs in einem Block von z.B. 1024 Bytes) Hierdurch wird Plattenplatz und ein zusätzlicher Plattenzugriff gespart
* indirekte Datensätze: Hier werden Zeiger auf größere Dateien, die dann außerhalb des Baumes liegen, gespeichert
* Verzeichnisse: Enthält die einzelnen Einträge eines Verzeichnisses
* stat data: Was Ext2fs in Inodes speichert wird hier direkt im Baum gespeichert.

Jeder Datensatz besitzt einen eindeutigen Schlüssel (Hashfunktion), der zum Sortieren und Wiederfinden benutzt wird. Durch die Verwaltung des Baumes (ausbalancieren beim Hinzufügen bzw. Löschen von Einträgen) nimmt das Speichern etwas mehr Rechenzeit in Anspruch als der einfache Mechanismus beim ext2.

XFS
XFS ist eine Portierung des Dateisystems von IRIX, das bereits seit langem auf den bekannten Grafik-Workstations und Servern von Silicon-Graphics läuft. Die Version 1.0 erschien am 1.Mai 2001. Da es in diesem Bereich besonders auf Sicherheit und Geschwindigkeit ankommt ist XFS besonders für große Dateien ausgelegt. Wenn man bedenkt, dass Dateien bis zu 9.000 PByte groß sein können (zur Information die Reihenfolge: Kilo-, Mega-, Giga-, Terra-, Peta-, Exa-Byte).

Die technischen Details füllen ganze Seiten. Zu erwähnen wäre z.B. dass mit dem plattformübergreifenden xfsdump/xfsrestore sogar Dumps von IRIX nach Linux transferiert werden können.