Linux: ext3 und reiserfs im Detail

01.02.2005 von Michael Kofler
Unsere Artikelserie führt in die Administration des Linux-Dateisystems ein. Der vierte Teil erklärt die wichtigsten Details und besondere Features der beiden meist genutzten Journaling-Dateisysteme, ext3 und reiserfs.

Unsere neue Linux-Serie beschreibt die verschiedenen Facetten der Administration des Dateisystems. Mit Ausnahme der ersten beiden Teile richtet sich die Serie explizit an Linux-Profis. Die achtteilige Artikelreihe behandelt dabei folgende Themen:

Die Artikelserie basiert auf dem Kapitel 25 des Standardwerks "Linux - Installation, Konfiguration, Anwendung" von Michael Kofler aus dem Verlag Addison-Wesley. Sie können dieses über 1200 Seiten starke Buch auch in unserem Buchshop versandkostenfrei bestellen oder als eBook herunterladen.

Serie: Administration des Linux-Dateisystems

Teil 1

Dateisystemtypen

Teil 2

mount und fstab

Teil 3

CD-ROMs, Disketten, externe Massenspeicher

Teil 4

ext3 und reiserfs

Teil 5

Partitionierung der Festplatte

Teil 6

RAID mit Linux

Teil 7

LVM, Logical Volume Manager

Teil 8

DMA mit IDE-Festplatten

ext3-Dateisystem

ext3 ist zurzeit das am weitesten verbreitete Linux-Dateisystem. Es ist weitest gehend kompatibel zum ext2-Dateisystem, bietet aber darüber hinaus Journaling-Funktionen. Vorhandene ext2-Dateisysteme können in ext3-Dateisysteme umgewandelt werden. Umgekehrt können ext3-Dateisysteme auch als ext2-Dateisysteme verwendet werden, sofern umount ordentlich ausgeführt wurde.

ext2-und ext3-Dateisysteme werden beide mit mke2fs formatiert. Dieses Kommando kann alternativ auch in der Form mkfs.ext2 oder mkfs.ext3 ausgeführt werden. Entscheidend ist allerdings die Option -j, die dafür verantwortlich ist, dass im Dateisystem die Journaling-Datei eingerichtet wird. Das ist der eigentliche Unterschied zwischen ext2 und ext3.

Optionen von mke2fs

-b n bestimmt die Blockgröße (Default: 1024 Bytes). n muss eine Zweier-Potenz größergleich 1024 sein (also 1024, 2048, 4096). Wenn Linux auf einer DEC-Alpha-CPU ausgeführt wird, ist auch 8192 erlaubt. Generell gilt: Je größer die Blockgröße ist, desto größer ist die maximale Dateigröße, desto größer ist aber auch der Overhead beim Speichern kleiner Dateien.

-c führt vor dem Einrichten des Datenträgers einen Test durch, ob defekte Blöcke existieren.

-i n gibt an, nach jeweils wie vielen Bytes ein I-Node eingerichtet wird. I-Nodes sind interne Verwaltungseinheiten eines Dateisystems. In einem I-Node werden alle Verwaltungsinformationen einer Datei mit Ausnahme des Namens gespeichert, also etwa Zugriffsbits, Besitzer und Datum des letzten Zugriffs. Die Anzahl der I-Nodes wird beim Formatieren unveränderlich festgelegt.

Beispielsweise gibt es bei n=4096 pro MByte 1.048.576/4096=256 I-Nodes. Damit können pro MByte maximal 256 Dateien oder Verzeichnisse gespeichert werden, egal wie klein die Dateien sind.

Wenn Sie sehr viele sehr kleine Dateien speichern möchten, sollten Sie n kleiner wählen. Der Minimalwert beträgt 1024 (das entspricht 2048 Dateien pro MByte). Allerdings ist es nicht sinnvoll, den Wert kleiner als die Blockgröße zu wählen, da pro Block ohnedies nur eine Datei gespeichert werden kann. Wenn Sie dagegen nur sehr wenige sehr große Dateien speichern wollen, können Sie n auch größer wählen. Sie verringern damit den Verwaltungs-Overhead.

Weitere mke2fs-Optionen

-j bewirkt, dass beim Erzeugen des Dateisystems eine Journaling-Datei angelegt wird. Sie verwendet spezielle I-Nodes des Dateisystems und ist daher vollkommen unsichtbar. Die Journaling-Datei enthält nur Informationen über Dateien, die noch nicht vollständig auf der Festplatte gespeichert wurden. Sobald das Schreiben beendet ist, gilt der Eintrag als committed und kann durch neue Daten überschrieben werden. Aus diesem Grund braucht die Journaling-Datei nicht besonders groß zu sein.

-J ermöglicht die Übergabe zusätzlicher Parameter, etwa um die Größe der Journaling-Datei einzustellen oder um die Journaling-Datei in einem anderen Device einzurichten. Dadurch werden aber die Administration und die Wiederherstellung des Dateisystems nach einem Crash komplizierter. Die zur Auswahl stehenden Optionen werden in der Manual-Seite von mke2fs ausführlich beschrieben.

-m n gibt an, wie viel Prozent des Datenträgers für Daten von root reserviert werden sollen (Default: 5 Prozent). Dieser Reservespeicher ermöglicht es root selbst dann noch zu arbeiten, wenn das Dateisystem für alle anderen Benutzer bereits restlos voll ist. Es handelt sich also um eine Sicherheitsreserve.

Im folgenden Beispiel wird auf einem 64 MByte großen Memory Stick ein ext3-Dateisystem eingerichtet. mke2fs entscheidet sich selbstständig für eine Blockgröße von 1 kByte und für 256 I-Nodes pro MByte (das entspricht -i 4096):

root# mke2fs -j /dev/hda14
mke2fs 1.34 (25-Jul-2003)
Filesystem label=
OS type: Linux
Block size=1024 (log=0)
Fragment size=1024 (log=0)
16000 inodes, 63924 blocks
3196 blocks (5.00%) reserved for the super user
First data block=1
8 block groups
8192 blocks per group, 8192 fragments per group
2000 inodes per group
Superblock backups stored on blocks:
8193, 24577, 40961, 57345
Writing inode tables: done
Creating journal (4096 blocks): done
Writing superblocks and filesystem accounting
information: done
This filesystem will be automatically checked every
36 mounts or 180 days, whichever comes first. Use
tune2fs -c or -i to override.

Journaling-Modi

ext3 kennt drei verschiedene Verfahren, wie das Journaling durchgeführt wird:

data=ordered: Das ist der Default-Modus. Im Journal werden nur Metadaten gespeichert, also Informationen über Dateien, aber nicht die Inhalte der Dateien. 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.

data=writeback: Dieser Modus ähnelt dem ordered-Modus. Der einzige Unterschied besteht darin, dass das Journal und die Dateioperationen nicht immer vollständig synchron sind. ext3 wartet mit den committed-Einträgen im Journal nicht auf den Abschluss der Speicheroperation auf der Festplatte.

Dieser Modus ist etwas schneller als der ordered-Modus. Nach einem Crash ist die Integrität des Dateisystems ebenso wie beim ordered-Modus sichergestellt. Allerdings kann es vorkommen, dass Dateien alte Daten enthalten. Das Ergebnis ist somit dasselbe wie bei einem ext2-System, das nach einem Crash durch fsck repariert wird. Allerdings erfolgt die Korrektur bei ext3 ungleich schneller.

data=journal: Im Gegensatz zu den beiden anderen Modi werden jetzt im Journal auch die tatsächlichen Daten gespeichert. Dadurch müssen alle Änderungen zwei Mal gespeichert werden, zuerst in das Journal und dann in die betroffene Datei. Deswegen ist ext3 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 der Datei eingetragen worden sind.

mount und Journaling

Wenn Sie mount ohne besondere Optionen verwenden, gilt data=ordered. Wenn Sie ein anderes Journaling-Verfahren verwenden möchten, geben Sie den Modus als mount-Option mit -o an, beispielsweise so:

root# mount -t ext3 -o data=journal /dev/hda12 /test

Natürlich können Sie das Journaling-Verfahren auch in /etc/fstab angeben:

# in /etc/fstab
/dev/hda12 /test ext3 data=journal 1 0

Intern kümmert sich der in den Kernel integrierte Journal-Dämon kjournald um die regelmäßige Aktualisierung der Journaling-Datei. Dieser Prozess wird automatisch gestartet, sobald ein ext3-Dateisystem mit mount in den Verzeichnisbaum eingebunden wird. kjournald ist dafür verantwortlich, dass alle fünf Sekunden ein Festplattenzugriff erfolgt, selbst wenn der Rechner scheinbar keine Arbeit verrichtet.

Wenn Sie ein vorhandenes ext2-Dateisystem in ein ext3-Dateisystem umwandeln möchten, führen Sie einfach das unten angegebene Kommando aus. Sie müssen dazu nicht einmal umount ausführen.

root# tune2fs -j /dev/hda5

In man mount finden Sie zwar eine Menge Optionen für ext2 und ext3, in der Praxis werden diese mit der Ausnahme von data=... aber nur selten benötigt. Im Folgenden werden nur die wichtigsten Optionen kurz erwähnt:

acl aktiviert die ACL-Zugriffsverwaltung (siehe http://acl.bestbits.at/).

data=journal/ordered/writeback bestimmt den Journaling-Modus.

noload ignoriert die vorhandene Journaling-Datei beim mount-Kommando. Das kann zweckmäßig sein, wenn die Journaling-Datei defekt ist.

sb=n verwendet Block n als Superblock (statt per Default Block 1). Damit gelingt es in manchen Fällen, ein beschädigtes Dateisystem noch zu lesen. Per Default erstellt mke2fs alle 8192 Blöcke eine Kopie des Superblocks. Daher empfiehlt es sich, für n die Werte 8193, 16385 et cetera einzusetzen.

Administration des Dateisystems

In der Vergangenheit wurden ext2-Dateisysteme beim Rechnerstart regelmäßig auf Fehler überprüft, und zwar nach einer bestimmten Anzahl von mount-Vorgängen oder nach einer gewissen Zeit, je nachdem, welches Kriterium vorher erfüllt war.

Bei ext3-Dateisystemen ist eine regelmäßige Überprüfung nicht mehr so wichtig, weswegen die maximale mount-Anzahl und das Zeitintervall bei vielen Distributionen großzügig eingestellt oder ganz auf 0 gesetzt wird (keine Überprüfung). Zudem konfigurieren die meisten Distributionen fstab so, dass - wenn überhaupt - nur die Systempartition überprüft wird. (Das bestimmt die sechste Spalte in fstab; siehe dazu unseren Beitrag über mount und fstab)

Trotz der Journaling-Funktionen ist eine Überprüfung des Dateisystems hin und wieder sehr zu empfehlen (mindestens ein bis zwei Mal pro Jahr). Zum einen werden so eventuelle Hardware-Fehler der Festplatte erkannt; zum anderen kann es sein, dass der Dateisystemtreiber noch unerkannte Fehler enthält. Je früher daraus resultierende Fehler korrigiert werden, desto kleiner ist der potenzielle Schaden.

Eine manuelle Überprüfung können Sie einfach mit dem Kommando e2fsck durchführen. Die betreffende Partition darf während der Kontrolle allerdings nicht gerade verwendet werden, Sie müssen gegebenenfalls vorher umount ausführen.

root# e2fsck -f /dev/hda13
e2fsck 1.34 (25-Jul-2003)
Pass 1: Checking inodes, blocks, and sizes
Pass 2: Checking directory structure
Pass 3: Checking directory connectivity
Pass 4: Checking reference counts
Pass 5: Checking group summary information
(/dev/hda13): 152190/640000 files (1.0%
non-contiguous),
722668/1279167 blocks

Die Systempartition können Sie im laufenden Betrieb allerdings nicht überprüfen, weil Sie das Dateisystem nicht mit umount abmelden können. Stattdessen führen Sie einfach das Kommando touch /forcefsck aus und starten den Rechner neu. Diese Datei wird auch erzeugt, wenn Sie shutdown mit der zusätzlichen Option -F ausführen.

Wenn die Datei /forcefsck existiert, wird bei fast allen Distributionen beim nächsten Start automatisch eine Überprüfung des Dateisystems durchgeführt. Sollte das nicht funktionieren, fahren Sie den Rechner mit einem Rescue-System oder mit einer Live-CD (Knoppix) hoch und führen e2fsck von dort aus.

Verwaltungsoptionen

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.

Die aktuellen Intervalle für die automatische Überprüfung des Dateisystems können Sie mit tune2fs feststellen und verändern. Dabei geben Sie mit -c die maximale mount-Anzahl und mit -i das Zeitintervall in Tagen an:

root# tune2fs -l /dev/hda12
...
Mount count: 57
Maximum mount count: 500
Last checked: Thu Dec 4 18:10:14 2003
Check interval: 5184000 (2 months)
...
root# tune2fs -c 100 -i 90 /dev/hda12
Setting maximal mount count to 100
Setting interval between check 7776000 seconds

Volumename

Mit e2label können Sie den internen Namen eines ext3-Dateisystems (Filesystemvolumename) ermitteln beziehungsweise einstellen:

root# e2label /dev/sda1 mylabel

Diesen Namen können Sie in der ersten Spalte von /etc/fstab statt des Device-Namens angeben.

Fragmentierung

Unter "Fragmentierung" versteht man den Zustand, dass einzelne Dateien nicht in aneinander liegenden 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.

Bei ext3 besteht normalerweise keine Notwendigkeit zur Defragmentierung, weil das Dateisystem eine Fragmentierung weit gehend vermeidet. Sie sollten allerdings darauf achten, dass das Dateisystem nie zu mehr als zirka 90 bis 95 Prozent mit Daten gefüllt ist.

Größe eines ext3-Dateisystems ändern

Mit resize2fs können Sie ein ext3-Dateisystem vergrößern oder verkleinern. Beachten Sie aber, dass Sie vorher auch die Größe der Partition ändern müssen.

Im folgenden Beispiel wird zuerst die 1,5 GByte große Partition /dev/hdb11 gelöscht und mit 2 GByte neu angelegt. Das ist nur deswegen ohne Probleme möglich, weil es sich bei dieser Partition um die letzte Partition der Festplatte handelt und auf der Festplatte noch Platz frei ist. (Vorher muss umount ausgeführt werden.)

root# fdisk /dev/hdb
Command (m for help): p
Disk /dev/hdb: 255 heads, 63 sectors, 2055 cylinders
Units = cylinders of 16065 * 512 bytes

Device Boot Start End Blocks Id System
...
/dev/hdb11 1334 1525 1542208+ 83 Linux

Command (m for help): d
Partition number (1-11): 11

Command (m for help): n

Command action
l logical (5 or over)
p primary partition (1-4)

l
First cylinder (1334-2055, default 1334): <Return>
Using default value 1334
Last cylinder or +sizeM (1334-2055, default 2055):
+2000M

Command (m for help): w
The partition table has been altered!
Re-read table failed with error 16: Device or
resource busy.
Reboot your system to ensure the partition table
is updated.

Nach einem Neustart ist es kein Problem, das Dateisystem für die Partition /dev/hdb11 zu vergrößern. Beachten Sie, dass resize2fs voraussetzt, dass Sie vorher das Dateisystem mit e2fsck -f überprüfen.

root# e2fsck -f /dev/hdb11
root# resize2fs /dev/hdb11
The filesystem on /dev/hdb11 is now 512064
blocks long.

Für Kernel 2.6 gibt es einen Patch, der es ermöglicht, die Größe eines ext3-Dateisystems im laufenden Betrieb ohne umount zu verändern. Es ist noch unklar, ob dieser Patch in den Standard-Kernel einfließt und damit allgemein verfügbar wird.

reiserfs-Dateisystem

Das reiserfs-Dateisystem war das erste Dateisystem mit Journaling-Funktion, das bereits mit Version 2.4.1 in den offiziellen Linux-Kernel aufgenommen wurde. Intern entspricht das Journaling-System von reiserfs dem ext3-Modus data=writeback. In reiserfs-Dateisystemen können mit dem 2.4.n-Standard-Kernel keine Quota-Funktionen genutzt werden. Es gibt aber entsprechende Kernel-Patches, die diese Funktion hinzufügen.

Unzählige technische Informationen, Benchmark-Ergebnisse und FAQs zu reiserfs finden Sie unter http://namesys.com/

Der folgende Abschnitt beschreibt reiserfs 3.n. Auf der namesys.com-Homepage ist allerdings bereits Version 4 freigegeben. Die größte Neuerung besteht darin, dass das Dateisystem dank eines Modulkonzepts durch Plug-ins erweiterbar sein wird. Damit lassen sich auf einfache Weise Zusatzfunktionen integrieren.

Um ein reiserfs-Dateisystem in einer Partition einzurichten, verwenden Sie mkreiserfs. Das Kommando ist einfach zu bedienen, weil im Regelfall keine einzige Option angegeben werden muss. Zur Partitionierung verwenden Sie wie üblich fdisk oder ein anderes Partitionierungswerkzeug. reiserfs-Partitionen sollten dabei dieselbe Dateisystem-ID wie ext3-Partitionen haben, also 83.

root# mkreiserfs /dev/hdb11
mkreiserfs 3.6.9 (2003 www.namesys.com)
Format 3.6 with standard journal
Count of blocks on the device: 1222940
Number of blocks consumed by mkreiserfs formatting
process: 8249
Blocksize: 4096
Hash function used to sort names: "r5"
Journal Size 8193 blocks (first block 18)
Journal Max transaction length 1024
inode generation number: 0
UUID: cd525fb5-0951-42d9-8720-44cd613029f4
ATTENTION: YOU SHOULD REBOOT AFTER FDISK!

ALL DATA WILL BE LOST ON '/dev/hdb111'!
Continue (y/n): y
Initializing journal -0%..20%..40%..60%..80%..100%
Syncing..ok
ReiserFS is successfully created on /dev/sda1.

mount-Optionen für reiserfs

Jetzt müssen Sie nur noch ein mount-Kommando ausführen, und schon können Sie das Dateisystem nutzen:

root# mount -t reiserfs /dev/hdb11 /test

Die zahlreichen in man mount dokumentierten Optionen für reiserfs kommen eher selten zum Einsatz. Am wichtigsten sind die folgenden Optionen:

acl aktiviert die erweiterten Funktionen zur Zugriffsverwaltung (weitere Details siehe http://acl.bestbits.at/).

nolog deaktiviert die Journaling-Funktionen.

notail verhindert, dass reiserfs mehrere kleine Dateien in einem Datenblock speichert. Die Option gilt nur für neue Dateien. Sie muss verwendet werden, damit LILO oder GRUB die Boot-Dateien aus einem reiserfs-Dateisystem lesen können.

user_xattr ermöglicht die Speicherung zusätzlicher Dateiattribute (siehe man attr).

Administration des reiserfs-Dateisystems

Mit reiserfsck können Sie die Integrität eines reiserfs-Systems überprüfen. Per Default gibt das Kommando nur einen Statusreport aus, verändert aber das Dateisystem nicht. Wenn Sie auch Reparaturen ausführen möchten, müssen Sie die Option --fix-fixable angeben. Die man-Seite des Kommandos zählt noch eine Reihe weiterer Optionen auf, mit denen das Verhalten von reiserfsck variiert werden kann.

Mit reiserfstune -l können Sie den Partitionsnamen (Filesystemvolumename) einstellen. Analog können Sie mit -u die ID-Nummer (UUID) verändern.

Mit dem Kommando resizereiserfs können Sie die Größe eines reiserfs-Dateisystems ändern. Vorher müssen Sie allerdings die Größe der Partition ändern. Im Beispiel unten wurde ein fast leeres Dateisystem von 5 auf 6 GByte vergrößert.

root# resize_reiserfs /dev/hdb11
resize_reiserfs 3.6.9 (2003 www.namesys.com)
ReiserFS report:
blocksize 4096
block count 1465923 (1222940)
free blocks 1457667 (1214691)
bitmap block count 45 (38)
Syncing..done
resize_reiserfs: Resizing finished successfully.

Mit reiserfstune können Sie den Ort der Journaling-Datei verändern, beispielsweise wenn die Journaling-Datei in einer eigenen Partition gespeichert werden soll. Außerdem können diverse Journaling-Parameter verändert werden. Derartige Veränderungen sollten Sie aber nur vornehmen, wenn es dafür zwingende Gründe gibt.

Es gibt keine Werkzeuge, die die Umwandlung eines Dateisystemtyps ermöglichen, zum Beispiel von ext3 nach reiserfs. Die einzige Möglichkeit besteht darin, das gewünschte Dateisystem in einer neuen Partition anzulegen und dann alle Dateien zu kopieren.

Ausblick

Nachdem wir in diesem Teil die wichtigsten Details von ext3 und reiserfs vorgestellt haben, geht es in Teil 4 um das Erzeugen und Verändern von Partitionen mit fdisk, parted und QTparted.

Diese Artikelserie basiert auf dem Kapitel 25 des Standardwerks "Linux - Installation, Konfiguration Anwendung" von Michael Kofler aus dem Verlag Addison-Wesley. Sie können dieses über 1200 Seiten starke Buch auch in unserem Buchshop versandkostenfrei bestellen oder als eBook herunterladen. (ala)

Serie: Administration des Linux-Dateisystems

Teil 1

Dateisystemtypen

Teil 2

mount und fstab

Teil 3

CD-ROMs, Disketten, externe Massenspeicher

Teil 4

ext3 und reiserfs

Teil 5

Partitionierung der Festplatte

Teil 6

RAID mit Linux

Teil 7

LVM, Logical Volume Manager

Teil 8

DMA mit IDE-Festplatten