23.10Das ext-Dateisystem (ext2, ext3, ext4)
Die verschiedenen ext-Versionen dominieren die Welt der Linux-Dateisysteme. Die erste Version wurde nur kurz in der Anfangsphase von Linux eingesetzt. Dann folgten in den Jahren 1993, 2002 und 2008 die Varianten ext2, ext3 und ext4. Die maximale Dateisystemgröße wuchs dabei von 2 GByte auf ein Exabyte (1.048.576 Terabyte). Seit ext3 stehen Journaling-Funktionen zur Verfügung. Bei allen Versionen wurde auf Kompatibilität geachtet, die eine schrittweise Migration vorhandener Dateisysteme ermöglichte.
Die Kompatibilität der verschiedenen ext-Dateisystemversionen drückt sich auch dadurch aus, dass diverse Administrationswerkzeuge weiterhin die Versionsnummer 2 im Kommandonamen haben, obwohl sie auch für neuere Versionen eingesetzt werden können, z.B. tune2fs oder resize2fs.
Die ext-Entwicklung steht seit der Veröffentlichung von ext4 keineswegs still. Es gibt zwar momentan keine Pläne für ext5, es werden aber laufend neue Funktionen in ext4 eingebaut. Zuletzt wurden in der Kernelversion 4.1 Verschlüsselungsfunktionen direkt in den Dateisystemtreiber integriert.
Einträge für ext3/ext4-Dateisysteme in /etc/fstab sehen üblicherweise so wie im folgenden Beispiel aus:
Journaling
Die Dateisysteme ext3 und ext4 unterstützen Journaling-Funktionen. Der beim mount-Kommando bzw. in /etc/fstab definierte data-Parameter bestimmt, mit welchem Verfahren das Journaling durchgeführt wird:
-
data=ordered: Bei diesem Modus werden im Journal nur Metadaten gespeichert, also Informationen über Dateien, aber keine Inhalte. Im Journal werden Dateien erst dann als korrekt (committed) gekennzeichnet, wenn sie vollständig auf der Festplatte gespeichert worden sind. Nach einem Crash kann das Dateisystem sehr rasch wieder in einen konsistenten Zustand gebracht werden, weil alle unvollständig gespeicherten Dateien anhand des Journals sofort erkannt werden. Es ist aber nicht möglich, unvollständig gespeicherte Dateien wiederherzustellen.
Im Modus data=ordered wird das Journal alle fünf Sekunden mit der Festplatte synchronisiert. Bei ext3 hat das zur Folge, dass sämtliche Änderungen an irgendwelchen Dateien innerhalb von fünf Sekunden physikalisch auf der Festplatte gespeichert werden. Dieses Standardverhalten ist zwar nicht besonders effizient, dafür aber sehr sicher: Selbst bei Totalabstürzen und Stromausfällen sind massive Datenverluste äußerst selten. data=ordered hat bei ext3 eine unerfreuliche Nebenwirkung: Bei jedem Aufruf der fsync-Funktion wird nicht nur eine bestimmte Datei, sondern das gesamte Dateisystem synchronisiert. Das kann zu spürbaren Verzögerungen führen.
Bei ext4 wird das Journal zwar ebenfalls alle fünf Sekunden synchronisiert, die Datenänderungen werden aber aufgrund der Delayed Allocation (siehe unten) oft erst viel später gespeichert. Nur ein expliziter Aufruf der fsync-Funktion stellt die sofortige physikalische Speicherung einer Datei sicher! Glücklicherweise erfordert fsync bei ext4 nicht, dass das gesamte Dateisystem synchronisiert werden muss. Die Funktion wird daher wesentlich schneller ausgeführt.
-
data=writeback: Dieser Modus ähnelt dem ordered-Modus. Der Unterschied besteht darin, dass das Journal und die Dateioperationen nicht immer vollständig synchron sind. Das Dateisystem wartet mit den committed-Einträgen im Journal nicht auf den Abschluss der Speicheroperation auf der Festplatte. Damit ist das Dateisystem etwas schneller als im ordered-Modus. Nach einem Crash ist die Integrität des Dateisystems weiterhin sichergestellt. Allerdings kann es vorkommen, dass veränderte Dateien alte Daten enthalten. Dieses Problem tritt nicht auf, wenn Anwendungsprogramme – wie im POSIX-Standard vorgesehen – den Speichervorgang mit fsync abschließen.
-
data=journal: Im Gegensatz zu den beiden anderen Modi werden jetzt im Journal auch die tatsächlichen Daten gespeichert. Dadurch müssen alle Änderungen zweimal gespeichert werden (zuerst in das Journal und dann in die betroffene Datei). Deswegen ist das Dateisystem in diesem Modus deutlich langsamer. Dafür können nach einem Crash Dateien wiederhergestellt werden, deren Änderungen bereits vollständig in das Journal (aber noch nicht in die Datei) eingetragen worden sind.
Die aus Performance-Sicht wichtigste Neuerung in ext4 ist die sogenannte Delayed Allocation – eine Funktion, die es auch in vielen anderen modernen Dateisystemen gibt, z.B. btrfs, HFS+, xfs und ZFS. Delayed Allocation (auch Allocation on Flush genannt) bedeutet, dass bei Änderungen die Datenblöcke zur Speicherung von Dateiänderungen nicht sofort reserviert werden, sondern erst zu dem Zeitpunkt, zu dem die Daten physikalisch gespeichert werden – und das kann durchaus eine halbe Minute dauern. Das bringt zwei wesentliche Vorteile mit sich: Zum einen können nun Speicheroperationen gebündelt werden, was die Geschwindigkeit erhöht und die Fragmentierung des Dateisystems mindert. Zum anderen kommt es bei temporären Dateien, die nur wenige Sekunden existieren, oft zu gar keiner physikalischen Speicherung.
Sofern der Journaling-Modus und die Allozierung im mount-Kommando bzw. in /etc/fstab nicht explizit eingestellt werden, gilt das folgende Standardverhalten:
ext3 bis Kernel 2.6.29: |
data=ordered |
ext3 ab Kernel 2.6.30: |
data=writeback |
ext3 ab Kernel 2.6.36: |
data=ordered |
ext4: |
data=ordered mit Delayed Allocation |
Um herauszufinden, welcher Journaling-Modus aktiv ist, müssen Sie die Kernelmeldungen lesen. Im folgenden Beispiel gibt es je eine ext3- und eine ext4-Partition:
Um einen bestimmten Journaling-Modus explizit auszuwählen, geben Sie bei mount oder in /etc/fstab die Option data=xxx an. Bei ext4 können Sie zudem die Delayed Allocation durch die Option nodelalloc deaktivieren.
Administration
ext2-, ext3- und ext4-Dateisysteme werden mit mkfs.ext2, mkfs.ext3 oder mkfs.ext4 formatiert. Im folgenden Beispiel wird in einer 12 GByte großen Partition ein ext4-Dateisystem eingerichtet. mkfs.ext4 entscheidet sich selbstständig für eine Blockgröße von 4 kByte und für 786.432 Inodes.
Das bedeutet, dass Sie im Dateisystem maximal ca. 780.000 Dateien anlegen können. Die durchschnittliche Dateigröße würde dann 16 kByte betragen. Wenn Sie mehr kleinere oder weniger größere Dateien speichern möchten, können Sie mit -i n angeben, nach wie vielen Bytes jeweils ein Inode vorgesehen werden soll. Wenn die durchschnittliche Dateigröße kleiner ist als n, limitiert nicht die Größe der Partition, sondern die Inode-Anzahl das Dateisystem.
Beachten Sie, dass die absolute Anzahl der Inodes nicht mehr verändert werden kann, auch nicht bei einer späteren Vergrößerung des Dateisystems! In den meisten Fällen ist der Vorgabewert von mkfs.ext4 zweckmäßig.
ext-Dateisysteme können beim Rechnerstart regelmäßig auf Fehler überprüft werden, und zwar nach einer bestimmten Anzahl von mount-Vorgängen bzw. nach einer gewissen Zeit, je nachdem, welches Kriterium vorher erfüllt war. Die entsprechenden Parameter legen Sie mit tune2fs fest. Dabei geben Sie mit -c die maximale mount-Anzahl und mit -i das Zeitintervall in Tagen an. Zur Deaktivierung der Funktion geben Sie jeweils die Werte 0 an.
Die aktuellen Intervalle für die automatische Überprüfung des Dateisystems können Sie mit tune2fs -l feststellen:
Trotz der Journaling-Funktionen ist eine Überprüfung des Dateisystems hin und wieder sehr zu empfehlen, zumindest einmal pro Jahr. Zum einen werden so eventuelle Hardware-Fehler der Festplatte erkannt. Zum anderen kann es sein, dass die Dateisystemtreiber noch unbekannte Fehler enthalten. Je früher daraus resultierende Fehler korrigiert werden, desto kleiner ist der potenzielle Schaden.
Eine manuelle Überprüfung können Sie jederzeit mit dem Kommando fsck.ext2/ext3/ext4 durchführen. Die betreffende Partition darf während der Kontrolle allerdings nicht gerade verwendet werden, d.h., Sie müssen gegebenenfalls vorher umount ausführen.
Meist stellt sich bei der Überprüfung heraus, dass alles in Ordnung ist. Andernfalls werden die Reste nicht mehr rekonstruierbarer Dateien im /lost+found-Verzeichnis der jeweiligen Partition gespeichert. Falls es sich um Textdateien gehandelt hat, können Sie vielleicht aus den Überresten noch brauchbare Informationen entnehmen.
Mit e2label können Sie den internen Namen eines ext-Dateisystems (Filesystem Volume Name) ermitteln bzw. einstellen:
Diesen Namen können Sie in der ersten Spalte von /etc/fstab statt des Device-Namens angeben.
Beim Einrichten erhält das Dateisystem automatisch eine UUID, die Sie mit blkid ermitteln. Bei Bedarf verändern Sie diese Nummer mit tune2fs -U. Die Veränderung kann im laufenden Betrieb erfolgen, umount ist nicht erforderlich.
Mit resize2fs können Sie ein ext-Dateisystem vergrößern oder verkleinern. Beachten Sie, dass Sie bei einer Vergrößerung vorher die zugrunde liegende Partition oder das Logical Volume (LV) vergrößern müssen, bei einer Verkleinerung die Partition oder das LV aber erst nachher verkleinern dürfen! Im folgenden Beispiel wird das LV mit lvextend vergrößert. Weitere Details zur LVM-Administration folgen in Abschnitt 23.18, »LVM«.
Eine Vergrößerung des Dateisystems ist wie im obigen Beispiel im laufenden Betrieb möglich. Allerdings ist eine Vergrößerung über 16 TByte laut verschiedenen Internet-Berichten problematisch. Ich habe den Vorgang mangels eines ausreichend großen RAID-Verbunds nicht selbst testen können. Für eine Verkleinerung muss das Dateisystem vorher aus dem Verzeichnisbaum gelöst werden (umount).
Unter »Fragmentierung« versteht man den Zustand, dass einzelne Dateien nicht in aneinanderliegenden Blöcken, sondern über die ganze Partition verteilt gespeichert werden. Dazu kann es kommen, wenn abwechselnd Dateien gelöscht, neu angelegt, verlängert oder verkürzt werden. Die Fragmentierung kann den Dateizugriff erheblich verlangsamen.
Die ext2/3/4-Treiber versuchen eine Fragmentierung so gut wie möglich zu vermeiden. Das gelingt allerdings nur, wenn das Dateisystem nie zu mehr als ca. 90 Prozent mit Daten gefüllt ist.
Mit dem relativ neuen Kommando e4defrag können Sie ein aktives Dateisystem defragmentieren. Zuerst überprüfen Sie mit e4defrag -c für alle Dateien, ob eine Defragmentierung überhaupt sinnvoll ist:
e4defrag zeigt die fünf am meisten defragmentierten Dateien sowie einen Score für das gesamte Dateisystem an. Im obigen Beispiel ist die Defragmentierung nicht schlimm.
Wenn Sie möchten, können Sie nun in einem zweiten Schritt entweder alle oder auch nur ausgewählte Dateien mit e4defrag datei/verzeichnis/device defragmentieren.
Sie können auch unter Windows auf Linux-Partitionen zugreifen. Eine Zusammenstellung der kostenlosen Programme bzw. Treiber finden Sie hier:
http://wiki.ubuntuusers.de/Linux-Partitionen_unter_Windows
Die Firma Paragon bietet einen kommerziellen ext-Treiber für Windows an. Für Privatanwender gibt es eine kostenlose Version: