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.
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.
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
Ö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
- Titelbild: Debian-Logo von https://www.debian.org/
- Swapfile mit btrfs-progs anlegen: https://wiki.archlinux.org/title/Btrfs#Usage