btrfs

Natürlich gibt es mehrere Möglichkeiten der Datensicherung für den Raspberry Pi. Ich persönlich nutze rsync und zusätzlich ein selbstentwickeltes Image-Verfahren. Vermisst habe ich allerdings die Möglichkeit, vor Updates und kleinen Änderungen einen Snapshot im Filesystem machen zu können. Daher ist btrfs eine moderne Alternative zum Standard-Filesystem von Raspbian: ext4.

Backup

Zunächst müssen Sie ein Image-Backup der SD-Karte machen. Danach stecken Sie die SD-Karte mit einem SD-Kartenleser an ein anderes System an.

Konvertierung

Das Root-Filesystem (in meinem Fall als /dev/sdb2 erkannt) muss für die Konvertierung offline sein. Das ext4-Filesystem wird zunächst gecheckt und danach in ein btrfs-Filesystem konvertiert.

# fsck.ext4 /dev/sdb2
# apt-get install btrfs-tools
# btrfs-convert /dev/sdb2
# mount -t btrfs /dev/sdb2 /mnt
# mount -t vfat /dev/sdb1 /mnt/boot
# chroot /mnt

Das neue btrfs-Filesystem einbinden

In der Datei /boot/cmdline.txt muss rootfstype=ext4 gegen rootfstype=btrfs ausgetauscht werden.

# vi /etc/fstab

In der Datei /etc/fstab muss das Filesystem der Rootpartition angepasst werden.

proc            /proc           proc    defaults              0       0
/dev/mmcblk0p1  /boot           vfat    defaults              0       2
/dev/mmcblk0p2  /               btrfs   defaults,noatime      0       1

Die Option ssd wird im Falle von SSDs bei aktuellen Betriebssystemen automatisch hinzugefügt. Die Option noatime verringert die Schreibzugriffe, die ansonsten auf jeden Zugriff auf eine Datei folgen. Weitere Mountoptionen können je nach Bedarf sinnvoll sein:

  • commit=300 setzt den turnusmäßigen Filesystem-sync von 30 Sekunden (Standard) auf 5 Minuten. Das dient dazu, Schreibzugriffe etwas zu reduzieren und die Lebensdauer zu erhöhen.
  • compress=lzo (siehe entsprechender Artikel)
  • autodefrag defragmentiert die Daten on-the-fly. Jedes Copy-on-Write-Dateisystem fragmentiert mit der Zeit. Doch die weit verbreitete Meinung, diese Option könnte für SSDs sinnvoll sein, teile ich so pauschal nicht. Der wahlfreie Zugriff auf die Datenblöcke verhindert geringe Performanceeinbußen zwar nicht vollständig, wirkt sich aber bei fragmentierten Dateisystemen auf SSDs nicht negativ auf deren Lebensdauer aus. Anders ist die Bewertung bei klassischen Spindel-Festplatten. Hier sollte irgendeine Art der Defragmentierung - ob mittels des Kommandos btrfs defragment oder Mountoption sei dahingestellt - vorgenommen werden.

Den btrfs-Treiber in ein initramfs einbinden

Der btrfs-Treiber ist nur als Modul in den Kernel integriert. Deshalb muss dieses Modul für den Bootvorgang in einer Datei abgelegt werden. Die benötigten Module tragen Sie in eine Datei ein.

# vi /etc/initramfs-tools/modules
btrfs
xor
zlib_deflate
raid6_pq

Danach kann eine initramfs gebaut werden. Standardmäßig baut initramfs eine initrd passend zum laufenden Kernel. Deshalb muss nach einem Update die neue Kernel Version als Argument mitgegeben werden. Achtung: Die initrd muss passend zum Kernel gebaut werden, der von der ARM-Version des Raspberry abhängt. Der Raspberry Pi 2 läuft mit ARMv7, der Raspberry Pi 1 mit ARMv6.

# mkinitramfs -o /boot/initramfs-btrfs.gz [Kernel-Version]

Die initramfs beim Systemstart einbinden

Nun muss Raspbian noch beigebracht werden, dass es die initramfs laden soll. Das bewirkt ein Eintrag in der Datei /boot/config.txt:

initramfs initramfs-btrfs.gz

Nacharbeiten

Abschließend die chroot-Umgebung mit exit verlassen und die gemounteten Filesysteme wieder unmounten. Von der Karte booten - fertig!

Wichtig: Die initramfs nach einem rpi-update nicht automatisch neu erstellt; das muss also von Hand gemacht werden. Dabei nicht die Kernel-Version als Argument vergessen!

Irgendwann kann dann die Sicherung des alten Filesystems gelöscht und das Dateisystem neu organisiert werden.

# btrfs subvolume delete /ext2_saved/
# btrfs filesystem defrag -r /
# btrfs balance start /

Regelmäßige Pflege

Die Frage, ob ein btrfs-Filesystem regelmäßig gepalanced werden sollte, wird kontrovers diskutiert. Ausgangspunkt für meine Überlegungen ist der Wunsch, dass mein btrfs-Filesystem niemals zu 100% voll wird.

Dabei können Sie sich keinesfalls auf das Linux-Kommando df verlassen, sondern nur auf das Kommando:

# btrfs filesystem df /

Eigentlich dient der balance der gleichmäßigen Verteilung bei Nutzung mehrerer Volumes. Damit lässt sich das Dateisystem allerdings auch reorganisieren und nicht genutzter Platz freigeben. Es hängt immer vom Einzelfall ab und es lässt sich kein pauschaler Rat geben, aber ich selber nutze einen cron-job, der im Verzeichnis /etc/cron.weekly liegt und damit wöchentlich ausgeführt wird:

#!/bin/bash

#
# paranoia settings
#
umask 022
PATH=/sbin:/bin:/usr/sbin:/usr/bin
export PATH

btrfs scrub start -B / | tee /var/log/btrfs-scrub.log

(( m = 0 ))

while btrfs balance start -musage=$m /
do
        (( m = m + 5 ))
done

(( d = 0 ))

while btrfs balance start -dusage=$d /
do
        (( d = d + 5 ))
done

btrfs balance start /

btrfs scrub start -Bd /

exit 0

Auf ein defragmentieren des Filesystemes verzichte ich im Falle von SD-Karten und SSDs.

Previous page: Raspberry Pi Next page: snapper