# XFS (Dateisystem)

XFS ist ein 64-Bit-Journaling-Dateisystem, das als sehr schnell und ausgereift gilt und dem eine gute Codequalität nachgesagt wird. Es wurde ab Oktober 1993 vom Unternehmen Silicon Graphics (SGI) für sein UNIX-System-V-basiertes Betriebssystem IRIX entwickelt und Ende 1994 veröffentlicht. Seit dem 1. Mai 2001 ist es quelloffen auch für Linux ab Version 2.4 verfügbar und seit Version 2.6 offizieller Bestandteil davon. XFS zeichnet sich durch sein flexibles On-Disk-Format aus, das es ermöglicht, den Funktionsumfang stetig zu erweitern.

## Geschichte von XFS

Das ab 1993 bei SGI entwickelte XFS hat als eines der längstgedienten Journaling-Dateisysteme für Unix eine gereifte, weitgehend fehlerfreie Codebasis. Es wurde erstmals im Jahr 1994 auf IRIX vorgestellt, wo es ab IRIX Version 5.3 bzw. 6 das bis dahin genutzte Extent File System (EFS) ablöste. 1999 begann SGI das Dateisystem auf Linux 2.3.40 zu portieren. Im Jahr 2000 wurde das Dateisystem schließlich unter der GPL lizenziert und für Linux veröffentlicht, wo es 2001 auch in den offiziellen Quelltext des Linux-Kernels (damals Version 2.5 bzw. 2.6) aufgenommen wurde. Fast alle Linux-Distributionen beinhalten per Voreinstellung Unterstützung für XFS, meist auch als Dateisystem für die root-Partition.
Aus dieser Geschichte lassen sich drei Generationen von XFS ableiten:
* Das ursprüngliche SGI XFS für IRIX
* Das auf Linux portierte XFS bis On-Disk-Format v4
* XFS für Linux ab der Einführung des neuen On-Disk-Metadatenformats v5
Ein wesentlicher Schritt auf dem Weg von Format v4 zu v5, der zahlreiche neue Fähigkeiten ermöglicht, ist die Einführung von Reverse Mapping. Es wurde 2016 mit Linux 4.8 eingeführt.

### Harter Bruch von XFS v4 auf v5

XFS v5 wurde im Dezember 2020 mit der Linux-Kernelversion 5.10 eingeführt. Mit Version 5 („v5“) ist das Jahr-2038-Problem gelöst, es wurden Prüfsummen für die Metadaten eingeführt und die Prüffunktion für die Metadaten generell verbessert. Da ein bestehendes XFS-v4-Dateisystem nicht direkt in Version 5 konvertiert (überführt) werden kann, muss ein bestehendes Volume neu mit XFS v5 formatiert werden – in der Praxis muss also zuerst eine Datensicherung der bestehenden Dateien angelegt und danach auf dem neu formatierten XFS-Volume wiederhergestellt werden. Die volle Unterstützung des nunmehr als veraltet markierten XFS v4 ist noch bis September 2025 garantiert und soll im September 2030 aus dem Linux-Kernel entfernt werden.
Seit Red Hat Enterprise Linux (RHEL) 7 ist XFS das Standarddateisystem dieser Distribution. Das steht auch damit in Zusammenhang, dass Red Hat nach der Auflösung von SGI einen wesentlichen Teil der Entwicklungsarbeit an XFS übernommen hat.
Das Gentoo Handbook, das offizielle Installationshandbuch von Gentoo Linux, empfiehlt seit dem 28. Juni 2023 XFS als „Allzweck-Dateisystem für alle Plattformen“ und ersetzt damit das zuvor empfohlene ext4.

### Offizielle Spezifikation

2006 veröffentlichte SGI unter dem Titel XFS Filesystem Structure eine offizielle Spezifikation von XFS. Der wurde nachträglich die Versionsnummer 0.1 gegeben. Am 1. April 2009 meldete SGI Konkurs an und am 3. Juli 2009 wurde von Ryan Lerch eine weitere Version der Spezifikation veröffentlicht, die die Versionsnummer 1.0 trägt und mit Publican Conversion (»Bekehrung des Zöllners«, vgl. Evangelium nach Lukas 18:9-13) beschrieben wurde. Sie steht nunmehr unter der Creative Commons Lizenz BY-SA 3.0 US. Es folgten die Versionen 1.1 (Eric Sandeen, März 2010: Community Release) und 1.99 (Dave Chinner, Februar 2014: AsciiDoc Conversion). Danach wurde die Dokumentation von Darrick Wong übernommen, der im Oktober 2015 einen Sprung auf Version 3 vornahm und das Nummerierungsschema änderte. Jede weitere Version der Spezifikation wird mit der Kreiszahl Pi versehen, der eine zusätzliche Nachkommastelle hinzugefügt wird. Die Version der Spezifikation vom August 2024 trägt etwa die Nummer 3.141592653.

## Allgemeine Werte und Eigenschaften

* maximale Dateigröße 8 Exbibyte
* maximale Dateisystemgröße 16 Exbibyte
* maximale Dateinamenlänge 255 Byte
* Journal ermöglicht konsistente Datenhaltung
* geeignet für große und kleine Dateien sowie für umfangreiche Verzeichnisse
* unterstützt Blockgrößen von 512 Byte bis 64 Kibibyte, jedoch maximal die Größe der Speicherseiten des Kernels
* Datensicherung und Größenänderung im laufenden Betrieb (ohne Aushängen des Dateisystems)
* GRIO = Guaranteed IO Bandwidth (Garantierte Schreib- und Leseraten), zum Beispiel für Video Streaming Server
* Unterstützung für Hierarchische Speichersysteme (HSM)
* Unterstützung für Volume Manager
* unterstützt Zugriffskontrolllisten (Access Control Lists)
* unterstützt Disk Quotas
* für die Behandlung von Sparse-Dateien geeignet
* Deduplizierung mittels „Shared Extents“ und Copy-On-Write (CoW) (experimentell, seit Linux 4.9)
XFS bietet Zugriffskontrolllisten und ab der Version 1.0 unterstützt XFS auch Quotas sowohl für den einzelnen Benutzer als auch für Gruppen. Für den gleichzeitigen und konfliktfreien Zugriff auf XFS gibt es die proprietäre Lösung CXFS (Cluster XFS).

## Verwendung

Das XFS-Dateisystem ist beispielsweise in NAS-Geräten und auch in Fernsehgeräten mit USB-Recording-Funktion anzutreffen. Von Windows und macOS wird XFS jedoch nicht nativ unterstützt, unter Linux ist auf manchen Distributionen sogar das empfohlene Dateisystem.

## Besonderheiten von XFS
### Verzeichnisstruktur

Um schnell auf spezielle Dateien zugreifen zu können, werden bei XFS Verzeichnisinhalte in einem B+-Baum abgespeichert. Dies erhöht in geringem Umfang zwar die Latenzzeit bei der Ausgabe eines kompletten Verzeichnisinhaltes, verringert aber die Zugriffszeit auf einzelne Dateien bei Verzeichnissen mit vielen Dateieinträgen.

### Maximale Dateigröße

XFS zeichnet sich durch eine vollständige 64-Bit-Konzeption aus. Die Datenstrukturen sind darauf ausgelegt, Dateien mit einer Größe von bis zu 8 Exbibyte (2$^{63}$) auf einem XFS-formatierten Datenträger anzulegen. Heutige Betriebssysteme nutzen diese Grenzen noch nicht aus. So unterstützt Linux 2.4 eine maximale Dateigröße von 16 Tebibyte (2$^{44}$ = 2$^{12}$ · 2$^{32}$) bei einer Speicherseitengröße von 4 Kibibyte (2$^{12}$) und 64 Tebibyte (2$^{46}$ = 2$^{14}$ · 2$^{32}$) bei einer Speicherseitengröße von 16 Kibibyte (2$^{14}$).

### Journal

Das von XFS geführte Journal wird seriell abgelegt (es erfolgt keine Ablage in komplexen Datenstrukturen wie Bäumen oder Heaps). Dabei kann das Journal sowohl in dafür reservierten Bereichen auf dem entsprechenden Datenträger abgelegt als auch auf externen Speichermedien geführt werden. XFS fügt Transaktionen auf dem Dateisystem jedoch asynchron (der Dateisystem-Treiber arbeitet blockierungsfrei) zum Journal hinzu. Dadurch können Operationen schneller durchgeführt werden als auf vergleichbaren Systemen, im Falle einer Störung (Stromausfall) können aber einige Eintragungen im Journal fehlen.
Eine an einen Fehlerfall anschließende Überprüfung des Dateisystems wird jedoch zumindest eine Konsistenz wiederherstellen und Datenbereiche, die nicht geschrieben werden konnten, durch Nullen auffüllen. Dadurch sind mögliche Fehler durch „Datenreste“ ausgeschlossen.

### Spezielle Speicherbelegung
#### Belegungsgruppen

Eine weitere Besonderheit von XFS sind sogenannte Belegungsgruppen (englisch allocation group). Diese bilden eine eigene Einheit im XFS-System und verwalten eigenständig sowohl den freien Speicher als auch Inodes. Dadurch können mehrere Prozesse gleichzeitig auf ein Dateisystem zugreifen (sofern jeder Prozess auf eine andere Belegungsgruppe zugreift).

#### Größenbasierte Belegung

Informationen über freie Speicherbereiche werden in B+-Bäumen abgelegt, wodurch es möglich ist, passende Speicherbereiche zu finden und so eine Fragmentierung größtenteils zu vermeiden.
XFS unterstützt Blockgrößen von 512 Byte bis 64 Kibibyte. Dadurch lässt sich ein Dateisystem angepasst der erwarteten Nutzung anlegen. Sowohl kleine als auch große Dateien können gut verwaltet werden.

#### Verzögerte Belegung

Neben der größenbasierten Belegung bietet XFS auch noch eine weitere Verringerung möglicher Fragmentierung durch verzögerte Belegung. Dabei werden Dateien möglichst lange im Speicher gehalten, bevor sie auf den Datenträger geschrieben werden. Dadurch erhöht sich die Wahrscheinlichkeit, dass der XFS-Treiber einen passenden Speicherbereich finden und so auf Fragmentierung verzichten kann. Allerdings ist dadurch die Gefahr eines Datenverlustes, beispielsweise durch Stromausfälle, größer.

## Nachteile von XFS

Das Design von XFS hat im Vergleich zu einigen anderen Dateisystemen auch Nachteile: In aktuellen Implementierungen ist es nicht möglich, ein XFS-Dateisystem zu verkleinern. Gelöschte Dateien sind nicht wiederherstellbar.
Wegen des verzögerten Schreibens von Daten sind Datenverluste bei aktuell geöffneten Dateien bei einem Systemabsturz (zum Beispiel Stromausfall) möglicherweise größer als bei anderen Dateisystemen (siehe Abschnitt: Verzögerte Belegung).
Das Journal ist auf hohe Leistung optimiert und daher architekturabhängig: Bei einem Wechsel der Prozessor-Architektur (zum Beispiel von IA-32 auf x64) muss vor dem Einhängen des Dateisystems das Journal mit xfs_repair geleert werden.