BTRFS prüft die Integrität der Dateien mittels Checksummen. Diese werden beim Schreiben erstellt und bei jedem Lesen geprüft. Dabei werden nicht nur normale Daten (reguläre Dateien) sondern auch Metadaten (Verzeichnisstruktur, Zeitstempel etc.) mit Checksummen versehen. Kommt es beim Lesen zu einem Missmatch der Prüfsummen, gibt BTRFS einen Fehler an das anfordernde Programm zurück. BTRFS verhindert also, dass fehlerhafte Daten gelesen werden können.
Für die Selbstheilung benötigst du mindestens zwei Festplatten, welche als BTRFS-RAID 1 miteinander verknüpft werden. Kommt es nun zu einem Missmatch der Checksummen, liest BTRFS die Daten von der anderen Festplatte aus. Sind diese korrekt, repariert BTRFS die fehlerhafte Daten auf der ersten Festplatte und gibt die korrekten Daten an das aufrufende Programm zurück.
Für eine regelmäße Prüfung der Datenintegrität führt man einen sogenanten Scrub durch. Dieser ließt einmal alle Daten des Dateisystems aus und prüft alle Checksummen.
Um Backups zu machen bieten sich BTRFS-Snapshots an. Ein Snapshot stellt einen atomaren Stand eines BTRFS-Subvolume dar. Diesen Snapshot kann man dann mittels BTRFS send/receive auf eine Backup-Platte (idealerweise auch mit BTRFS formartiert) übertragen. Bei Angabe eines Parent-Snapshots werden dabei nur die Daten übertragen, welche seit dem hinzugekommen/verändert wurden, was das Anlegen von Backups stark beschleunigt. Natürlich bietet es sich an, auch bei der Backup-Platte durch Scrubs die Integrität der Daten regelmäßig zu prüfen.
Hier mal das Vorgehen skizziert: Wenn du zwei Festplatten (mit je einer Partition) hast, kannst du auf diesen wie folgt ein BTRFS-Dateisystem erstellen:
Bash:
mkfs.btrfs -L storage -d raid1 -m raid1 /dev/sdx1 /dev/sdy1
Mittels -L wird ein Label vergeben, über das sich das Dateisystem leichter ansprechen lässt. -d und -m konfigurieren Raid1 für Daten und Metadaten. Nun kann das Dateisystem eingehangen werden:
Bash:
mkdir /media/storage
mount -L storage /media/storage
Anschließend legst du ein Verzeichnis Snapshots und ein Subvolume Data an:
Bash:
mkdir /media/storage/snapshots
btrfs subvolume create /media/storage/data
In dem Subvolume Data kannst du zukünftig deine Daten ablegen. In dem Verzeichnis Snapshots werden BTRFS-Snapshosts des Subvolume Data abegelgt.
BTRFS-Snapshots lassen sich dann wie folgt erstellen:
Bash:
btrfs subvolume snapshot -r /media/storage/data /media/storage/snapshots/snapshot-1
Wenn unter /media/backup eine Backup-Platte eingebunden ist, lässt sich dieser Snapshot wie folgt auf diese Platte übertragen:
Bash:
btrfs send /media/storage/snapshots/snapshot-1 | btrfs receive /media/backup
Weitere Backups von Snapshots lassen sich, solange der Vorgänger auf beiden Platten vorhanden ist wie folgt anlegen, weibei nur die Änderungen übertragen werden:
Bash:
btrfs send -p /media/storage/snapshots/snapshot-1 /media/storage/snapshots/snapshot-2 | btrfs receive /media/backup
In regelmäßigen Abständen kann man einen Scrub wie folgt machen:
Bash:
btrfs scrub start /media/storage
Der Status des Scrubs lässt sich wie folgt auslesen:
Bash:
btrfs scrub status /media/stoarge
Eine Beispielausgabe kann wie folgt aussehen:
Code:
UUID: xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx
Scrub started: Sat Apr 5 08:00:31 2025
Status: finished
Duration: 12:06:04
Total to scrub: 13.86TiB
Rate: 333.36MiB/s
Error summary: no errors found
Am Ende muss noch ein Eintrag in der /etc/fstab gemacht werden, damit das Dateisystem beim Start automatisch eingebunden wird:
Bash:
LABEL=storage /media/storage btrfs subvol=/,compress=zstd:1,noatime 0 0
Dabei sorgt compress=zstd:1 dafür, dass leicht zu komprimiertede Dateien komprimiert abgelegt werden und noatime sorgt dafür, dass keine Lesezeitstempel erzeugt werden. Es empfiehlt sich diese Option zu setzen. Werden diese benötigt, dann die Option relatime verwenden.