Btrfs/Multidisk
Multidisk
Grundlagen
Wie oben unter Dateisystem und Geräte erläutert, spricht ein btrfs-Dateisystem im Hintergrund immer einen Pool von Geräten an und verhält sich in dieser Hinsicht ähnlich Vorlage:Deb
- Die Strategie, wie Daten auf Geräte verteilt werden, wird über die Chunk Profiles festgelegt
- Die Profile können zur Laufzeit und auch auf einem eingehängten Dateisystem gewechselt werden
RAID0/1
Single mit zwei Geräten
In der Ausgangssituation liegt ein btrfs-Dateisystem auf /dev/sda1 vor, das als Wurzeldateisystem gemountet ist
- Die Platte ist 8 GB groß; ein Teil der Kapazität wird für Swap auf /dev/sda2 verwendet
root@demo:~# df -h / Dateisystem Größe Benutzt Verf
- Verw% Eingehängt auf
/dev/sda1 7,0G 949M 5,5G 15% / root@demo:~# btrfs filesystem show / Label: none uuid: c6325d8f-955b-455a-90b8-69ca095f6bf0 Total devices 1 FS bytes used 902.12MiB devid 1 size 7.00GiB used 2.13GiB path /dev/sda1
Da es sich um ein frisch installiertes Minimalsystem in einer virtuellen Maschine handelt, ist das Dateisystem größtenteils leer und nur wenige Chunks sind belegt
root@demo:~# btrfs filesystem df / Data, single: total=1.41GiB, used=872.05MiB System, DUP: total=8.00MiB, used=16.00KiB Metadata, DUP: total=358.31MiB, used=30.06MiB GlobalReserve, single: total=16.00MiB, used=0.00B
Nun „bauen“ wir eine weitere virtuelle Festplatte von 8 GB Größe ein und erzeugen eine Partition /dev/sdb1, die die komplette Platte in Beschlag nimmt, legen darauf aber kein Dateisystem an
- Statt dessen fügen wir /dev/sdb1 zum Wurzeldateisystem hinzu
root@demo:~# btrfs device add /dev/sdb1 /
Als Ergebnis erhalten wir ein um 8 GB vergrößertes btrfs-Dateisystem:
root@demo:~# df -h / Dateisystem Größe Benutzt Verf
- Verw% Eingehängt auf
/dev/sda1 15G 949M 14G 7% /
Wir sehen, dass das neue Gerät dem Dateisystem zugehört, aber noch keine Daten abgelegt sind:
root@demo:~# btrfs filesystem show / Label: none uuid: c6325d8f-955b-455a-90b8-69ca095f6bf0 Total devices 2 FS bytes used 902.12MiB devid 1 size 7.00GiB used 2.13GiB path /dev/sda1 devid 2 size 8.00GiB used 0.00B path /dev/sdb1
Die Chunks werden allerdings nicht als RAID0 abgelegt, sondern unverändert in den Profilen Single und DUP
root@demo:~# btrfs filesystem df / Data, single: total=1.41GiB, used=872.05MiB System, DUP: total=8.00MiB, used=16.00KiB Metadata, DUP: total=358.31MiB, used=30.06MiB GlobalReserve, single: total=16.00MiB, used=0.00B
Wechsel auf RAID0
Nun stellen wir die Data Chunks auf RAID0 um
- Am Speicherplatz wird das nichts ändern, allerdings wird btrfs die Chunks dann intern anders allokieren und ein Striping (d.h
- eine Verteilung auf beide physikalischen Geräte) anwenden
root@demo:~# btrfs balance start -dconvert=raid0 / Done, had to relocate 3 out of 5 chunks
btrfs meldet eine Umgliederung der Chunks
- Der Speicherplatz ist erwartungsgemäß unverändert:
root@demo:~# df -h / Dateisystem Größe Benutzt Verf
- Verw% Eingehängt auf
/dev/sda1 15G 949M 12G 8% /
Die umgegliederten Chunks tauchen auf dem neuen Gerät auf:
root@demo:~# btrfs filesystem show / Label: none uuid: c6325d8f-955b-455a-90b8-69ca095f6bf0 Total devices 2 FS bytes used 902.47MiB devid 1 size 7.00GiB used 2.96GiB path /dev/sda1 devid 2 size 8.00GiB used 2.25GiB path /dev/sdb1
Die Chunks sind nun in den Profilen RAID0 und DUP abgelegt:
root@demo:~# btrfs filesystem df / Data, RAID0: total=4.50GiB, used=872.17MiB System, DUP: total=8.00MiB, used=16.00KiB Metadata, DUP: total=358.31MiB, used=30.28MiB GlobalReserve, single: total=16.00MiB, used=0.00B
Wechsel auf RAID1
Jetzt stellen wir auf RAID1 um:
root@demo:~# btrfs balance start -dconvert=raid1 -mconvert=raid1 / Done, had to relocate 5 out of 5 chunks
Die Größe des Dateisystems entspricht nun dem des kleineren Geräts:
root@demo:~# df -h / Dateisystem Größe Benutzt Verf
- Verw% Eingehängt auf
/dev/sda1 7,5G 919M 5,9G 14% /
Beide Geräte sind identisch belegt, da Chunks nun identisch auf beide Geräte geschrieben werden:
root@demo:~# btrfs filesystem show / Label: none uuid: c6325d8f-955b-455a-90b8-69ca095f6bf0 Total devices 2 FS bytes used 902.26MiB devid 1 size 7.00GiB used 3.28GiB path /dev/sda1 devid 2 size 8.00GiB used 3.28GiB path /dev/sdb1
Bis auf die Global Reserve werden nun alle Chunks im Profil RAID1 abgelegt:
root@demo:~# btrfs filesystem df / Data, RAID1: total=3.00GiB, used=872.05MiB System, RAID1: total=32.00MiB, used=16.00KiB Metadata, RAID1: total=256.00MiB, used=30.19MiB GlobalReserve, single: total=16.00MiB, used=0.00B
Sollte der balance-Vorgang unterbrochen werden, so kann er folgendermaßen fortgesetzt werden:
root@demo:~# btrfs balance start -dconvert=raid1,soft -mconvert=raid1,soft /
Die Angabe soft bewirkt, dass ausschließlich noch nicht konvertierte Chunks umgestellt werden
Umgekehrte Wechsel
Und nun drehen wir das Ganze zurück auf RAID0:
root@demo:~# btrfs balance start -dconvert=raid0 -mconvert=dup / Done, had to relocate 5 out of 5 chunks root@demo:~# df -h / Dateisystem Größe Benutzt Verf
- Verw% Eingehängt auf
/dev/sda1 15G 949M 14G 7% / root@demo:~# btrfs filesystem show / Label: none uuid: c6325d8f-955b-455a-90b8-69ca095f6bf0 Total devices 2 FS bytes used 901.82MiB devid 1 size 7.00GiB used 2.25GiB path /dev/sda1 devid 2 size 8.00GiB used 2.56GiB path /dev/sdb1
root@demo:~# btrfs filesystem df / Data, RAID0: total=4.50GiB, used=871.57MiB System, DUP: total=32.00MiB, used=16.00KiB Metadata, DUP: total=128.00MiB, used=30.23MiB GlobalReserve, single: total=16.00MiB, used=0.00B
Noch ein Schritt zurück zu Single/DUP:
root@demo:~# btrfs balance start -dconvert=single / Done, had to relocate 3 out of 5 chunks root@demo:~# df -h / Dateisystem Größe Benutzt Verf
- Verw% Eingehängt auf
/dev/sda1 15G 948M 14G 7% / root@demo:~# btrfs filesystem show / Label: none uuid: c6325d8f-955b-455a-90b8-69ca095f6bf0 Total devices 2 FS bytes used 901.78MiB devid 1 size 7.00GiB used 1.00GiB path /dev/sda1 devid 2 size 8.00GiB used 2.31GiB path /dev/sdb1
root@demo:~# btrfs filesystem df / Data, single: total=3.00GiB, used=871.58MiB System, DUP: total=32.00MiB, used=16.00KiB Metadata, DUP: total=128.00MiB, used=30.19MiB GlobalReserve, single: total=16.00MiB, used=0.00B
Und jetzt nehmen wir /dev/sdb1 wieder weg:
root@demo:~# btrfs device remove /dev/sdb1 / root@demo:~# df -h / Dateisystem Größe Benutzt Verf
- Verw% Eingehängt auf
/dev/sda1 7,0G 948M 5,9G 14% / root@demo:~# btrfs filesystem show / Label: none uuid: c6325d8f-955b-455a-90b8-69ca095f6bf0 Total devices 1 FS bytes used 901.51MiB devid 1 size 7.00GiB used 1.72GiB path /dev/sda1
root@demo:~# btrfs filesystem df / Data, single: total=1.41GiB, used=871.37MiB System, DUP: total=32.00MiB, used=16.00KiB Metadata, DUP: total=128.00MiB, used=30.12MiB GlobalReserve, single: total=16.00MiB, used=0.00B
Verschlüsseltes Multidisk
Da btrfs keine Verschlüsselung auf Ebene des Dateisystems bietet, müssen die verwendeten Blockgeräte verschlüsselt werden
- Dies ist bspw
- bei RAID1 etwas ineffizient, weil geschriebene und gelesene Daten dadurch zweifach ver- bzw
- entschlüsselt werden müssen
Zunächst erzeugt man mit fdisk zwei Partitionen, die verschlüsselt werden sollen
- Danach legt man für diese Schlüssel an:
# mkdir /etc/cryptsetup-keys.d # chmod 0700 /etc/cryptsetup-keys.d/ # dd bs=1024 count=4 if=/dev/random of=/etc/cryptsetup-keys.d/sdc1_crypt.key 4+0 Datensätze ein 4+0 Datensätze aus 4096 Bytes (4,1 kB, 4,0 KiB) kopiert, 0,000479491 s, 8,5 MB/s # dd bs=1024 count=4 if=/dev/random of=/etc/cryptsetup-keys.d/sdd1_crypt.key 4+0 Datensätze ein 4+0 Datensätze aus 4096 Bytes (4,1 kB, 4,0 KiB) kopiert, 0,000214758 s, 19,1 MB/s # chmod 0400 /etc/cryptsetup-keys.d/sdc1_crypt.key /etc/cryptsetup-keys.d/sdd1_crypt.key
Danach werden die beiden Partitionen damit verschlüsselt:
# cryptsetup luksFormat /dev/sdc1 /etc/cryptsetup-keys.d/sdc1_crypt.key # cryptsetup luksFormat /dev/sdc1 /etc/cryptsetup-keys.d/sdd1_crypt.key
Danach ermittelt man deren UUID:
# lsblk -f NAME FSTYPE FSVER LABEL UUID FSAVAIL FSUSE% MOUNTPOINT sda
sdc └─sdc1 crypto_LUKS 2 04ccf51d-23a8-420e-8d4e-53585947d8e9 sdd └─sdd1 crypto_LUKS 2 b8caa7ce-2097-4a90-a3a5-134c20fb4359
In der /etc/crypttab trägt man folgendes ein:
# <target name> <source device> <key file> <options> sdc1_crypt UUID=04ccf51d-23a8-420e-8d4e-53585947d8e9 none luks sdd1_crypt UUID=b8caa7ce-2097-4a90-a3a5-134c20fb4359 none luks
Beim Booten werden die Partitionen automatisch entschlüsselt und anschließend kann das Dateisystem ganz normal über die fstab gemountet werden
Durch die Verwendung von UUID können die Festplatten nachträglich beliebig umgesteckt werden
- Anstelle von sdc1_crypt und sdd1_crypt können also auch andere Namen gewählt werden
Wenn man direkt mit dem Erzeugen des Dateisystem fortfahren will, müssen die Partitionen einmalig von Hand entschlüsselt werden:
# cryptsetup luksOpen --key-file /etc/cryptsetup-keys.d/sdc1_crypt.key /dev/sdc1 sdc1_crypt # cryptsetup luksOpen --key-file /etc/cryptsetup-keys.d/sdd1_crypt.key /dev/sdd1 sdd1_crypt
Danach kann das Dateisystem angelegt werden, hier am Beispiel eines RAID1:
# mkfs.btrfs -d raid1 -m raid1 /dev/mapper/sdc1_crypt /dev/mapper/sdd1_crypt
RAID5
Single mit drei Geräten
Wir beginnen damit, dass wir dem Wurzeldateisystem zwei Partitionen hinzufügen
- Die Profile der Chunks bleiben zunächst unverändert
root@demo:~# btrfs filesystem show / Label: none uuid: c6325d8f-955b-455a-90b8-69ca095f6bf0 Total devices 1 FS bytes used 901.70MiB devid 1 size 7.00GiB used 1.72GiB path /dev/sda1 root@demo:~# btrfs device add /dev/sdb1 /dev/sdc1 / root@demo:~# df -h / Dateisystem Größe Benutzt Verf
- Verw% Eingehängt auf
/dev/sda1 23G 948M 22G 5% / root@demo:~# btrfs filesystem show / Label: none uuid: c6325d8f-955b-455a-90b8-69ca095f6bf0 Total devices 3 FS bytes used 901.70MiB devid 1 size 7.00GiB used 1.72GiB path /dev/sda1 devid 2 size 8.00GiB used 0.00B path /dev/sdb1 devid 3 size 8.00GiB used 0.00B path /dev/sdc1
root@demo:~# btrfs filesystem df / Data, single: total=1.41GiB, used=871.54MiB System, DUP: total=32.00MiB, used=16.00KiB Metadata, DUP: total=128.00MiB, used=30.14MiB GlobalReserve, single: total=16.00MiB, used=0.00B
Umstellung auf RAID5
Nun stellen wir Data- und Metadata-Chunks auf RAID5 um
- Die System-Chunks werden automatisch angepasst:
root@demo:~# btrfs balance start -dconvert=raid5 -mconvert=raid5 / Done, had to relocate 4 out of 4 chunks
df zeigt unzuverlässige Ergebnisse an
root@demo:~# df -h / Dateisystem Größe Benutzt Verf
- Verw% Eingehängt auf
/dev/sda1 23G 919M 20G 5% /
Die Geräte sind nun alle belegt und die Chunk sind alle im Profil RAID5 gespeichert
root@demo:~# btrfs filesystem show / Label: none uuid: c6325d8f-955b-455a-90b8-69ca095f6bf0 Total devices 3 FS bytes used 901.99MiB devid 1 size 7.00GiB used 2.16GiB path /dev/sda1 devid 2 size 8.00GiB used 2.16GiB path /dev/sdb1 devid 3 size 8.00GiB used 2.16GiB path /dev/sdc1
root@demo:~# btrfs filesystem df / Data, RAID5: total=4.00GiB, used=871.79MiB System, RAID5: total=64.00MiB, used=16.00KiB Metadata, RAID5: total=256.00MiB, used=30.19MiB GlobalReserve, single: total=16.00MiB, used=0.00B
Zurück auf RAID1
Da RAID5 kaputt ist und wir den Platz nicht brauchen, stellen wir auf RAID1 um und entnehmen eine Platte
root@demo:~# btrfs balance start -dconvert=raid1 -mconvert=raid1 / Done, had to relocate 4 out of 4 chunks root@demo:~# btrfs device remove /dev/sdc1 / root@demo:~# df -h / Dateisystem Größe Benutzt Verf
- Verw% Eingehängt auf
/dev/sda1 7,5G 918M 5,9G 14% / root@demo:~# btrfs filesystem show / Label: none uuid: c6325d8f-955b-455a-90b8-69ca095f6bf0 Total devices 2 FS bytes used 901.70MiB devid 1 size 7.00GiB used 1.28GiB path /dev/sda1 devid 2 size 8.00GiB used 1.28GiB path /dev/sdb1
root@demo:~# btrfs filesystem df / Data, RAID1: total=1.00GiB, used=871.54MiB System, RAID1: total=32.00MiB, used=16.00KiB Metadata, RAID1: total=256.00MiB, used=30.14MiB GlobalReserve, single: total=16.00MiB, used=0.00B
Festplatte tauschen
Die Platte eines RAID-Verbundes lässt sich über btrfs-replace austauschen
- In der Ausgangssituation sei ein RAID1 gegeben:
root@demo:~# btrfs filesystem show / Label: none uuid: c6325d8f-955b-455a-90b8-69ca095f6bf0 Total devices 2 FS bytes used 1.09GiB devid 1 size 7.00GiB used 2.28GiB path /dev/sda1 devid 2 size 8.00GiB used 2.28GiB path /dev/sdb1
Man beachte, dass es sich hier um ein „schlampiges” RAID1 handelt, das aus Partitionen unterschiedlicher Größe zusammengesetzt ist
- Nun wird eine wie sdb partitionierte Platte sdc angeschlossen (auf sdc1 darf kein Dateisystem vorhanden sein) und der Austausch gestartet:
root@demo:~# btrfs replace start /dev/sdb1 /dev/sdc1 /
Der Austausch arbeitet im Hintergrund; der Fortschritt lässt sich über btrfs replace status überwachen
- Nach Abschluss des Vorgangs ist sdb1 aus dem Verband entfernt:
root@demo:~# btrfs filesystem show / Label: none uuid: c6325d8f-955b-455a-90b8-69ca095f6bf0 Total devices 2 FS bytes used 1.09GiB devid 1 size 7.00GiB used 2.56GiB path /dev/sda1 devid 2 size 8.00GiB used 2.56GiB path /dev/sdc1