Arch Linux - Verschlüsseltes btrfs root

Kurz zur Erklärung weshalb ich mich trotz aller Hürden gerade für diese Kombination entschieden habe:

Partitionierung

Es werden mindestens zwei Partitionen benötigt:

Die boot-Partition kann nicht verschlüsselt werden, weil gängige Bootloader noch keine Verschlüsselung beherrschen und der Bootloader somit den Kernel und das initramfs von einer unverschlüsselten Partition laden müssen. Zur Grösse der Bootpartition siehe auch Partitionierung für Arch Linux.

Installation

Die folgenden Schritte führen zu einem verschlüsseltem root-filesystem mit btrfs. Das Ganze scheint immer noch experimentell zu sein, beim booten gibt's ein paar Fehlermeldungen im Zusammenhang mit dem initramfs (ohne Gewähr)

Der Name des Haupt-Subvolumes ist so gewählt, damit das "schnapps" Script (zum Erstellen von Schnappschüssen des btrfs) vom Turris Omnia ohne grosse Änderungen läuft ;-)

mkfs.btrfs -L boot /dev/$YOUR_BOOT_PART cryptsetup luksFormat -y -s 512 /dev/$YOUR_ROOT_PART cryptsetup luksOpen /dev/$YOUR_ROOT_PART root # Make filesystem: mkfs.btrfs -L btrfs-root /dev/mapper/root mount -o defaults,noatime /dev/mapper/root /mnt && cd /mnt btrfs subvolume create @ && cd @ btrfs subvolume create home btrfs subvolume create var mkdir boot chmod 755 ../@ boot home var cd / umount /mnt mount -o defaults,noatime,subvol=@ /dev/mapper/root /mnt && cd /mnt mount /dev/$YOUR_BOOT_PART /mnt/boot # Now install base system (also see Install instructions): # You need to setup your network first before continuing # systemctl start dhcpcd.service

Um die Installation zu beschleunigen, kann man jetzt ggf. einen lokalen Mirror konfigurieren:

/etc/pacman.d/mirrorlist
Server = http://archmirror.localnet/$arch/$repo
pacstrap /mnt base linux linux-firmware genfstab -U /mnt >> /mnt/etc/fstab arch-chroot /mnt echo "$YOUR_HOSTNAME" > /etc/hostname # TODO: also add info to /etc/hosts ln -sf /usr/share/zoneinfo/$YOUR_ZONEINFO /etc/localtime echo 'LANG="en_US.UTF-8"' > /etc/locale.conf echo 'KEYMAP="de_CH-latin1"' > /etc/vconsole.conf

Um das btrfs voll auszunutzen (inkl. Snapshots und Rollbacks vor dem booten), braucht man die besserte" Version der mkinicpio tools mkinitcpio-btrfs, die erst aus dem AUR gebaut werden muss (siehe auch unten)

Aus dem chroot heraus klappt das aber nicht, weil makepkg sich weigert als root zu laufen. Wenn man einen User anlegt, klappt es nicht weil der keinen Zugriff auf ein freies tty erhält, oder so.
Egal, das System bootet auch ohne die verbesserte Version einwandfrei und man kann diese nachträglich installieren wenn das System eingerichtet ist. Solange muss man eben auf snapshots/rollbacks des btrfs verzichten.

TODO: pacman -S btrfs-progs

Nun muss in der Konfigurationsdatei für mkinitcpio noch der encrypt-hook (VOR dem filesystems hook) gesetzt werden:

/etc/mkinitcpio.conf
... HOOKS=(base udev autodetect modconf block encrypt filesystems keyboard fsck shutdown) ...

Zu diesem Zeitpunkt erstellen wir die initrd also ohne BTRFS support mit:

mkinitcpio -p linux

Falls es sich um ein headless/embedded System handelt, bitte auch einen Blick auf die Anleitung remote unlock werfen.

Ab hier verläuft die Installation "normal" weiter, es wäre nun die Installation des Bootloaders an der Reihe.
Als Bootloader kann GRUB oder SYSLINUX verwendet werden.

pacman -S grub

Verbesserte mkinitcpiotools mit BTRFS Unterstützung

Für das btrfs braucht man eine "verbesserte" Version der mkinicpio tools mkinitcpio-btrfs aus dem AUR. Wie man solche Pakete erstellt und installiert, habe ich hier beschrieben.

pacman -S btrfs-progs kexec-tools curl -O https://aur.archlinux.org/packages/mk/mkinitcpio-btrfs/mkinitcpio-btrfs.tar.gz tar xvf mkinitcpio-btrfs.tar.gz cd mkinitcpio-btrfs makepkg -s pacman -U mkinitcpio.......pkg.tar.xz

Dann die /etc/mkinitcpio.conf editieren (HOOKS encrypt btrfs_advanced shutdown) hinzufügen. Zudem muss BTRFS_ROLLBACK_KERNEL=false in der Datei /etc/default/btrfs_advanced gesetzt werden.
Abschliessend die initrd mit neu erzeugen:

mkinitcpio -p linux

Verschlüsseltes Swap

Die Swap Partition sollte ebenfalls noch verschlüsselt werden. Hierzu bedarf ein eines entsprechenden Eintrags in /etc/crypttab und einer kleinen Änderung in /etc/fstab:

/etc/crypttab
swap /dev/sda2 /dev/urandom swap,cipher=aes-cbc-essiv:sha256,size=256
/etc/fstab
/dev/mapper/swap none swap defaults 0 0

Falls das automatische Aktivieren der Swappartition so fehlschlägt (also systemd in den Logs das behauptet), einfach mal prüfen, ob auf der Swappartition noch der Header des alten unverschlüsselten swap ist. Wenn ja, diesen löschen, danach sollte es klappen.