BTRFS im RAID-1-Modus im praktischen Einsatz

Soeben habe ich die neuen 2TB-Festplatten in den Media-PC eingebaut und mich dazu entschieden, dieses mal dem neuen Linux-Dateisystem btrfs eine Chance zu geben. Im Gegensatz zum klassischen ext beherscht dieses nämlich von Haus aus RAID-Funktionalitäten (Level 0, 1 und 10) sowie Snapshots. Das RAID im Level 1 schützt vor physikalischen Fehlern, die Snapshots - sofern man sie regelmäßig anlegt - vor logischen, wie einem versehentlichen 'rm -rf'.

Die Frage ist, wie stabil btrfs inzwischen geworden ist. Da es beinahe das Standardsystem unter Fedora 16 geworden wäre ist meine persönliche Einschätzung: Stabil genug für mich. Der Grund, warum FC16 doch noch ext4 verwendet, ist das fehlende bzw. nicht rechtzeitig fertig gewordene fsck. Mit den git-Quellen jedoch kein Problem, dort findet sich inzwischen ein 'btrfsck'. Sowieso würde ich für den Einsatz einen aktuellen Kernel (3.x) und die aktuellen Tools aus dem Git-Repository verwenden, siehe https://btrfs.wiki.kernel.org/.

Zuerst müssen die Partitionen im RAID-1-Modus formatiert werden:

$ sudo mkfs.btrfs -L mediafiles -d raid1 -m raid1  /dev/sdd1 /dev/sde1

Im Gegensatz zu einem klassischen mkfs gibt man hier also zwei (bzw. mehr) Devices an. Mit den Parametern -d (--data) und -m (--metadata) wird der jeweilige Speichermodus festgelegt. Standardmäßig spiegelt btrfs bei mehr als einer Partition die Metadaten (raid1) und teilt die Daten auf beide Devices auf (raid0).

Damit btrfs alle zusammengehörigen Partitionen automatisch finden kann, erhalten sie die selbe UUID und unterschiedliche Sub-UUIDs:

$ sudo blkid /dev/sdd1 /dev/sde1
/dev/sdd1: LABEL="mediafiles" UUID="243efbc4-5f72-4352-9160-d693b3ed41b5" UUID_SUB="0a5b948d-9761-4c94-8f85-c9548f1149f2" TYPE="btrfs" 
/dev/sde1: LABEL="mediafiles" UUID="243efbc4-5f72-4352-9160-d693b3ed41b5" UUID_SUB="66fbc6c1-8295-476a-bdfe-72536f0b50ed" TYPE="btrfs"

Dementsprechend reicht es beim Mounten auch aus, entweder eines der beiden Devices oder die UUID anzugeben. Die folgenden drei Befehle sind also identisch zueinander:

$ mount /dev/sdd1 /mnt 
$ mount /dev/sde1 /mnt
$ mount UUID=243efbc4-5f72-4352-9160-d693b3ed41b5 /mnt

Der Befehl 'btrfs filesystem show' zeigt alle erkannten Dateisysteme an:

$ sudo btrfs filesystem show 
Label: 'mediafiles'  uuid: 243efbc4-5f72-4352-9160-d693b3ed41b5
        Total devices 2 FS bytes used 809.82GB
        devid    1 size 1.82TB used 817.03GB path /dev/sdd1
        devid    2 size 1.82TB used 817.01GB path /dev/sde1

Btrfs v0.19-102-g2482539

Es gibt jedoch eine kleine Stolperfalle. Soll das RAID-1-btrfs beim Booten automatisch eingehängt werden, so *müssen* alle Devices in der /etc/fstab eingetragen werden. Ansonsten meckert das System, da es nicht alle dazugehörigen Devices selbst finden kann, selbst wenn die UUID verwendet wird:

UUID=19aa7588-9694-4440-ae33-e5b8dc4030fa /media/mediafiles btrfs device=/dev/sdd1,device=/dev/sde1 0 0

Gefährlich ist dies vor allem bei Headless-Systemen, da im laufenden Betrieb die automatische Erkennung der Devices durchaus funktioniert und ein Eintrag ohne die 'device='-Optionen daher beim Testen durchaus funktionieren würde.

Nicht ganz einfach ist übrigens die Größe bzw. der freie Speicher des RAID-1-Dateisystems zu ermitteln:

$ df -h /media/mediafiles
Dateisystem            Größe Benut  Verf Ben% Eingehängt auf
/dev/sdd1             3,7T  1,6T  2,1T  44% /media/mediafiles

'df' zählt hier also einfach den gesamten und belegten Speicher aller Einzelpartitionen zusammen. Der Grund hierfür liegt, soweit ich das im Wiki verstanden habe, in einem Berechtigungsproblem: Um das Dateisystem als RAID-1 zu erkennen und die Größe damit korrekt anzugeben müsste df direkt darauf zugreifen, was ihm aber zumindest als normaler User nicht erlaubt ist. btrfs bringt daher sein eigenes 'df' mit:

$ sudo btrfs fi df /media/mediafiles
Data, RAID1: total=815.00GB, used=808.73GB
Data: total=8.00MB, used=0.00
System, RAID1: total=8.00MB, used=120.00KB
System: total=4.00MB, used=0.00
Metadata, RAID1: total=2.00GB, used=1.09GB
Metadata: total=8.00MB, used=0.00

Das Tool btrfs wird auch verwendet, um weitere Devices zum Raid hinzuzufügen, zu entfernen, Snapshots anzulegen oder das FS zu defragmentieren. Hiermit habe ich bisher aber noch nicht experimentiert, ggf. wird's einen Nachtrag geben. Erstmal werde ich nun das Verhalten im MythTV-Betrieb beobachten und vor allem auf die - subjektive - Performance im Vergleich zu ext4 achten. Links:

Comments

Ich hab die Platten zuerst per USB eingerichtet und bespielt, da ich die Downtime so gering wie möglich halten wollte. Kann dir daher nichts über die Geschwindigkeit der Einzelplatten sagen.

Hier mal ein paar Zahlen zum Raid:

Schreiben von /dev/zero:
3565158400 Bytes (3,6 GB) kopiert, 142,213 s, 25,1 MB/s

Lesen nach /dev/null:
3565158400 Bytes (3,6 GB) kopiert, 30,8911 s, 115 MB/s

Aber wie gesagt: Online-Test und ohne Vergleichmöglichkeiten, daher eher sehr begrente Aussagekraft.

Wie schauen denn die Lese-Benchmarks aus - schneller als eine Einzelplatte?

brtfs hat leider noch kein offizielles fertiges fsck tool womit es fuer mich nicht stabil genug ist ihm Daten anzuvertrauen. Benutze momentan FreeBSD+ZFS.

btw: raids am besten immer auf das raw device ohne partitionen wenn man die ganze platte nutzt dann stimmt das alignment der bloecke auch direkt. (z.b. bei 4k sector platten oder raidcontrollern mit bestimmten blocktransfergroessen)