Debian mit Btrfs-Subvolumes

  Martin Brodbeck   Lesezeit: 6 Minuten Auf Mastodon ansehen

Der Debian-Installer unterstützt zwar das Btrfs-Dateisystem, jedoch keine Subvolumes. Der Artikel zeigt, wie man dem Installer diese dennoch unterjubelt.

debian mit btrfs-subvolumes

Wenn man nicht gerade RAID5 oder ähnliches haben möchte, ist das Dateisystem Btrfs besser als sein Ruf. Auch ich verwende es seit Jahren völlig problemlos. Besonders praktisch sind dessen Subvolumes. Ist zum Beispiel das /home ein solches, kann man davon schnell einen Snapshot machen, hat also einen definierten Zustand, von dem man dann in aller Ruhe ein Backup machen kann. Näheres dazu, wie so ein Backupsetup aussehen kann, kann man in dem Artikel über restic nachlesen.

Doch leider wird das Erstellen von Subvolumes vom Debian-Installer nicht unterstützt. Wählt man im Installationsschritt Festplatten partitionieren für eine Partition Btrfs aus, kann man diese nur beispielsweise nach "/" einhängen und es wird hinter den Kulissen einfach das Subvolume @rootfs erstellt. Man kann das nicht weiter beeinflussen, also keine zusätzlichen Subvolumes anlegen.

Expert install

Auf den ersten Blick lässt sich da auch nicht viel machen, denn nach dem Partitionieren rennt gleich die Installation des Basissystems los. Doch zum Glück kann man Debian auch im Expertenmodus installieren. In diesem Modus gibt es mehr Zwischenschritte und u.a. nach der Partitionierung hat man noch Gelegenheit, einzugreifen.

Bootet man also vom Installationsstick, wählt man Expert install aus. Ob grafisch oder textbasiert, sollte keine Rolle spielen.


Expert install

Die Installationsschritte kann man zunächst ganz normal abarbeiten und im Zweifel die Vorgaben akzeptieren. Spannend wird es dann beim Schritt Festplatten partitionieren, wo man natürlich Manuell auswählt und erst mal eine neue Partitionstabelle (gpt) erstellt. Anschließend erstellt man die gewünschten Partitionen. Der folgende Screenshot zeigt beispielhaft ein recht minimalistisches Partitionslayout.


Partitionslayout

Neben einer winzigen EFI- und einer kleinen /boot-Partition wurde eine große Btrfs-Partition erstellt und zunächst unter "/" eingehängt. Man kann den Vorgang nun mit Partitionierung beenden und Änderungen übernehmen abschließen. Eine etwaige Warnung bzgl. fehlender Swap-Partition kann ignoriert werden.

Konsole, Teil 1

Achtung #1: Nachdem die Änderungen auf die Festplatte geschrieben wurden, darf man jetzt noch nicht mit dem Schritt Basissystem installieren fortfahren!

Stattdessen wechselt man auf eine Konsole (ALT-F2) und hängt die unter /target gemounteten Partitionen wieder aus:

~ # umount /target/boot/efi
~ # umount /target/boot
~ # umount /target

Anschließend hängt man die Btrfs-Partition unter /mnt ein und richtet die gewünschten Subvolumes ein. Bei der Gelegenheit habe ich @rootfs in @ umbenannt (muss man aber nicht machen).

~ # mount /dev/vda3 /mnt
~ # mv /mnt/@rootfs /mnt/@
~ # btrfs subvolume create /mnt/@home
~ # btrfs subvolume create /mnt/@var_cache
~ # btrfs subvolume create /mnt/@var_home
~ # umount /mnt

So gerüstet, kann man die Partitionen bzw. Subvolumes wieder nach /target einhängen. Dabei sind fehlende Verzeichnisse, in die die Subvolumes eingehängt werden sollen, vorab zu erstellen:

~ # mount -o subvol=@,noatime,compress=zstd:3 /dev/vda3 /target
~ # mkdir /target/home
~ # mkdir -p /target/var/log
~ # mkdir /target/var/cache
~ # mount -o subvol=@home,noatime,compress=zstd:3 /dev/vda3 /target/home
~ # mount -o subvol=@var_cache,noatime,compress=zstd:3 /dev/vda3 /target/var/cache
~ # mount -o subvol=@var_log,noatime,compress=zstd:3 /dev/vda3 /target/var/log
~ # mount /dev/vda2 /target/boot
~ # mount /dev/vda1 /target/boot/efi

Damit haben wir dem Installer die Subvolumes untergejubelt und die Installation kann mit dem nächsten Schritt fortgeführt werden. Man wechselt also wieder auf den Installer (ALT-F1) und wählt Basissystem installieren aus.

Konsole, Teil 2

Achtung #2: Wenn das Basissystem fertig installiert ist, muss nochmals in die Konsole gewechselt werden. Jetzt müssen nämlich noch die Einhängepunkte in der Datei /target/etc/fstab – die nicht an unser Paritionslayout angepasst wurde – berichtigt werden.

In der Konsole steht leider nur der nano-Editor zur Verfügung. Am besten geht man in die Zeile, in der das (nicht mehr vorhandene) @rootfs gemountet wird, korrigiert den Eintrag und gibt dabei auch gleich die anderen Mountoptionen (compress usw.) an. Anschließend kann die Zeile mit STRG-K ausgeschnitten und mit STRG-U mehrmals eingefügt werden. Somit können die restlichen Einträge bequem angepasst werden. Zum Schluss wird noch mit STRG-O gespeichert und mit STRG-X der Editor verlassen. /target/etc/fstab könnte jetzt so aussehen:

#
#                
# / was on /dev/vda3 during installation
UUID=71a53df6-f189-462e-8cd4-0044946dfc4e /           btrfs   defaults,noatime,compress=zstd,subvol=@          0       0
UUID=71a53df6-f189-462e-8cd4-0044946dfc4e /home       btrfs   defaults,noatime,compress=zstd,subvol=@home      0       0
UUID=71a53df6-f189-462e-8cd4-0044946dfc4e /var/cache  btrfs   defaults,noatime,compress=zstd,subvol=@var_cache 0       0
UUID=71a53df6-f189-462e-8cd4-0044946dfc4e /var/log    btrfs   defaults,noatime,compress=zstd,subvol=@var_log   0       0

# /boot was on /dev/vda2 during installation
UUID=062eb351-7b75-487b-bb37-5367b6d9e830 /boot       ext4    defaults        0       2
# /boot/efi was on /dev/vda1 during installation
UUID=FDB0-BB46  /boot/efi                             vfat    umask=0077      0       1
/dev/sr0        /media/cdrom0   udf,iso9660 user,noauto     0       0

Das wars. Die Installation kann nun (mit Paketmanager konfigurieren) fortgesetzt und abgeschlossen werden. Ich habe GNOME installiert und wurde somit nach Abschluss der Installation vom GDM begrüßt


GDM

Öffnet man eine Konsole und gibt findmnt /dev/vda3 ein, sieht man, dass alles geklappt hat und die Subvolumes korrekt eingehängt wurden:

martin@debtest:~$ findmnt /dev/vda3
TARGET     SOURCE                 FSTYPE OPTIONS
/          /dev/vda3[/@]          btrfs  rw,noatime,compress=zstd:3,discard=async,space_cache=v2,subvolid=256,subvol=/@
/home      /dev/vda3[/@home]      btrfs  rw,noatime,compress=zstd:3,discard=async,space_cache=v2,subvolid=257,subvol=/@home
/var/log   /dev/vda3[/@var_log]   btrfs  rw,noatime,compress=zstd:3,discard=async,space_cache=v2,subvolid=258,subvol=/@var_log
/var/cache /dev/vda3[/@var_cache] btrfs  rw,noatime,compress=zstd:3,discard=async,space_cache=v2,subvolid=259,subvol=/@var_cache

Optional: Swapfile

Oben sind wir bei der Installation über die Warnung, dass keine Swap-Partition angegeben wurde, großzügig hinweggegangen. Das kann jetzt nachgeholt werden. Man mountet einfach direkt /dev/vda3 nach /mnt und erstellt das Subvolume @swap. Anschließend hängt man es nach /swap ein:

# mount /dev/vda3 /mnt
# btrfs subvolume create /mnt/@swap
# mkdir /swap
# mount -o subvol=@swap /swap

Seit btrfs-progs 6.1 ist es sehr einfach, ein entsprechendes Swapfile zu erstellen – hier mit 4 GB Größe:

# btrfs filesystem mkswapfile --size 4g --uuid clear /swap/swapfile
create swapfile /swap/swapfile size 4.00GiB (4294967296)
# swapon /swap/swapfile

Dabei wird swapfile automatisch das Attribut NODATACOW zugewiesen und somit Copy-on-write abgeschaltet. Jetzt müssen lediglich noch die entsprechenden Einträge in /etc/fstab/ hinzugefügt werden:

[…]
UUID=71a53df6-f189-462e-8cd4-0044946dfc4e /swap   btrfs   defaults,subvol=@swap     0  0

/swap/swapfile                            none    swap    defaults                  0  0
[…]

Fertig. Wir haben jetzt ein Debiansystem mit Btrfs-Subvolumes aufgesetzt. Mit Btrfs-Mitteln haben wir außerdem ein Swapfile erstellt und eingebunden. 

Quellen

Tags

Debian, btrfs

Es wurden noch keine Kommentare verfasst, sei der erste!