Btrfs - Die Grundlagen

Datum

Das Btrfs (B-tree FS, häufig ausgesprochen als „Butter FS“ oder „Better FS“) ist ein Copy-On-Write-Dateisystem, das von der Oracle Corporation seit 2007 als freie Software unter der GNU General Public License (GPL) für das Betriebssystem Linux und seit 2016, mit der Bezeichnung WinBtrfs, plattformübergreifend für Windows (ab Windows 7) sowie ReactOS entwickelt wird.
Wikipedia

Die Vor- und Nachteile von Btrfs

Vorteile:

  • integriertes RAID
  • Volume-Management
  • prüfsummenbasierten Schutz vor Datenübertragungsfehlern
  • Copy-On-Write
  • erweiterte Dateispeicherung (Dateigröße bis 2 64 Byte)
  • direkt erstellbare Snapshots des Dateisystems oder Teilen davon
  • Datenkompression
  • mehrere Wurzelverzeichnisse (Subvolume)
  • Umwandlung des RAID-Levels im laufenden Betrieb

Nachteile:

  • RAID 5 und RAID 6 noch nicht stabil

Erstellen des Dateisystems

Erstellen des Dateisystems mit 4 Platten:
Raid0
mkfs.btrfs -d raid0 /dev/sda /dev/sdb /dev/sdc /dev/sdd

Raid1
mkfs.btrfs -m raid1 -d raid1 /dev/sdb /dev/sdc /dev/sdd /dev/sde

-m gibt die Einstellung für die Metadaten an (hierbei ein Raid1)
-d gibt die Einstellung für die Daten an (hierbei ein Raid1)

Mögliche Parameter wäre: raid0, raid1, raid10, raid5, raid6, single und dup
single gibt an, dass es keine Vervielfältigung der Metadaten gibt
während bei dup Metadaten werden mehrfach gespeichert werden

Status überprüfen

Einen groben Überblick erhält man mit dem Befehl btrfs fi show

btrfs fi show
Label: none  uuid: 844659fb-8a7e-4430-ab87-f3a53ce19090
	Total devices 3 FS bytes used 3.37GiB
	devid    1 size 16.54GiB used 4.57GiB path /dev/sda2
	devid    2 size 20.00GiB used 0.00B path /dev/sdb1
	devid    3 size 20.00GiB used 0.00B path /dev/sdc1

Label: none uuid: 89affe30-1f13-4007-aa0f-af784159ad52 Total devices 1 FS bytes used 112.00KiB devid 1 size 20.00GiB used 2.02GiB path /dev/sdd1

Label: none uuid: 9772f57c-707e-4b9b-b5e8-c122f55270a2 Total devices 1 FS bytes used 112.00KiB devid 1 size 50.00GiB used 2.02GiB path /dev/sde1

Allerdings ist dies wohl bereits obsolet.

Wer es genau wissen will, sollte mal btrfs device stats / versuchen

# btrfs device stats /
[/dev/sda2].write_io_errs   0
[/dev/sda2].read_io_errs    0
[/dev/sda2].flush_io_errs   0
[/dev/sda2].corruption_errs 0
[/dev/sda2].generation_errs 0
[/dev/sdb1].write_io_errs   0
[/dev/sdb1].read_io_errs    0
[/dev/sdb1].flush_io_errs   0
[/dev/sdb1].corruption_errs 0
[/dev/sdb1].generation_errs 0
[/dev/sdc1].write_io_errs   0
[/dev/sdc1].read_io_errs    0
[/dev/sdc1].flush_io_errs   0
[/dev/sdc1].corruption_errs 0
[/dev/sdc1].generation_errs 0

Anmerkung: aufgrund der Metadaten und Snapshots welche Btrfs speichert ist ein df manchmal nicht ausreichend.
Man sollte hier btrfs filesystem df / nutzen

# btrfs filesystem df /
Data, single: total=4.01GiB, used=3.24GiB
System, DUP: total=32.00MiB, used=16.00KiB
Metadata, DUP: total=256.00MiB, used=111.20MiB
GlobalReserve, single: total=16.00MiB, used=0.00B

Btrfs ausbalancieren

Ein Vorteil an Btrfs ist, dass man unterschiedlich große Festplatten zu einer RAID-Konstellation nach Wahl zusammenschließen kann.
Nach jedem hinzufügen sollte das Dateisystem ausbalanciert werden, dabei verteilt Btrfs die Daten und Meta so gleich wie möglich auf die vorhandenen Festplatten.

# btrfs balance start /
WARNING:

	Full balance without filters requested. This operation is very
	intense and takes potentially very long. It is recommended to
	use the balance filters to narrow down the balanced data.
	Use 'btrfs balance start --full-balance' option to skip this
	warning. The operation will start in 10 seconds.
	Use Ctrl-C to stop it.
10 9 8 7 6 5 4 3 2 1
Starting balance without any filters.
Done, had to relocate 8 out of 8 chunks

Nun noch überprüfen ob alles geklappt hat…

# btrfs fi show
Label: none  uuid: 844659fb-8a7e-4430-ab87-f3a53ce19090
	Total devices 3 FS bytes used 3.37GiB
	devid    1 size 16.54GiB used 0.00B path /dev/sda2
	devid    2 size 20.00GiB used 4.03GiB path /dev/sdb1
	devid    3 size 20.00GiB used 4.03GiB path /dev/sdc1

Ändern des RAID-Levels

Der entsprechende Befehl sieht wie folgt aus:
btrfs balance start \
-dconvert=[data raid level] \ #Angabe des RAID-Levels für die Daten
-mconvert=[metadata raid level] \ #Angabe des RAID-Levels für die Metadaten
[btrfs mount point]

Um aus den 3 Platten (16,5 GiB, 20 GiB, 20GiB) ein RAID1 für die Daten als auch die Metadaten zu bauen verwendet man:

 # btrfs balance start -dconvert=raid1 -mconvert=raid1 /
Done, had to relocate 7 out of 7 chunks

Nun haben sich die Daten wie folgt verteilt:

Total devices 3 FS bytes used 3.37GiB
	devid    1 size 16.54GiB used 2.00GiB path /dev/sda2
	devid    2 size 20.00GiB used 4.03GiB path /dev/sdb1
	devid    3 size 20.00GiB used 4.03GiB path /dev/sdc1
# btrfs filesystem df /
        Data, RAID1: total=4.00GiB, used=3.91GiB
        System, RAID1: total=32.00MiB, used=16.00KiB
        Metadata, RAID1: total=1.00GiB, used=112.64MiB
        GlobalReserve, single: total=16.00MiB, used=0.00B

Ein Befehl für Umwandlung in RAID0 für die Daten und ein RAID1 für die Metadaten:

# btrfs balance start -dconvert=raid0 -mconvert=raid1 /
Done, had to relocate 6 out of 6 chunks
# btrfs filesystem df /
Data, RAID0: total=12.00GiB, used=3.91GiB
System, RAID1: total=32.00MiB, used=16.00KiB
Metadata, RAID1: total=1.00GiB, used=112.97MiB
GlobalReserve, single: total=16.00MiB, used=0.00B

Hinzufügen weiterer Festplatten

Eine weitere Festplatte fügt man ganz einfach mit btrfs device add hinzu, vorher schauen wir uns noch einmal den aktuellen Status an:

# btrfs filesystem show
Label: none  uuid: 844659fb-8a7e-4430-ab87-f3a53ce19090
	Total devices 3 FS bytes used 4.02GiB
	devid    1 size 16.54GiB used 4.00GiB path /dev/sda2
	devid    2 size 20.00GiB used 5.03GiB path /dev/sdb1
	devid    3 size 20.00GiB used 5.03GiB path /dev/sdc1

Label: none  uuid: 89affe30-1f13-4007-aa0f-af784159ad52
	Total devices 1 FS bytes used 112.00KiB
	devid    1 size 20.00GiB used 2.02GiB path /dev/sdd1

Label: none  uuid: 9772f57c-707e-4b9b-b5e8-c122f55270a2
	Total devices 1 FS bytes used 112.00KiB
	devid    1 size 50.00GiB used 2.02GiB path /dev/sde1

# btrfs device add -f /dev/sde1 /

# nun prüfen wir wieder den aktuellen Status

# btrfs filesystem show
Label: none  uuid: 844659fb-8a7e-4430-ab87-f3a53ce19090
	Total devices 4 FS bytes used 4.02GiB
	devid    1 size 16.54GiB used 4.00GiB path /dev/sda2
	devid    2 size 20.00GiB used 5.03GiB path /dev/sdb1
	devid    3 size 20.00GiB used 5.03GiB path /dev/sdc1
	devid    4 size 50.00GiB used 0.00B path /dev/sde1

Label: none  uuid: 89affe30-1f13-4007-aa0f-af784159ad52
	Total devices 1 FS bytes used 112.00KiB
	devid    1 size 20.00GiB used 2.02GiB path /dev/sdd1

und nun sollte das Dateisystem noch ausbalanciert werden…

# btrfs balance /
...
# btrfs filesystem show
Label: none  uuid: 844659fb-8a7e-4430-ab87-f3a53ce19090
	Total devices 4 FS bytes used 4.02GiB
	devid    1 size 16.54GiB used 1.00GiB path /dev/sda2
	devid    2 size 20.00GiB used 1.03GiB path /dev/sdb1
	devid    3 size 20.00GiB used 2.00GiB path /dev/sdc1
	devid    4 size 50.00GiB used 2.03GiB path /dev/sde1

Entfernen von Festplatten aus dem RAID

Das entfernen passiert entsprechend mit dem btrfs device delete Befehl:

# aktueller Status 
# btrfs filesystem show
Label: none  uuid: 844659fb-8a7e-4430-ab87-f3a53ce19090
	Total devices 4 FS bytes used 4.02GiB
	devid    1 size 16.54GiB used 1.00GiB path /dev/sda2
	devid    2 size 20.00GiB used 1.03GiB path /dev/sdb1
	devid    3 size 20.00GiB used 2.00GiB path /dev/sdc1
	devid    4 size 50.00GiB used 2.03GiB path /dev/sde1

Label: none  uuid: 89affe30-1f13-4007-aa0f-af784159ad52
	Total devices 1 FS bytes used 112.00KiB
	devid    1 size 20.00GiB used 2.02GiB path /dev/sdd1

# btrfs device delete /dev/sdb1 /

# der neue Status
# btrfs filesystem show
Label: none  uuid: 844659fb-8a7e-4430-ab87-f3a53ce19090
	Total devices 3 FS bytes used 4.03GiB
	devid    1 size 16.54GiB used 2.00GiB path /dev/sda2
	devid    3 size 20.00GiB used 3.03GiB path /dev/sdc1
	devid    4 size 50.00GiB used 3.03GiB path /dev/sde1

Scrub und Defragmentieren

Beim Scrub geht Btrfs noch einmal alle Dateien auf dem System durch, bildet die entsprechenden Checksumme und vergleicht diese mit der gespeicherten Checksumme. Sollten Unstimmigkeiten auftauchen repariert sich Btrfs entsprechend.

Einen Scrub startet man wie folgt:

# btrfs scrub start /
scrub started on /, fsid 844659fb-8a7e-4430-ab87-f3a53ce19090 (pid=4482)

Während dieser läuft kann man sich auch den aktuellen Status anzeigen lassen:

# btrfs scrub status /
scrub status for 844659fb-8a7e-4430-ab87-f3a53ce19090
	scrub started at Thu Feb  8 22:55:12 2018, running for 00:01:24
	total bytes scrubbed: 9.69GiB with 0 errors

Unter Defragmentierung versteht man die mit speziellen Programmen durchführbare Neuordnung von fragmentierten Datenblöcken auf dem Speichermedium, so dass logisch zusammengehörige Datenblöcke möglichst aufeinanderfolgend auf dem Datenträger abgelegt werden. Dies kann den sequentiellen Zugriff beschleunigen und damit die Arbeitsgeschwindigkeit des gesamten Systems erhöhen. (Wikipedia)

Dazu dient der Befehl: # btrfs filesystem defragment /

Autor
Kategorien Btrfs, Linux

PRTG Map