extended filesystem

aus Wikipedia, der freien Enzyklopädie

Als

extended filesystem

werden eine Reihe von Dateisystemen bezeichnet, die für das Linux-Betriebssystem entwickelt wurden. Da sie im Quelltext des Linux-Kernels integriert sind, stehen sie, wie dieser, unter der GPLv2. Als quelloffene Software wurden die Dateisysteme auf zahlreiche weitere Betriebssysteme portiert. Das

extended

-Dateisystem war das erste, das auf das zu diesem Zeitpunkt in den Linux-Kernel integrierte virtuelle Dateisystem (VFS) implementiert wurde.[1] Die erste Version wurde mit ext abgekürzt, alle darauffolgenden Versionen haben die fortlaufende Nummer hintan gestellt: ext2, ext3 und ext4. Gebräuchlich ist auch die Abkürzung für

file system

am Ende, also z. B. ext2fs[2] oder EXT4-fs.[3]

Zum Erstellen und Warten der Dateisysteme werden die e2fsprogs benötigt.

Versionen

Bei der Entwicklung wurde großes Augenmerk auf erweiterbare Strukturen gelegt.[1]

ext

Die erste Version des

extended filesystem

, kurz ext, war ab Kernel-Version 0.96c vom April 1992 Teil von Linux. Es wurde als Erweiterung für das Minix-Dateisystem entwickelt, das bis dahin verwendet worden war. Wie dieses basiert auch ext auf Inode-Tabellen, erweitert jedoch die maximale Länge von Dateinamen von 14 auf 255 Zeichen sowie die maximale Dateigröße auf 2 GiB.[1] Das erste

extended

-Dateisystem wurde komplett durch ext2 ersetzt und mit Version 2.1.21 aus dem Linux-Kernel entfernt.[4]

ext2

Vergleich der in Linux 1993 verfügbaren Dateisysteme und deren Limits[5]
Dateisystem max. Größe (210) max. Länge von Dateinamen
pro Datei pro
Volume
Minix 32 MiB 32 MiB 30 Zeichen
ext 2 GiB 2 GiB 255 Zeichen
Xia 32 MiB 2 GiB 248 Zeichen
ext2 2 GiB 4 TiB 255 Zeichen

Bereits im Januar 1993 gab es die erste Alpha-Version des

second extended filesystem

, kurz ext2, das das bestehende

extended

-Dateisystem um zusätzliche Fähigkeiten erweiterte. Als Vorbild diente das

(UFS),[5] das z. B. auch von vielen BSD-Derivaten genutzt (und verbessert) wurde. So wurde die maximale Größe des Dateisystems auf 2 TiB erhöht (was später abermals erhöht wurde) und auch die Zeitstempel wurden um

erweitert.

Es gab zur gleichen Zeit, Anfang 1993, mit Xia bzw. xiafs (benannt nach dessen Entwickler Frank Xia)[5] einen weiteren Ansatz, der bereits stabiler war als ext2, jedoch nicht so leicht erweiterbar. Das Xia-Dateisystem basierte direkt auf dem Minix-Dateisystem und war neben ext2 in den Kernel integriert worden. Boten anfangs beide Dateisysteme dieselben Fähigkeiten, so wurde ext2 durch die aktive Weiterentwicklung nicht nur stabiler (und damit xiafs ebenbürtig), auch konnten aufgrund des erweiterbaren Designs neue Funktionen und Fähigkeiten relativ einfach hinzugefügt werden. 2002 war ext2 das erste Linux-Dateisystem, auf dem die POSIX ACLs implementiert wurden.[6]

Die Limits wurden später erweitert und hängen auch mit Beschränkungen im Kernel selbst zusammen, denn vor Linux-Kernel 2.4 wurden auf keinem Dateisystem Dateien mit über 2 GiB Größe unterstützt.[7] Die maximale Dateisystemgröße (

Volume

-Größe) von ext2 hängt zusätzlich von der verwendeten Blockgröße ab – bei 8-KB-Blöcken darf das Dateisystem max. 32 TiB groß sein.[8] Das

second extended filesystem

war lange Zeit das Standard-Dateisystem von Linux.

ext3

Mit dem

third extended filesystem

oder ext3 wurde 2001 Journaling eingeführt. Der Treiber für ext3 wurde mit Kernel 4.3 entfernt, da ext4 alle nötigen Funktionen mitbringt.

ext4

Das

fourth extended filesystem

oder ext4 wird seit 2008 entwickelt und ist das aktuelle Dateisystem der Familie. Es wurde als Modernisierung für ext2/3 in Linux-Kernel 2.6.19 aufgenommen und gilt seit Version 2.6.28 als stabil.[9]

Kompatibilität

Der Dateisystemtreiber für ext4 kann seit Kernel-Version 2.6.27 auch ext2- und ext3-Dateisysteme einhängen, ohne die Strukturen zu verändern.[10] Dabei bleibt das Dateisystem auf dem

unverändert im jeweiligen Format, sodass es auch von älteren Dateisystemtreibern für ext2 oder ext3 weiterhin uneingeschränkt verwendet werden kann. Da die Dateisysteme aufbauend gestaltet sind, kann immer ein Upgrade eines bestehenden

extended

-Dateisystems durchgeführt werden. Um beispielsweise aus einem ext2- ein ext3-Dateisystem zu machen, muss lediglich ein Journal hinzugefügt werden:

tune2fs -j /dev/DEV

Dabei werden jedoch neuere Funktionen nur teilweise umgesetzt. So bleibt z. B. in jedem Fall das Größenlimit des

Volumes

bei der Erstellung erhalten, auch wenn das Dateisystem in eine neuere Version mit eigentlich erweiterten Limits konvertiert wurde.

Umgekehrt kann durch Entfernen des Journals aus einem ext3- wieder ein ext2-Dateisystem gemacht werden, wenn es ursprünglich als ext2-Dateisystem erstellt wurde bzw. wenn die weiteren aktivierten Funktionen und Strukturen dies gestatten:

tune2fs -O ^has_journal /dev/DEV

Der tune2fs-Parameter -O gibt an, welche Fähigkeit hinzugefügt werden soll; ein Zirkumflex, ^, bedeutet, dass die Fähigkeit entfernt bzw. ausgeschaltet werden soll.

Um ein bestehendes

extended

-Dateisystem zu einem ext4-Dateisystem zu machen, müssen dessen Grundfunktionen aktiviert werden:

tune2fs -O extent,uninit_bg,dir_index,has_journal /dev/DEV

Durch die Aktivierung von

Extents

erhalten neu erstellte Dateien immer diese neue Fähigkeit, sodass ein Rückkonvertieren anschließend nicht mehr möglich ist. Bestehende Dateien nutzen hingegen keine

Extents

, was jedoch mit einem Durchlauf von e2fsck nachgeholt werden kann.[10]

Da das Dateisystem ständig weiterentwickelt wird und neue Fähigkeiten bzw. Funktionen hinzugefügt werden, können neuere Dateisysteme teilweise nicht von älteren Treibern verwendet werden. Der Linux-Kernel gibt dann eine Fehlermeldung aus, mit dem Flag der inkompatiblen Funktion in Klammern:

EXT4-fs (DEV): couldn't mount RDWR because of unsupported optional features (400)

In diesem Beispiel bedeutet die Kernel-Meldung (die mittels dmesg angezeigt werden kann), dass das Dateisystem nicht beschreibbar ist, (RDWR steht für

read-write

, also Lesen und Schreiben), wegen der Funktion mit der Kennung 0x400. In der Dokumentation ist herauszufinden, dass dies die 2012 eingeführte Funktion metadata_csum ist.[11] Wenn man diese nun abschaltet, kann man das Dateisystem auch auf älteren Kernel-Versionen einsetzen. Diese Vorgehensweise funktioniert jedoch nicht bei allen Funktionen.

tune2fs -O ^metadata_csum /dev/DEV

Gegengleich kann man damit auf älteren Dateisystemen neuere Funktionen aktivieren. Dies geschieht aus gutem Grund nicht automatisch, denn nur so bleibt die Kompatibilität gewahrt. So wird z. B. eine ext4-Partition auf einer externen Festplatte, die auf einem sehr modernen System eingehängt und beschrieben wird, auch weiterhin mit dem älteren System funktionieren, auf dem sie ursprünglich formatiert wurde. Das Programm dumpe2fs gibt Aufschluss darüber, welche Funktionen aktuell auf einem

Volume

mit

extended

-Dateisystem aktiviert sind:

dumpe2fs -h /dev/DEV

Jahr-2038-Problem

Allen Versionen bis inklusive ext4 ist gemein, dass sie grundsätzlich vom Jahr-2038-Problem betroffen sind bzw. im Fall von ext4 betroffen waren, da die Speicherung der Zeitstempel 2007[12] mit Kernel 2.6.23 von 32 auf 34 Bits erweitert wurde.[13] Dabei war allerdings ein Fehler bei der Konvertierung der ursprünglichen 32-Bit-Unixzeit in 64-Bit (denn die Verarbeitung von 34 Bits erfolgt als 64-Bit-Wert) passiert, der zwischen 2014 und 2016[14][15] und schließlich mit Linux-Kernel 4.3.6 vom 19. Februar 2016[16] korrigiert wurde.

Voraussetzung ist eine Inode-Größe von mindestens 256 Bits (der ursprüngliche Standard bei ext2 waren 128 Bits) und angepasste e2fsprogs, die ab Version 1.40 extra_isize unterstützen.[17] Mit Version 1.43.x (2016) und neuer kann e2fsck die fehlerhaften 34-Bit-Zeitstempel auch korrigieren.

Wird ein ext2- oder ext3-Dateisystem um die Extra-Inode, mit oder ohne die um 2 Bits vergrößerten Zeitstempel, erweitert, lässt es sich fortan allerdings nur noch als ext4-Dateisystem einhängen:

# mount -t ext2 /dev/sda1 /boot

# mount | grep "sda1"
/dev/sda1 on /boot type ext2 (rw,errors=remount-ro,user_xattr,acl)

# dmesg -t | tail -n1
ext2 filesystem being mounted at /boot supports timestamps until 2038 (0x7fffffff)

# umount /dev/sda1

# dumpe2fs -h /dev/sda1 | grep "features"
dumpe2fs 1.45.5 (07-Jan-2020)
Filesystem features:      ext_attr resize_inode dir_index filetype sparse_super large_file

# tune2fs -O extra_isize /dev/sda1

# dumpe2fs -h /dev/sda1 | grep "features"
dumpe2fs 1.45.5 (07-Jan-2020)
Filesystem features:      ext_attr resize_inode dir_index filetype sparse_super large_file extra_isize

# mount -t ext2 /dev/sda1 /boot
mount: /boot: Falscher Dateisystemtyp, ungültige Optionen, der Superblock von /dev/sda1 ist beschädigt, fehlende Kodierungsseite oder ein anderer Fehler.

# dmesg -t | tail -n1
EXT2-fs (sda1): error: couldn't mount RDWR because of unsupported optional features (40)

# mount -t ext4 /dev/sda1 /boot

# dmesg -t | tail -n1
EXT4-fs (sda1): mounted filesystem without journal. Opts: errors=remount-ro

Einzelnachweise

  1. a b c Rémy Card, Theodore Ts'o, Stephen Tweedie: Design and Implementation of the Second Extended Filesystem. Abgerufen am 14. Mai 2020 (englisch).
  2. https://www.freebsd.org/doc/handbook/filesystems-linux.html
  3. EXT4-fs error: bad header/extent
  4. https://linux.die.net/man/5/filesystems
  5. a b c Udo Seidel: The ext filesystem – a four-generation retrospective. In: Ausgabe 156/2013. Linux Magaxine, abgerufen am 17. Mai 2020 (englisch).
  6. Ext2. In: Glossar. DiskInternals, abgerufen am 14. Mai 2020 (englisch): „Features such as POSIX ACLs and extended attributes were generally implemented first on ext2 because it was relatively simple to extend and its internals were well-understood.“
  7. Andreas Jaeger: Large File Support in Linux. 15. Februar 2005, abgerufen am 17. Mai 2020 (englisch).
  8. The Second Extended Filesystem. In: The Linux Kernel documentation. Abgerufen am 17. Mai 2020 (englisch).
  9. Thorsten Leemhuis: Kernel-Log: Dateisystem Ext4 verlässt Entwicklungsphase - ein Zwischenstopp auf dem Weg zu btrfs. In: Heise online. 15. Oktober 2008. Abgerufen am 15. Mai 2020.
  10. a b https://ext4.wiki.kernel.org/index.php/UpgradeToExt4
  11. https://ext4.wiki.kernel.org/index.php/Ext4_Disk_Layout#The_Super_Block
  12. ext4: Add nanosecond timestamps. 18. Juli 2007, abgerufen am 4. Juni 2020 (englisch).
  13. INODE(7) – inode - file inode information. (Manpage) In: Linux Programmer’s Manual. 9. Mai 2019, abgerufen am 4. Juni 2020 (englisch): „Nanosecond timestamps are supported on XFS, JFS, Btrfs, and ext4 (since Linux 2.6.23). Nanosecond timestamps are not supported in ext2, ext3, and Reiserfs.“
  14. Bug 23732 – ext4 timestamp range contains 68-year gaps. (Fehlerbericht) In: Kernel.org Bugzilla. 20. März 2016, abgerufen am 4. Juni 2020 (englisch).
  15. Theodore Ts’o: Re: [PATCH] fs: ext4: Sign-extend tv_sec after ORing in epoch bits. (Mailingliste) In: LKML. 31. März 2014, abgerufen am 4. Juni 2020 (englisch).
  16. Linux 4.3.6. (Changelog) In: Kernel.org. 19. Februar 2016, abgerufen am 4. Juni 2020 (englisch): „ext4: Fix handling of extended tv_sec“
  17. E2fsprogs Release Notes. Abgerufen am 4. Juni 2020 (englisch): „Add on-disk format definitions for the following new features: … EXT4_FEATURE_RO_COMPAT_EXTRA_ISIZE“