Kernel-Log – Was 2.6.29 bringt (4): Dateisysteme, Storage – Btrfs, SquashFS, Ext4 ohne Journal und neue Storage-Treiber
Die Kernel-Entwickler haben mit Btrfs und SquashFS nicht nur zwei neue Dateisysteme aufgenommen, sondern auch Ext4, OCFS2 und XFS verbessert. Größere Änderungen gab es auch in den IDE-, Libata- und SCSI-Subsystemen sowie im Block-Layer.
- Thorsten Leemhuis
Wenn man den von Linus Torvalds bei der Freigabe der siebten Vorabversion von 2.6.29 getätigten Aussagen glauben schenken darf, wird es noch etwa ein bis zwei Wochen dauern, bis der Linux-Kernel 2.6.29 erscheint. Das Kernel-Log will daher die Berichterstattung über die für 2.6.29 vorgesehenen Neuerungen an dieser Stelle mit einer Beschreibung der Neuerungen rund um Dateisysteme und Storage-Techniken fortsetzen.
Butter-Dateisystem
Wie bereits während des Merge-Window von 2.6.29 kurz berichtet, haben die Kernel-Entwickler das experimentelle Dateisystem Btrfs aufgenommen. Fertig ist es aber bei weitem noch nicht – vielmehr wollen die Kernel-Hacker es im Rahmen des Linux-Kernels weiter entwickeln und reifen lassen, ähnlich wie es bei Ext4 der Fall war, das im Herbst 2006 für Linux 2.6.19 aufgenommen wurde und kürzlich mit Linux 2.6.28 seine Hauptentwicklungsphase beendete.
Btrfs – kurz für B-tree FS, im Englischen gemeinhin aber als Butter FS ausgesprochen – ist ein "Copy On Write"-Dateisystem, das der bei Oracle angestellte Kernel-Entwickler Chris Mason aus der Taufe gehoben hat. Nach der ersten Ankündigung von Btrfs auf der Linux-Kernel Mailing List (LKML) im Juli 2007 fand der früher bei Suse lange für ReiserFS zuständige Entwickler schnell Unterstützung durch zahlreiche andere Entwickler – in den Commit-Kommentaren finden sich die Autor-Auszeichnungen von bei HP, Intel, Novell/Suse und Red Hat beschäftigten Entwicklern.
Bereits im Herbst 2007 haben sich einige wichtige Linux-Dateisystem-Entwickler bei einem Treffen auf Btrfs als "Next Generation Filesystem for Linux" geeinigt, wie Ext[234]-Dateisystementwickler Theodore Ts'o (kurz Ted Tso oder Tytso) vor einigen Monaten in einer Mail verriet. Die Ext4-Entwicklung treiben er und anderen dennoch voran, da dies durch die erprobte Ext3-Basis und die weiter fortgeschrittene Entwicklung als Übergangslösung gebraucht würde, bis Btrfs so weit gereift sei, dass ihm auch Unternehmenskunden vertrauen.
Das Btrfs-Wiki liefert einen Überblick über die wichtigsten Eigenschaften des von Grund auf neuen und speziell für Linux entwickelten Dateisystems:
- Extent-basierte Datenspeicherung (maximale Dateigröße: 2^64 Byte)
- Im Hinblick auf den Speicherverbrauch effiziente Speicherung von kleinen Dateien und Verzeichniseinträgen
- Dynamische Zuteilung von Inodes
- Schreibbare Snapshots
- Subvolumes
- Checksummen für Daten und Metadaten
- Kompression
- eingebaute Funktionen zum Zusammenfassen mehrerer Datenträger zu einem Volume mit verschiedenen RAID-Algorithmen
- Dateisystem-Check und Defragmentierung zur Laufzeit
- Schnelle Dateisystem-Checks
- Effiziente inkrementelle Backups und Dateisystem-Mirroring
- zuschaltbare Optimierungen für SSDs
Die Development Timeline erläutert einige Dinge, die noch auf der ToDo-List stehen, während das Changelog einen guten Überblick darüber liefert, was die Entwickler alles schon erreicht haben. Aufbau und Funktionsweise des Dateisystem erläutert ein anderes Wiki-Dokument, häufige Fragen beantwortet die FAQ. Während sich das Format der auf dem Datenträger gespeicherten Datenstrukturen im Verlauf der Entwicklungsphase von Ext4 gelegentlich änderte und so beim Umstieg auf neuere Kernel ein Umformatieren nötig machte, planen die Btrfs-Entwickler den Anwendern diese Umstände von nun an zu ersparen – vollkommen auszuschließen sind weitere Änderungen am Ondisk-Format von Btrfs allerdings nicht.
Btrfs wurde mit seiner kompletten Entwicklungshistorie aufgenommen, was sich auf insgesamt über 900 kleinere oder größere Commits im Quellcodeverwaltungssystem von Linux addiert hat. Nach der Aufnahme von Btrfs Anfang des Jahres Anfang Januar erweiterten die Kernel-Hacker das Dateisystem indes noch um neue Funktionen wie Unterstützung für SELinux. Weitere Änderungen für 2.6.30 finden sich bereits in Vorbereitung – einige von ihnen sollen die Performance weiter verbessern.
Während einige Linux-Distributionen jetzt erwägen, Ext4-als Standard-Dateisystem einzusetzen, wird selbiges bei Btrfs wohl noch eine Zeit lang dauern. Die Fedora-Entwickler haben Installer und Kernel in ihren Entwicklerzweig aber bereits um Btrfs-Unterstützung erweitert.
Kernel-Log – Was 2.6.29 bringt (4): Dateisysteme, Storage – Btrfs, SquashFS, Ext4 ohne Journal und neue Storage-Treiber
Kürbis-Dateisystem
Während die Aufnahme des experimentellen Btrfs sich erstmal nicht auf die meisten Anwender und Distributions-Entwickler auswirkt, dürfte die Integration von SquashFS schneller Auswirkungen zeigen. Bei ihm handelt es sich um ein komprimierten Read-Only-Dateisystem, das diversen Linux-Distributionen schon lange auf ihren von USB, CD oder DVD gestarteten Installation- oder Live-Medien einsetzen, um möglichst wenig Platz zu verbrauchen; auch im Embedded-Bereich kommt die Cramfs-Alternative daher häufig zum Einsatz. Die Kernel-Dokumentation zu Squashfs erläutert die Unterschiede zwischen Cramfs und Squashfs sowie die Funktionsweise des neuen Dateisystems detailliert.
In den vergangenen Jahren hatten die SquashFS-Entwickler sich bereits mehrfach um eine Aufnahme in den Linux-Kernel bemüht, waren aber an den Qualitätsansprüchen der Kernel-Hacker gescheitert. Die kritisierten Code-Abschnitte hatten die SquashFS-Entwickler bei der jetzt aufgenommenen Version 4.0 zu verbessern versucht. Die Aufnahme kam aber doch recht überraschend – nach längerer Diskussion um das für und wider sowie einige Probleme am aktuellen Code sagte Torvalds, dass es sinnlos wäre, es nicht aufzunehmen, wenn ohnehin alle Welt das Dateisystem benutzen würde ("if this is really in use by everybody, then not merging it is kind of pointless. "); wenig später integrierte er schließlich die SquashFS-Patches in den Hauptentwicklungszweig.
Noch mehr Dateisysteme
Auch bei den schon länger im Kernel enthaltenen Dateisystemen gab es einiges an Änderungen. So beherrscht der Kernel nun ein vorübergehendes Einfrieren von Dateisystemen (Filesystem Freeze; 1, 2, 3, LWN-Artikel) – das ist etwa für Container-Virtualisierung sowie für Backup-Lösungen interessant. eCryptfs beherrscht nun das Verschlüsseln von Dateinamen (u. .a. 1, 2, 3, 4); in XFS hingegen gab es zahlreiche größere Änderungen am Btree-Algorithmus (siehe Anhang). Größere Änderungen gab es auch beim Cluster-Dateisystem OCFS2, das nun ACLs, Security Attributes, Quotas und Metadata Checksummen unterstützt.
Zahlreiche kleine Verbesserungen, Aufräumarbeiten und Korrekturen gab es auch am Ext4 Dateisystem – einige von ihnen fanden zwischenzeitlich sogar den Weg in die Stable-Kernel der Serien 2.6.27 und 2.6.28. Die Ext4-Entwickler passten zudem die Dokumentation zum Aktivieren von Write-Barriern an, um die es kürzlich eine längere Diskussionen gegeben hatte (siehe auch LWN-Artikel zum Thema). Einige Änderungen am Fsync-Algorithmus sollen ferner die Performance ein wenig verbessern.
Wer will, kann dank einiger von Google-Entwicklern eingebrachten Änderungen nun Ext4-Dateisysteme ohne Journal betreiben und so die Geschwindigkeit nochmal steigern – bisher setzten mache Anwender noch auf Ext2, um den vom Journaling verursachten Overhead zu umgehen. Einige Messungen zum Einfluss von Journaling auf die performance sowie Überlegungen zum Einsatz von Ext-Dateisystemen auf SSDs finden sich in einem kürzlich veröffentlichten Blog-Eintrag von Theodore Ts'o. Wer sich näher für Ext4 interessiert, findet zudem zahlreiche Hintergrundinfos in einem kürzlich veröffentlichten IBM-Developerworks-Artikel.
Die Unterstützung für Defragmentieren zur Laufzeit ("Online Defrag") in Ext4 nahmen die Kernel-Entwickler noch nicht für 2.6.29 auf; Ende Januar wurde eine neue Varianten veröffentlicht, bei der einige zuvor kritisierte Codebereiche überarbeitet wurden (siehe auch LWN-Artikel zum Thema).
Qual der Wahl bei IDE/PATA
Auch in diesem Entwicklungszyklus gab es wieder zahlreiche Änderungen am IDE-Subsystem des Kernels, das vorwiegend Parallel-ATA-Adapter (gemeinhin als "IDE-Adapter" bezeichnet) ansteuert (1, 2 3). So portierte der für diesen Kernel-Bereich zuständige Entwickler Bartlomiej Zolnierkiewicz einen Libata-Treiber für den CS5536 auf das IDE-Subsysteme und nahm den bei 2.6.18 entfernten Treiber IT8172 für den gleichnamigen Chip von ITE wieder auf. Auch an einigen grundlegenden Kernel-Funktionen gab es einige größere Änderungen (siehe Anhang).
Für viele Anwender dürfte diese Änderungen das aber keine größere Bedeutung haben, denn die meisten aktuellen Linux-Distributionen nutzen zur Ansteuerung von Parallel- und Serial-ATA-Adaptern schon seit längerem vorwiegend die Treiber des Libata-Subsystems. Die mit 2.6.19 aufgenommene PATA-Treiber auf Libata-Basis dürften dadurch wohl mittlerweile deutlich besser getestet sein als die eigentlich älteren Treiber des sich in den letzten Monaten stetig wandelnden IDE-Subsystems. Wie lange die Kernel-Entwickler diese zwei Treiber-Arten weiter pflegen wollen, ist ungewiss. Ursprünglich war erwartet worden, dass das alte IDE-Subsystem entfernt wird, nachdem sich die Libata-PATA-Treiber etabliert haben; derzeit sieht es aber nicht so aus, als ob das bald passieren würde.
Libata und SCSI, Anhang
Libata, SCSI und Unterbau
Die Libata-Entwickler waren derweil auch keineswegs untätig (1, 2). So erweiterte Alan Cox das Libata-Subsystem um 32-Bit-PIO-Unterstützung; der sata-sil-Treiber hingegen beherrscht nun Large Block Transfers. Neu dabei ist die Unterstützung für die VIA-Chips VT6415 (PATA), VT8261 (SATA) sowie den den VX855 (PATA) sowie dessen Verwandten mit der PCI-ID 0x0571.
Wie angekündigt haben die Kernel-Hacker den zum SCSI-Subsystem gehörenden Treiber ide-scsi entfernt, da 2.6er-Kernel und moderne Brennprogramme schon lange dazu in der Lage sind, ohne SCSI-Emulation auf IDE-CD/DVD-Brenner zuzugreifen. Neu im SCSI-Subsystem ist die maßgeblich von Intel im Rahmen des Open-FCoE-Projekts entwickelte Libfc – eine modulare Fibre Channel Library, auf die die ebenfalls neu aufgenommene Unterstützung für Fibre Channel over Ethernet zurückgreift. Erstmals dabei ist auch der iSCSI-Treiber cxgb3i für Chelsio-Adapters mit T3-Chips.
Über das Pseudo-Dateisystem Sysfs kann man dem IDE-, Libata- und SCSI-Subsystemen zugrundeliegende Block-Layer nun mitteilen, ob es sich bei einem Datenträger um ein "rotierendes Medium" handelt, sofern der Kernel das nicht selbst feststellen kann. Andere Kernel-Subsysteme und Userspace-Programme können mit Hilfe dieser Informationen für Festplatten oder SSDs ideale Zugriffsmuster aktivieren, um die bestmögliche Geschwindigkeit beim Schreiben und Lesen von Daten zu erzielen. Der Device Mapper (DM) unterstützt nun Barrier und stellt so auf Wunsch des Dateisystems sicher, dass Daten wirklich auf die am DM-Verbund beteiligten Datenträger geschrieben wurden, bevor die nächsten Aufgaben angegangen werden – das ist für die Integrität von Dateisystemen mit Journal von Vorteil (siehe auch LWN-Artikel zum Thema).
Noch mehr
Neben den bereits erwähnten Neuerungen gab es für 2.6.29 noch zahlreiche weitere wichtige Änderungen rund um Dateisysteme und die Storage-Unterstützung des Linux-Kernels:
Dateisysteme
Btrfs
- zu viele Commits, um sie hier alle aufzulisten; eine Übersicht bieten die Git-Pull-Requests (1, 2, 3, 4, 5, 6) sowie das Git-Web-Interface auf kernel.org.
CIFS
Ext[234]
- ext3: Add support for non-native signed/unsigned htree hash algorithms
- ext4: Add markers for better debuggability
- ext4: Add mount option to set kjournald's I/O priority
- ext4: Add sanity checks for the superblock before mounting the filesystem
- ext4: Add support for non-native signed/unsigned htree hash algorithms
- ext4: Remove code to create the journal inode
- ext4: Remove "extents" mount option
- Update Documentation/filesystems/ext4.txt
Fuse
- fuse: implement ioctl support
- fuse: implement poll support
- fuse: implement unsolicited notification
- fuse: update interface version
OCFS2
- ocfs2: add mount option and Kconfig option for acl
- ocfs2: add POSIX ACL API
- ocfs2: Add quota calls for allocation and freeing of inodes and space
- ocfs2: add security xattr API
- ocfs2: Add the on-disk structures for metadata checksums.
- ocfs2: Add the underlying blockcheck code.
- ocfs2: Assign feature bits and system inodes to quota feature and quota files
- ocfs2: Enable quota accounting on mount, disable on umount
- ocfs2: Implementation of local and global quota file handling
- ocfs2: Implement quota recovery
- ocfs2: Periodic quota syncing
- ocfs2: Remove JBD compatibility layer
- ocfs2/xattr: Merge xattr set transaction.
SquashFS
- MAINTAINERS: squashfs entry
- Squashfs: block operations
- Squashfs: cache operations
- Squashfs: directory lookup operations
- Squashfs: directory readdir operations
- Squashfs: documentation
- Squashfs: export operations
- Squashfs: fragment block operations
- Squashfs: header files
- Squashfs: initrd support
- Squashfs: inode operations
- Squashfs: Kconfig entry
- Squashfs: Makefiles
- Squashfs: regular file operations
- Squashfs: super block operations
- Squashfs: symlink operations
- Squashfs: uid/gid lookup operations
UBIFS
- UBIFS: add debugfs support
- UBIFS: introduce compression mount options
- UBIFS: remove fast unmounting
- UBIFS: separate debugging fields out
- UBIFS: slight compression optimization
- UBIFS: use bit-fields to store compression type
XFS
- XFS: add generic btree types
- XFS: add new btree statistics
- XFS: implement generic xfs_btree_decrement
- XFS: implement generic xfs_btree_delete/delrec
- XFS: implement generic xfs_btree_increment
- XFS: implement generic xfs_btree_insert/insrec
- XFS: implement generic xfs_btree_lookup
- XFS: implement generic xfs_btree_rshift
- XFS: implement generic xfs_btree_split
- XFS: make btree root in inode support generic
- XFS: make btree tracing generic
- XFS: refactor xfs_btree_readahead
- XFS: Sync up kernel and user-space headers
- XFS: Update maintainers
VFS, andere Dateisysteme
- fs: use menuconfig to control the Misc. filesystems menu
- filesystem notification: create fs/notify to contain all fs notification
- fix f_count description in Documentation/filesystems/files.txt
- fs: use menuconfig to control the Misc. filesystems menu
- introduce new LSM hooks where vfsmount is available.
- kill ->dir_notify()
- nfsd: document new filehandle fsid types
- NFSD: Add documenting comments for nfsctl interface
- GFS2: Support for FIEMAP ioctl
- GFS2: Kill two daemons with one patch
- quota: Allow to separately enable quota accounting and enforcing limits
- poll: allow f_op->poll to sleep
Storage
DM, DMA, MD, UBI sowie Block-Layer inklusive IO-Scheduler
- async_tx, dmaengine: document channel allocation and api rework
- block: Add Kconfig help which notes that ext4 needs CONFIG_LBD
- block: add sysfs file for controlling io stats accounting
- block: add text file detailing queue/ sysfs files
- block: don't use plugging on SSD devices
- block: make barrier completion more robust
- block: Supress Buffer I/O errors when SCSI REQ_QUIET flag set
- cfq-iosched: remove limit of dispatch depth of max 4 times quantum
- dm: add name and uuid to sysfs
- dmaengine: add a release for dma class devices and dependent infrastructure
- dmaengine: remove 'bigref' infrastructure
- dmaengine: up-level reference counting to the module level
- dm: support barriers on simple devices
- Get rid of CONFIG_LSF
- nbd: tell the block layer that it is not a rotational device
- UBI: document UBI ioctls
- UBI: simplify PEB protection code
IDE
- ata: add CFA specific identify data words
- ide: add at91_ide driver
- ide: add port and host iterators
- ide: dynamic allocation of device structures
- ide: ide.c 'clear' fix, update "ide=nodma" documentation
- ide: update warm-plug HOWTO
- it821x: Add ultra_mask quirk for Vortex86SX
Libata
- ahci: Add the Device IDs for MCP89 and remove IDs of MCP7B to/from ahci.c
- ata_piix: save, use saved and restore IOCFG
- libata ahci: Add SATA GEN3 related messages
- libata ahci: Withdraw IGN_SERR_INTERNAL for SB800 SATA
- libata: beef up iterators
- libata: blacklist NCQ on OCZ CORE 2 SSD (resend)
- libata: New driver for OCTEON SOC Compact Flash interface (v7).
- libata: use WARN_ON_ONCE on hot paths
- pata_hpt366: reimplement mode programming
- pata_hpt3x3: Workarounds for chipset
- SATA AHCI: Blacklist system that spins off disks during ACPI power off
- SATA: Blacklisting of systems that spin off disks during ACPI power off
- sata_mv: fix 8-port timeouts on 508x/6081 chips
- sata_mv: Fix chip type for Hightpoint RocketRaid 1740/1742
- sata_mv: no longer experimental (v2)
- SATA PIIX: Blacklist system that spins off disks during ACPI power off
- SATA Sil: Blacklist system that spins off disks during ACPI power off
MMC
- mmc: Add 8-bit bus width support
- mmc: Add a MX2/MX3 specific SDHC driver
- mmci: Add support for ST Micro derivate
- mmc_spi: Add support for OpenFirmware bindings
- mmc: warn about voltage mismatches
- ricoh_mmc: Handle newer models of Ricoh controllers
- sdhci: activate led support also when module
- sdhci: handle built-in sdhci with modular leds class
- sdricoh_cs: Add support for Bay Controller devices
MDT
- MTD: add MTD tests to compilation
- MTD: LPDDR Command set driver
- MTD: LPDDR extended physmap driver to support LPDDR flash
- MTD: LPDDR Makefile and KConfig
- MTD: NAND ndfc driver
- MTD: physmap: make physmap compat explicit
- MTD: tests: add mtd_oobtest
- MTD update internal API to support 64-bit device size
SCSI
- SCSI: FC protocol definition header files
- SCSI: hptiop: Add new PCI device ID
- SCSI: lpfc 8.3.0 : Add BlockGuard support (T10-DIF) code
- SCSI: lpfc 8.3.0 : Add BlockGuard support (T10-DIF) structs and defs
- SCSI: lpfc 8.3.0 : Added 3 small features and improve PCI EEH support
- SCSI: lpfc 8.3.0 : Add support for Power Management Suspend/Resume operations
- SCSI: qla2xxx: Add ISP81XX support.
- SCSI: qla2xxx: add support for multi-queue adapter
- SCSI: qla2xxx: Code changes for qla data structure refactoring
- SCSI: qla2xxx: Refactor qla data structures