Das Linux-Dateisystem Ext4

Ext3, das Standarddateisystem für Linux, ist in die Jahre gekommen. Moderne Massenspeicher kommen seinen Limits immer näher, und die blockbasierte Datenverwaltung wird aktuellen Dateigrößen nicht mehr gerecht.

In Pocket speichern vorlesen Druckansicht 17 Kommentare lesen
Lesezeit: 20 Min.
Von
  • Dr. Oliver Diedrich
Inhaltsverzeichnis

Erschienen in c't 10/09, S. 180

Angesichts rapide steigender Datenmengen wird immer deutlicher, dass Ext3, das derzeitige Linux-Standarddateisystem, an seine Grenzen stößt. Eine maximale Dateisystem- und damit Volume-Größe von 16 TByte kann in großen RAID-Verbunden schon jetzt zwicken, aber mehr ist mit den 32-bittigen Blocknummern von Ext3 bei Datenblöcken von 4 KByte Größe eben nicht drin. Eine größere Renovierung steht also an.

Die Entwicklung von Ext4 begann 2006 mit zwei Änderungen für das Ext3-Dateisystem, die die Blocknummern auf 48 Bit erweiterten und die bisherige indirekte Blockadressierung, bei der die zu einer Datei gehörenden Datenblöcke in einer langen Liste einzelner Blocknummern gespeichert werden, durch Extents – Bereiche von Datenblöcken – ersetzte. Da sich dabei die auf der Platte gespeicherten Datenstrukturen änderten, entschieden sich die Programmierer, diese Patches nicht in das alte Ext3 einzupflegen, sondern mit Ext4 eine neue Version des Dateisystems auf Basis des Ext3-Codes zu entwickeln.

Herausgekommen ist nach drei Jahren mit Ext4 eine deutliche Weiterentwicklung von Ext3, die das Limit für Volumes auf 1024 PByte und damit auf Jahre in den sicheren Bereich verschiebt. Gleichzeitig machen die Extents – in anderen Dateisystemen wie XFS längst implementiert – die Verwaltung großer Dateien effizienter. Schließlich gibt es eine Reihe interner Änderungen, die die Performance von Ext4 gegenüber Ext3 verbessern sollen.

Die Kernel-Entwickler haben den Ext4-Code in den Kernel 2.6.19 aufgenommen, um ihn dort reifen zu lassen. Bis zur Version 2.6.27 war Ext4 als experimentell markiert, seit Linux 2.6.28 gilt das neue Dateisystem als stabil – was keineswegs ausschließt, dass der Code nicht noch Bugs oder Überraschungen enthalten kann. Das aktuelle Ubuntu 9.04 lässt sich bereits auf Ext4 installieren, das kommende Fedora 11 wird Ext4 bereits als Standarddateisystem verwenden.

Ext4 arbeitet mit 48-bittigen Blocknummern bei einer Standard-Blockgröße von nach wie vor 4 KByte. Das erlaubt eine Dateisystemgröße von bis zu 248 Blöcken à 4 KByte, also einem Exabyte (1024 PByte) an Stelle der 16 TByte von Ext3. Warum nicht gleich 64-bittige Blocknummern? Die Entwickler nennen in einem Artikel einen ganz pragmatischen Grund: 1 EByte wird auf lange Zeit ausreichen – und schon bei einem Dateisystem dieser Größe würde ein kompletter e2fsck-Lauf (bei der heute verfügbaren Hardware) über 100 Jahre dauern. Bevor man auch nur in die Nähe dieser Grenze kommt, müsse man daher ganz andere Probleme angehen, die viel größere Änderungen im Dateisystem erfordern würden als 64-bittige Blocknummern. Zudem passen die 48-bittigen Blocknummern besser in die alten Ext3-Datenstrukturen.

Laut Ext4-Chefentwickler Ted Ts’o sollte die Erweiterung der Blocknummern auf 64 Bit keine allzu große Sache sein – möglicherweise wird sie bereits im Zuge der Weiterentwicklung von Ext4 angegangen. Einige Strukturen wie der Superblock, die Blockgruppen-Deskriptoren und der zusammen mit Ext4 entwickelte neue Journaling-Layer JBD2 sind bereits auf 64-bittige Blocknummern ausgelegt.

Der in Ext3 32-bittige i_blocks-Wert im Inode, der die Anzahl der von einer Datei belegten Blöcke enthält, wurde gleich in zweierlei Hinsicht an die größeren Blocknummern angepasst: Zum einen zählt er nicht mehr, wie noch in Ext3, in Festplattensektoren von 512 Byte Größe, sondern in der Blockgröße des Dateisystems, also in der Regel 4 KByte. Ein Flag im Inode gibt an, wie der Wert zu interpretieren ist; das ist bei einem Upgrade von Ext3 nach Ext4 wichtig, da dort auch noch alte Ext3-Inodes vorkommen können, die Sektoren zählen.

Zum anderen nutzt man zwei bislang nicht verwendete Bytes im Inode, um die oberen 16 Bits der 48-bittigen Blocknummer zu speichern. Das Dateisystem-Feature huge_file zeigt an, dass das Dateisystem mit 48-bittigen Blocknummern arbeitet und die Inodes in Dateisystemblöcken zählen können. Einzelne Dateien können derzeit allerdings trotz der 48-bittigen Blocknummern nicht größer als 16 TByte werden, da sich mit der aktuellen Struktur der Extents keine größeren Files verwalten lassen – dazu gleich mehr.

Im Vergleich mit den anderen Dateisystemen im Kernel konkurriert Ext4 vor allem mit XFS – IBMs JFS hat bis heute nicht allzu viele Anhänger in der Linux-Welt gefunden, und Reiser 4 ist nach wie vor nicht in den Kernel integriert. Als Vorteile gegenüber XFS führen die Ext4-Entwickler die schlankere Code-Basis an (rund 30.000 Zeilen in 900 KByte versus 100.000 Zeilen in 3,2 MByte), die Möglichkeit, ein Ext3-Dateisystem nach Ext4 zu konvertieren, und der große Anteil Code, den man von dem ausgereiften und gründlich getesteten Ext3 übernommen hat.

Linux-Dateisysteme
Dateisystem maximale Dateigröße maximale Dateisystemgröße
Ext4 16 TByte 1024 PByte
Ext3 2 TByte 16 TByte
JFS 4 PByte 32 PByte
ReiserFS 3 8 TByte 16 TByte
XFS 8192 PByte 8192 PByte
ZFS (Solaris) 16.384 PByte 16.384 PByte