Zum Inhalt springen

Btrfs/Multidisk

Aus Foxwiki
Version vom 5. September 2025, 22:09 Uhr von Dirkwagner (Diskussion | Beiträge) (Dirkwagner verschob die Seite Btrfs/Debian/Multidisk nach Btrfs/Multidisk, ohne dabei eine Weiterleitung anzulegen)
(Unterschied) ← Nächstältere Version | Aktuelle Version (Unterschied) | Nächstjüngere Version → (Unterschied)

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

Vorlage:Hinweis

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

Vorlage:Hinweis

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

Vorlage:Warnung

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

Vorlage:Warnung

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