FS: Btrfs

Siehe auch

Verwandte Artikel
Offizielle Dokumentation
  • man btrfs, man mkfs.btrfs, man btrfs-subvolume, man btrfs-send, man btrfs-scrub

  • Btrfs Documentation

Linuxfabrik

Von den drei unter Linux verbreiteten Dateisystemen Ext4, XFS und Btrfs ist Btrfs das jüngste. Es arbeitet durchgängig Copy-on-Write und bringt im Gegensatz zu Ext4 und XFS Subvolumes, native Snapshots, Prüfsummen auf Daten und Metadaten, transparente Kompression, Deduplizierung und Multi-Device-Verwaltung (ein integriertes RAID) direkt mit. Ein klassisches Block- und Metadaten-Journaling wie bei Ext4 und XFS fehlt dafür, da CoW die Konsistenz auf andere Weise sichert.

Achtung

Btrfs ist in RHEL und Rocky nicht enthalten (in RHEL 8 wurde es entfernt); das Paket btrfs-progs lässt sich dort nicht installieren. Praktisch relevant ist Btrfs damit unter Fedora, openSUSE und SLES (dort Default für das Wurzeldateisystem). Die folgenden Beispiele wurden unter Fedora geprüft.

Die Maximalgrössen stehen in der Limits-Tabelle in Filesysteme.

Dateisystem erstellen

mkfs.btrfs --force /dev/sdb

Standard-Geometrie: Node-Grösse 16 KiB, Sektorgrösse 4 KiB, Prüfsumme crc32c. Innerhalb eines Btrfs-Dateisystems werden die eigentlichen Datenbereiche als Subvolumes angelegt, die sich getrennt mounten und unabhängig per Snapshot sichern lassen:

mount /dev/sdb /mnt
btrfs subvolume create /mnt/data
btrfs subvolume list /mnt

Dateisystem vergrössern und verkleinern

Btrfs kann im laufenden Betrieb sowohl wachsen als auch schrumpfen. Die Grösse wird relativ (+/-) oder absolut angegeben, max füllt das Gerät:

# grow to fill the device
btrfs filesystem resize max /data

# grow / shrink by a relative amount
btrfs filesystem resize +10G /data
btrfs filesystem resize -5G /data

Ein Btrfs-Volume kann sich über mehrere Geräte erstrecken. Wurde ein bereits eingebundenes Gerät per Hypervisor vergrössert, muss beim Resize die Device-ID mitgegeben werden:

# add a device to the volume
btrfs device add /dev/sdc /data

# resize a specific device (devid from "btrfs filesystem show")
btrfs filesystem resize 2:max /data

Dateisystem prüfen und reparieren

Btrfs trennt zwei Aufgaben. scrub prüft im laufenden Betrieb alle Daten und Metadaten gegen ihre Prüfsummen und korrigiert beschädigte Blöcke automatisch, sofern eine zweite Kopie vorliegt (RAID). btrfs check prüft die strukturelle Integrität des ausgehängten Dateisystems.

# online integrity check against checksums
btrfs scrub start /data
btrfs scrub status /data

# offline structural check (unmounted), read-only
btrfs check /dev/sdb

btrfs check --repair kann ein Dateisystem zusätzlich beschädigen und gilt als letztes Mittel; davor ein Backup anlegen und die Btrfs-Dokumentation konsultieren.

Nach dem Hinzufügen von Geräten verteilt balance Daten und Metadaten gleichmässig über alle Geräte des Volumes:

btrfs filesystem balance /data

Quota

Btrfs hat kein User-/Group-/Project-Modell wie Ext4 und XFS, sondern begrenzt den Verbrauch je Subvolume über Quota Groups (qgroups). Die Funktion muss erst aktiviert werden:

# enable quotas (tracks usage per subvolume)
btrfs quota enable /data

# set a limit on a subvolume
btrfs qgroup limit 10G /data/subvol1

# show usage and limits
btrfs qgroup show /data

Snapshots

Anders als Ext4 und XFS legt Btrfs Snapshots nativ an, ohne LVM oder Stratis. Ein Snapshot ist ein Subvolume, das zum Zeitpunkt des Anlegens den Stand des Originals teilt und dank CoW erst bei Änderungen eigenen Platz belegt. Für Backups wird ein schreibgeschützter Snapshot (-r) angelegt, da nur ein solcher als Basis für btrfs send taugt:

# writable snapshot (e.g. for a quick rollback point)
btrfs subvolume snapshot /data /data/snap1

# read-only snapshot (basis for send/receive)
btrfs subvolume snapshot -r /data /data/.snapshots/backup1

Wegsichern und Restore laufen über btrfs send und btrfs receive, auch auf ein anderes Dateisystem oder über SSH auf einen anderen Host:

# full backup of a read-only snapshot to another filesystem
btrfs send /data/.snapshots/backup1 | btrfs receive /backup

# incremental backup relative to a previous snapshot
btrfs send -p /data/.snapshots/backup1 /data/.snapshots/backup2 | btrfs receive /backup

# restore: send the snapshot back from the backup
btrfs send /backup/backup2 | btrfs receive /data

Einen Snapshot entfernen:

btrfs subvolume delete /data/.snapshots/backup1

Troubleshooting

No space left on device, obwohl df freien Platz zeigt

Btrfs alloziert Platz in Chunks für Daten und Metadaten getrennt. Sind die Metadaten-Chunks voll, schlägt das Schreiben fehl, auch wenn df noch Platz meldet. btrfs filesystem usage /data zeigt die echte Belegung; ein balance gibt halbleere Chunks wieder frei. Hintergrund: SUSE KB - No space left on device und Marc Merlins - Fixing Btrfs Filesystem Full Problems.

Wann sollte balanciert werden?

Nach jedem Hinzufügen oder Entfernen von Geräten sowie bei stark gefüllten oder fragmentierten Volumes. NVIDIA - When to Rebalance BTRFS beschreibt, worauf zu achten ist.