Anleitungen für die Installation von Debian mit BTRFS und verschlüsselter Festplatte gibt es genug im Internet. 🤔 Um mir bei den nächsten Installationen die Suche zu erleichtern, gibt es das ganze hier in kurz und knapp.

Für diese Mitschrift gilt:

  • Debian 13
  • UEFI
  • Installation von USB-Stick (Image debian-13.6.0-amd64-netinst.iso)

Installer - erste Schritte

  1. Starten mit Expert install
  2. Durcharbeiten bis Installer-Komponenten vom Installationsmedium laden
    • network-console auswählen - Installation via SSH
      (Von einem anderen PC lässt es sich einfacher mit Copy+Paste installieren.) 😊
  3. Installations-Assistent weiter durcharbeiten bis Installation über Fernzugriff (SSH) fortsetzen
    • SSH-Passwort festlegen
  4. Installation von einem entfernten Host fortsetzen und wie im Installer beschrieben verbinden
    • Via SSH -> Installer starten (Expertenmodus)
  5. Die nächsten Punkte des Installers abarbeiten bis Festplatte partitionieren

Festplatte partitionieren

  1. Manuell
  2. Partitionen
Name Partition Größe Mountpoint
ESP EFI 1GB /boot/efi
boot ext4 1GB /boot
crypt physisches Volume für Verschlüsselung 100%FREE
  1. Menüpunkt:
    Verschlüsselte Datenträger konfigurieren
    • Änderungen auf die Festplatte schreiben
    • Verschlüsselte Datenträger erzeugen
      Auswahl: /dev/nvme0n1p3 (...MB; crypto)
    • Fertigstellen
    • Passphrase festlegen
  2. Verschlüsseltes Volume (nvme0n1p3_crypt) konfigurieren
Partition Mountpoint
btrfs /
  1. Änderungen übernehmen und nicht zum Partitionierungsmenü zurückkehren
  2. ⚠️ Auf die Konsole wechseln (bei einer Verbindung via SSH wird screen verwendet: Strg+A N)

BTRFS

~ # df -h
Filesystem                Size      Used Available Use% Mounted on
tmpfs                     1.5G    548.0K      1.5G   0% /run
devtmpfs                  7.6G         0      7.6G   0% /dev
/dev/sda1               755.0M    755.0M         0 100% /cdrom
none                    384.0K     99.8K    279.2K  26% /sys/firmware/efi/efivars
/dev/mapper/nvme0n1p3_crypt
                        236.6G      5.8M    234.6G   0% /target
/dev/nvme0n1p2          920.7M    264.0K    856.7M   0% /target/boot
/dev/nvme0n1p1          951.1M      4.0K    951.1M   0% /target/boot/efi

Vorbereitung

umount /target/boot/efi
umount /target/boot/
umount /target/

Subvolumes erstellen

Der Debian-Installer legt je nach Debian-Version beziehungsweise Installer-Konfiguration möglicherweise ein anders benanntes Root-Subvolume an. Den tatsächlichen Namen vorher mit btrfs subvolume list /mnt prüfen. Im folgenden Beispiel heißt es @rootfs; den Namen bei Bedarf anpassen. Existiert bereits ein Subvolume @, entfällt das Umbenennen.

mount /dev/mapper/nvme0n1p3_crypt /mnt/
cd /mnt
mv @rootfs @
btrfs subvolume create @home
btrfs subvolume create @swap
btrfs subvolume create @snapshots
btrfs subvolume create @var_cache
btrfs subvolume create @var_log
btrfs subvolume list .

Subvolumes einbinden

mount /dev/mapper/nvme0n1p3_crypt /target/ -o subvol=@
mount /dev/nvme0n1p2 /target/boot
mount /dev/nvme0n1p1 /target/boot/efi

mkdir -p /target/home
mkdir -p /target/swap
mkdir -p /target/.snapshots
mkdir -p /target/var/log
mkdir -p /target/var/cache

mount /dev/mapper/nvme0n1p3_crypt /target/home -o discard=async,compress=zstd,noatime,subvol=@home
mount /dev/mapper/nvme0n1p3_crypt /target/swap -o discard=async,noatime,subvol=@swap
mount /dev/mapper/nvme0n1p3_crypt /target/.snapshots -o discard=async,compress=zstd,noatime,subvol=@snapshots
mount /dev/mapper/nvme0n1p3_crypt /target/var/log -o discard=async,compress=zstd,noatime,subvol=@var_log
mount /dev/mapper/nvme0n1p3_crypt /target/var/cache -o discard=async,compress=zstd,noatime,subvol=@var_cache

Prüfung:

/mnt # mount |grep crypt
/dev/mapper/nvme0n1p3_crypt on /mnt type btrfs (rw,relatime,ssd,space_cache=v2,subvolid=5,subvol=/)
/dev/mapper/nvme0n1p3_crypt on /target type btrfs (rw,relatime,ssd,space_cache=v2,subvolid=256,subvol=/@)
/dev/mapper/nvme0n1p3_crypt on /target/home type btrfs (rw,noatime,ssd,space_cache=v2,subvolid=257,subvol=/@home)
/dev/mapper/nvme0n1p3_crypt on /target/swap type btrfs (rw,noatime,ssd,space_cache=v2,subvolid=258,subvol=/@swap)
/dev/mapper/nvme0n1p3_crypt on /target/.snapshots type btrfs (rw,noatime,ssd,space_cache=v2,subvolid=259,subvol=/@snapshots)
/dev/mapper/nvme0n1p3_crypt on /target/var/log type btrfs (rw,noatime,ssd,space_cache=v2,subvolid=261,subvol=/@var_log)
/dev/mapper/nvme0n1p3_crypt on /target/var/cache type btrfs (rw,noatime,ssd,space_cache=v2,subvolid=260,subvol=/@var_cache)

Swapfile

btrfs filesystem mkswapfile /target/swap/swapfile -s 16g
swapon /target/swap/swapfile

/etc/fstab

nano /target/etc/fstab

# root
/dev/mapper/nvme0n1p3_crypt /               btrfs   defaults,ssd,discard=async,compress=zstd,noatime,subvol=@ 0 0
# home
/dev/mapper/nvme0n1p3_crypt /home           btrfs   defaults,ssd,discard=async,compress=zstd,noatime,subvol=@home 0 0
# swap
/dev/mapper/nvme0n1p3_crypt /swap           btrfs   defaults,ssd,discard=async,noatime,subvol=@swap 0 0
/swap/swapfile              none            swap    defaults 0 0
# snapshots
/dev/mapper/nvme0n1p3_crypt /.snapshots     btrfs   defaults,ssd,discard=async,compress=zstd,noatime,subvol=@snapshots 0 0
# var_log
/dev/mapper/nvme0n1p3_crypt /var/log        btrfs   defaults,ssd,discard=async,compress=zstd,noatime,subvol=/@var_log 0 0
# var_cache
/dev/mapper/nvme0n1p3_crypt /var/cache      btrfs   defaults,ssd,discard=async,compress=zstd,noatime,subvol=/@var_cache 0 0


# /boot was on /dev/nvme0n1p2 during installation
UUID=f6473aff-5f1f-4c10-8fea-cca0bec59665 /boot           ext4    defaults        0       2

# /boot/efi was on /dev/nvme0n1p1 during installation
UUID=1C8C-FCFF  /boot/efi       vfat    umask=0077      0       1

Installer - fortsetzen

  • Basissystem installieren, …
  • Installieren des systemd-Bootloaders

Nacharbeit

In der Datei /target/etc/kernel/cmdline muss das subvol=@rootfs auf subvol=@ angepasst werden. Ist eine nicht so gesprächige Ausgabe gewünscht, kann die Boot-Option quiet ebenso hinzugefügt werden.

grep -R "@rootfs" /target/etc/ 2> /dev/null
nano /target/etc/kernel/cmdline
root=UUID=8e...a40f rootflags=subvol=@ quiet

Ebenso müssen die Bootloader-Einträge unter /target/boot/efi/loader/entries/ angepasst werden. Auch hier wird aus subvol=@rootfs -> subvol=@. Sonst startet Debian nach dem Neustart nicht, da das Subvolume nicht eingebunden werden kann.

grep subvol -R /target/boot/
/target/boot/efi/loader/entries/abc-6.12.111+deb13-amd64+2.conf:options    root=UUID=8e...a40f rootflags=subvol=@rootfs systemd.machine_id=2e4cf3853ff946b
293b22e6e1f6b1971
/target/boot/efi/loader/entries/abc-6.12.94+deb13-amd64+2.conf:options    root=UUID=8e...a40f rootflags=subvol=@rootfs systemd.machine_id=2e4cf3853ff946b2
93b22e6e1f6b1971
# Boot Loader Specification type#1 entry
# File created by /usr/lib/kernel/install.d/90-loaderentry.install (systemd 257.13-1~deb13u1)
title      Debian GNU/Linux 13 (trixie)
version    6.12.94+deb13-amd64
machine-id abc
sort-key   debian
options    root=UUID=8e...a40f rootflags=subvol=@ systemd.machine_id=2e4cf3853 quiet
ff946b293b22e6e1f6b1971
linux      /abc/6.12.94+deb13-amd64/linux
initrd     /abc/6.12.94+deb13-amd64/initrd.img-6.12.94+deb13-amd64