Einstieg in BTRFS

Was ist BTRFS

BTFS - Better File System - ist ein neues Filesystem(Dateisystem) welches schon einige Jahre in Entwicklung ist und seit kurzem für die Produktions (mit Einschränkungen) freigegeben wurde. Es basiert auf had Rodeh's copy-on-write B-Baum und bringt effizienteres Speichermanagement und verbesserte Datenintegrität. Snapshots, integrierter RAID Support, Compression und Verschlüsselung wird es mit sich bringen.
In diesem Artikel versuche ich Ihnen, dieses Filesystem etwas näher zu bringen und das Design und Funktionsweise zu erläutern.

Viele kennen es, wenn man traditionelles Software Raid mittels mdadm oder schon dem neueren dmraid erstellte, musste man den LVM (Logical Volume Manager) verwenden um einen Storage Pool zu erzeugen. Darüber konnte man dann das eigentliche Filesystem legen, meist ein ext oder XFS Typ. Um alleine, sagen wir, mehr Platz im '/home' zu bekommen, musste man zuerst initialisieren, dann die Festplatte zur LVM Gruppe hinzufügen, dann jenes erweitern und erst dann kann man das Filesystem erweitern. BTRFS verspricht diesen Schmerz zu lindern:

btrfs device add <device> <file system>  

und das war's. Ebenso wird Snapshotting sehr viel einfacher.

Bit Rot

Bit Rot zu verstehen ist wichtig, ansonsten fragt man sich später, warum der Aufwand mit den Metadaten und Checksums betrieben wird, wenn man ja eh doch ein RAID hat?

BitRot zu deutsch verfaulendes Bit oder auch in der Umgangssprache auch als umgefallenes Bit bezeichnet die Änderung eines Datensegments ohne zutun oder Absicht des Systems oder Users. Somit kann, wenn die Daten nicht über eine Fehlertoleranz abgesichert sind irreparabel beschädigt sein. Dies möchte man vermeiden und kann BTRFS jetzt von Haus aus.

Was macht BTRFS besser?

BTRFS kann mehr als die von ext4 \"Softgrenze\" vorgegebenen 16TiB adressieren, BTRFS schafft um einiges mehr nämlich 16EiB das sind 16 Exbibyte oder auch 17.179.869.184 Gibibyte. BTRFS hat kein Journaling mehr, sprich der write-log fällt weg und das überprüfen eines Dateisystems wird um einiges beschleunigt. Zudem gibt es Snapshots, Copy on Write und Kompression. Auch SSDs werden von Grund auf besser Unterstützt.

BTRFS nutzen:

Ich habe mit der neuen Fedora 21 Server 64bit das BTRFS Volume erstellt und diesen Artikel geschrieben.

Ich habe 4 Disks verbaut (sda,sdb,sdc,sdd) wobei sda das System enthält. Mit dem Befehl lsblk kann man sich seine HardDrive Disks auflisten lassen.

[[email protected] ~]# lsblk
NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINT  
sda 8:0 0 8G 0 disk  
├─sda1 8:1 0 500M 0 part /boot
└─sda2 8:2 0 7,5G 0 part 
 ├─fedora--server-root 253:0 0 6,7G 0 lvm /
 └─fedora--server-swap 253:1 0 820M 0 lvm [SWAP]
sdb 8:16 0 8G 0 disk  
sdc 8:32 0 8G 0 disk  
sdd 8:48 0 8G 0 disk  
sr0 11:0 1 1024M 0 rom  
[[email protected] ~]#

Mit mkfs.btrfs können wir die Geräte sdb sdc und sdd zu einem Device zusammenfassen.

[[email protected] ~]# mkfs.btrfs /dev/sd[bcd]
Btrfs v3.17  
See http://btrfs.wiki.kernel.org for more information.

Turning ON incompat feature 'extref': increased hardlink limit per file to 65536  
adding device /dev/sdc id 2  
adding device /dev/sdd id 3  
fs created label (null) on /dev/sdb  
\u0009nodesize 16384 leafsize 16384 sectorsize 4096 size 24.00GiB
[[email protected] ~]#

Mittels btrfs filesystem show kann man sich die angelegten Filesystems, deren UUID und FS Version ausgeben lassen.

[[email protected] ~]# btrfs filesystem show
Label: none uuid: b7a12d8b-e839-49ab-86ca-25a60213dc4a  
\u0009Total devices 3 FS bytes used 112.00KiB
\u0009devid 1 size 8.00GiB used 1.82GiB path /dev/sdb
\u0009devid 2 size 8.00GiB used 827.19MiB path /dev/sdc
\u0009devid 3 size 8.00GiB used 1.81GiB path /dev/sdd

Btrfs v3.17  
[[email protected] ~]# 

Wir müssen jetzt nur noch das Filesystem richtig einhängen (mounten). Wir erstellen nun einen Einhängepunkt (mountpoint) - bestenfalls im Root Verzeichnis, kann aber jeder beliebiges Verzeichnis sein wie /mnt. Ich verwende /btrfs_mountpoint um einen klingenden Namen für diesen Arikel zu schaffen. (Einfach mkdir /btrfs_mountpoint in die Kommandozeile eintippen, denn unter Linux ist alles ein File auf ein Ordner oder wir wie es nennen ein Verzeichnis)

Der Mount-Prozess ist sehr einfach:

[[email protected] ~]# mount /dev/sdb /btrfs_mountpoint

Man könnte jede HDD verwenden, jedoch empfehle ich immer die erste zu verwenden. Erleichtert das suchen und verwirrt sein, wenn man die Historie nach Monaten durchhaut um ein Problem zu fixen.

Nun können wir mit df und den Switch -h für Human Readable mal nachsehen ob alles geklappt hat.

Dateisystem Größe Benutzt Verf. Verw% Eingehängt auf  
/dev/mapper/fedora--server-root 6,5G 1,1G 5,1G 18% /
devtmpfs 475M 0 475M 0% /dev  
tmpfs 485M 0 485M 0% /dev/shm  
tmpfs 485M 356K 485M 1% /run  
tmpfs 485M 0 485M 0% /sys/fs/cgroup  
tmpfs 485M 4,0K 485M 1% /tmp  
/dev/sda1 477M 90M 358M 21% /boot
tmpfs 97M 0 97M 0% /run/user/0  
/dev/sdb 24G 18M 21G 1% /btrfs_mountpoint
[[email protected] ~]# 

Wie sehen /dev/sdb 24G 18M 21G 1% /btrfs_mountpoint
die sdb Festplatte hat nun 24GB genau 3 mal 8GB der verbauten HDD's

Wichtig: hier haben wir nur Striping ohne Parität erstellt, sprich die Prüfsummen werden überprüft und auch versucht zu reparieren, jedoch können wir keinen Plattenausfall verkraften. Die Daten sind linear verteilt, die Metadaten sind gespiegelt.

Man kann jetzt von den 3 Disks eine Problemlos entfernen, falls man noch genug freien Speicher verfügt.

[[email protected] ~]# btrfs device delete /dev/sdc /btrfs_mountpoint/

Disk entfernen:

Ein weiteres können wir nicht entfernen, davor warnt uns aber das BTRFS Tool aber:

[[email protected] ~]# btrfs device delete /dev/sdd /btrfs_mountpoint/
ERROR: error removing the device '/dev/sdd' - unable to go below two devices on raid1  

Disk hinzufügen:

Auch Problemlos welche hinzufügen.

[[email protected] ~]# btrfs device add /dev/sdc /btrfs_mountpoint/

Ein kleiner Tipp: Man kann sich seine BTRFS Konfiguration ganz einfach anzeigen lassen und zwar mit diesem Befehl btrfs filesystem df /btrfs_mountpoint

Noch ein Tipp: man kann eine ungleiche Verteilung von Speicher auf der Disk mit einem btrfs filesystem balance /btrfs_mountpoint ausgleichen (versuchen).

BTRFS Raid-Konstellationen

# Dateisystem über 4 Geräte (Metadaten gespiegelt, Daten Linear Angeordnet)
mkfs.btrfs /dev/sdb /dev/sdc /dev/sdd /dev/sde

# Daten gestriped ohne Spiegelung
mkfs.btrfs -d raid0 /dev/sdb /dev/sdc

# Raid 10 für Metadaten und Daten 
mkfs.btrfs -m raid10 -d raid10 /dev/sdb /dev/sdc /dev/sdd /dev/sde

# Keine Duplikation von Metadaten auf einer Disk (standard bei SSDs)
mkfs.btrfs -m single /dev/sdb  

BTRFS Raid5/6

Wichtig: BTRFS Raid5/6 sind noch nicht STABLE, ich empfehle Ihnen nicht ein nicht stabiles Feature zu verwenden.

Wir gehen wieder von der Standard Konfiguration mit den 3 8GB Disks aus:

[[email protected] ~]# lsblk
NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINT  
sda 8:0 0 8G 0 disk  
├─sda1 8:1 0 500M 0 part /boot
└─sda2 8:2 0 7,5G 0 part 
 ├─fedora--server-root 253:0 0 6,7G 0 lvm /
 └─fedora--server-swap 253:1 0 820M 0 lvm [SWAP]
sdb 8:16 0 8G 0 disk  
sdc 8:32 0 8G 0 disk  
sdd 8:48 0 8G 0 disk  
sr0 11:0 1 1024M 0 rom  
[[email protected] ~]# 

Raid5

Ein Raid5 bietet genau `(Anzahl der Platten)*(kleinste Plattengröße)-(eine-Plattenkapazität): Hier in diesem Beispiel 3*8-8=16 Somit sollten wir am Ende 16GB an Speicherplatz beherbergen können. Mittels dem bekannten Befehl mkfs.btrfs können wir die Optionen -d für Daten und -m für Metadaten die Option raid5 mitgeben. Nicht das -f vergessen, da das Feature nicht STABLE ist.

mkdir /btrfs_mountpoint

Leider warnt uns BTRFS nicht, dass wir ein unstabiles Feature nutzen, aber man sollte auch bedenken, dass wir ein force Flag benützt haben um überhaupt ans Ziel zu kommen.

Wie können wieder mit die BTRFS Filesysteme anzeigen lassen.

[[email protected] ~]# mount /dev/sdb /btrfs_mountpoint

Wir mounten das System wieder: [[email protected] ~]# mount /dev/sdb /btrfs_mountpoint/ und können es benützen.

Wir sollten jetzt nicht mehr den df -h Befehl nützen um den freien Speicher einzusehen, sondern über das BTRFS Tool. btrfs fi df /btrfs_mountpoint
Das ergibt bei mir diesen Output:

df

Denn df -h gibt dieses aus:

-h nicht ganz die Wahrheit. Auch btrfs fi df /btrfs_mountpoint lügt \"ein wenig\".

Wie man eine kaputte Disk wechselt werde ich in einem anderen Beitrag erläutern. Genauso wie man Snapshots erstellt/löscht und verwaltet, da es doch ein wenig mehr wurde als gedacht.

Die Themen für den nächsten BTRFS Article wären:

  • BTRFS Raid Disk Replace
  • BTRFS Snapshots
  • BTRFS Benchmark
  • BTRFS Gotchas
  • Probleme mit BTRFS
  • Stabilität von Raid5/6