Btrfs


files (Photo by Wesley Tingey on Unsplash)

Ich glaube, ich muß mal etwas über BTRFS erzählen. Dieses Filesystem, ähnlich ist hier natürlich auch ZFS, ist ja eigentlich mehr als nur ein Filesystem. Eigentlich ersetzt das:

  • ein normales Filesystem
  • lvm
  • RAID

und noch einige zusätzliche Features. Weswegen ich das hier mal erwähnen muß, ist ein Crash eines meiner Systeme in den letzten Tagen. Ich betreibe zwei NUCs mit Linux und BTRFS-Filesystemen. Hier habe ich im BTRFS “partitioniert” - sprich Subvolumes deklariert, und das Root-Filesystem selbst auch in ein Subvolume verfrachtet. Damit ist dann ein Backup via BTRBK diverser einzelner Subvolumes möglich. Darüber werde ich später erzählen.

Aber jetzt zu meinem Crash. Eine meiner Maschinen hat einfach mitten in der Nacht die Arbeit eingestellt. Das Gerät ließ sich nicht mehr starten, einfach tot. Meine Lösung dazu war die Anschaffung von zwei neuen kleinen NUCs mit Core i3-Prozessor. Ich wollte einfach nur die SSDs der alten Maschinen in die neuen schrauben und fertig. Im Nachhineint hatte sich herausgestellt, daß die Ethernet-Schnittstellen einen anderen Namen haben und man noch ein Firmware-Paket installieren mußte, aber das ist der normale Schmerz bei neuer Hardware.

Es stellte sich heraus, daß die neuen NUCs zusätzlich zum normalen SATA-Slot auch noch einen M.2-Slot haben. Also habe ich mutig für die neuen Büchsen auch zwei NVME-Riegel mit der gleichen Speicherkapazität wie die SSDs erstanden. Mein Ziel war der Aufbau eines RAID1, um einen der häufigsten Ausfälle in den letzten 10 Jahren abzufangen: einen Plattencrash.

Klassisch stünde man nun vor einem Dilemma: Der RAID-Layer liegt unter dem Filesystemlayer und zusätzlich müßte man für die Partitionierung auch noch einen LVM-Layer darüber legen. Man müßte die Platte(n) also sichern, neu formatieren und zurückkopieren. Der kurze Schock verflog aber schnell, ich habe ja BTRFS.

Wie macht man das da also? Zunächst partitioniert man die neue NVME in den ersten Blöcken so wie die SSD. Dort ist nämlich auch noch eine EFI-Partition und eine Swap-Partition. Und die letzte Partition für das Filesystem wird auf den restlichen Speicherberich des Laufwerks gelegt. Diese kann auch leicht kleiner oder größer als die Original-SSD sein. Die kleinste Platte beschränkt die Gesamtkapazität.

Und jetzt kommt der Trick:

btrfs device add /dev/nvme0n1p3 /
btrfs balance start -dconvert raid1 -mconvert=raid1 /

Man muß die neue Partition noch nicht mal via mkfs.btrfs mit einem Filesystem initialisieren. Das macht bereits das btrfs device add .

Nach dem Balance läuft das System bereits im RAID1. Und ein darauf laufendes Scrubbing gibt bereits für beide Devices eine Scrub-Statistik.

Damit die Platte dann auch bei einem SSD-Crash bootet, muß man sich damit befassen, die vorbereitete EFI-Partition auf der NVME mit Grub beglücken:

grub-install /dev/nvme0n1
update-grub /dev/nvme0n1

Hier muß man natürlich darauf aufpassen, daß man die Grub-Aktionen bei Upgrades nachzieht. Ein Hooking ist da angebracht.

Und das war es schon. Stirbt eine Platte kann man sie tauschen. Hier im Beispiel wäre die ursprüngliche SSD unter /dev/sda kaputtgegangen. Nach der Partitionierung wie vorhin bekommt man mittels

btrfs delete missing /dev/sda /
btrfs replace start /dev/nvme0n1 /dev/sda /

dann die Ersatzplatte wieder ans Fliegen.

btrfs  btrbk  zfs