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:

# /etc/fstab: Linux-Dateisysteme /dev/sdb8 / ext4 defaults 1 1 /dev/sdb9 /boot ext3 defaults 0 0 /dev/sdb9 /data ext4 acl,user_xattr 0 0

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:

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:

root# dmesg | grep EXT EXT3 FS on sda3, internal journal EXT3-fs: mounted filesystem with ordered data mode. ... EXT4-fs (sda4): mounted filesystem with ordered data mode

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.

root# mkfs.ext4 /dev/sdb1 mke2fs 1.42.12 Ein Dateisystems mit 3145472 (4k) Blöcken und 786432 Inodes wird erzeugt. UUID des Dateisystems: 0b1e34fb-a8a9-435e-a186-80d003abf4ee
Superblock-Sicherungskopien gespeichert in den Blöcken: 32768, 98304, 163840, 229376, 294912, 819200, 884736, 1605632, 2654208 beim Anfordern von Speicher für die Gruppentabellen: erledigt Inode-Tabellen werden geschrieben: erledigt Das Journal (32768 Blöcke) wird angelegt: erledgt Die Superblöcke und die Informationen über die Dateisystemnutzung werden geschrieben: erledigt

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.

root# tune2fs /dev/sdb1 -c 30 -i 365 tune2fs 1.42.12 (29-Aug-2014) Die maximale Anzahl von Einhängungen wird auf 30 gesetzt Der Abstand zwischen den Prüfläufen wird auf 31536000 Sekunden gesetzt

Die aktuellen Intervalle für die automatische Überprüfung des Dateisystems können Sie mit tune2fs -l feststellen:

root# tune2fs /dev/sdb1 -l | egrep -i 'check|mount count' Mount count: 0 Maximum mount count: 30 Last checked: Tue Sep 15 07:42:35 2015 Check interval: 31536000 (12 months, 5 days) Next check after: Wed Sep 14 07:42:35 2016

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.

root# fsck.ext4 -f /dev/sdb1 e2fsck 1.42.12 (29-Aug-2014) Durchgang 1: Inodes, Blöcke und Größen werden geprüft Durchgang 2: Verzeichnisstruktur wird geprüft Durchgang 3: Verzeichnisverknüpfungen werden geprüft Durchgang 4: Referenzzähler werden überprüft Durchgang 5: Zusammengefasste Gruppeninformation wird geprüft /dev/sdb1: 3347/786432 Dateien (0.1% nicht zusammenhängend), 93562/3145472 Blöcke

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:

root# e2label /dev/sdb1 mylabel

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.

root# tune2fs -U random /dev/sdb1 (zufällige UUID) root# tune2fs -U f7c49568-8955-4ffa-9f52-9b2ba9877021 /dev/sdb1 (eigene UUID)

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

root# lvextend -L 40G /dev/mapper/vg1-test Extending logical volume test to 40,00 GB Logical volume test successfully resized root# resize2fs /dev/mapper/vg1-test Das Dateisystem auf /dev/mapper/vg1-test ist auf /test eingehängt; Online-Größenveränderung nötig old desc_blocks = 2, new_desc_blocks = 3 Führe eine Online-Größenänderung von /dev/mapper/vg1-test auf 10485760 (4k) Blöcke durch. Das Dateisystem auf /dev/mapper/vg1-test ist nun 10485760 Blöcke groß.

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:

root# e4defrag -c / <Fragmented files> now/best size/ext 1. /var/log/fail2ban.log.1 16/1 4 KB 2. /home/kofler/Maildir/dovecot.index.log.2 9/1 4 KB ... Total/best extents 242365/237466 Average size per extent 55 KB Fragmentation score 1 [0-30 no problem: 31-55 a little bit fragmented: 56- needs defrag] This directory (/) does not need defragmentation. Done.

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.

root# e4defrag /var/log/fail2ban.log.1 ext4 defragmentation for /var/log/fail2ban.log.1 [1/1]/var/log/fail2ban.log.1: 100% [ OK ] Success: [1/1]

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:

http://www.paragon-software.com/home/extfs-windows