ThinkPad L530 - Arch Linux Installation
Mo 25.08.2025

Nachdem ich an dem alten L530 das Display repariert habe, war die Frage, was ich mit dem zusätzlichen Rechner machen sollte. Nachdem ich meinen anderen Laptop ein L460 2016 ebenfalls mit Arch Linux aufgesetzt und seit dem nicht mehr neu installiert habe, nutze ich das L530 jetzt um mit btrfs, Secure Boot und was mir sonst noch so einfällt zu spielen. Der erste Schritt dazu ist eine Neuinstallation.

Anforderungen

Die Features die ich dabei umsetzen will, müssen dabei nicht unbedingt der beste oder einfachste Weg sein, sondern sind einfach Dinge, mit denen ich etwas spielen möchte:

  • btrfs soll als Dateisystem eingesetzt werden
  • Das System ist vollständig verschlüsselt
  • Zum Entschlüsseln wird ein Keyfile auf einer SD Karte verwendet
  • systemd-ukify und der systemd Hook in mkinitcpio werden verwendet
  • Die Bootpartition ist ebenfalls auf der SD Karte (leider musste ich feststellen, dass das L530 zwar von einem USB-Stick, aber nicht von einer SD-Karte im eingebauten Kartenlesegerät booten kann)
  • Secure Boot aktivieren (wird später in einem eigenen Post behandelt)

Verschlüsselung mit LUKS

Das grundsätzliche Setup entspricht LVM on LUKS nur dass statt LVM dann btrfs Subvolums (s. unten) zum Einsatz kommen. Das grundsätzliche Vorgehen ist hier beschrieben. Zusätzlich muss dann dass initramfs entsprechend konfiguriert werden.

SD Karte

Die SD-Karte enthält am Ende eine kleine Partition, welche das Keyfile enthält, sowie ebenfalls eine verschlüsselte Partition, um ein Backup das LUKS-Header des Hauptsystems, der ssh Schlüssel, und ähnliches zu speichern.

Btrfs Subvolume Layout

Beim Layout der Subvolumes gibt es zwei grundsätzliche Varianten. Flat oder Nested. Nach kurzer Recherche habe ich mich für ein Flat Layout entschieden, das folgende Subvolumes enthält:

@        /
@home    /home
@root    /root
@srv     /srv
@cache   /var/cache
@log     /var/log
@swap    /swap Enthält ein Swapfile

Damit sollten dann Snapshots und Rollbacks des Hauptsystems möglich sein. Aktuell ist mir allerdings noch nicht ganz klar, wie die nicht verschlüsselte /boot Partition dabei eingebunden wird. Zusätzlich werden Simple Quotas verwendet, um festzulegen, welches Subvolume wie viel Platz einnehmen darf.

Installation

Um die Installation später einfach nachvollziehen zu können, folgt nun die vollständige Dokumentation der einzelnen Schritte:

Herunterladen, vorbereiten und booten des Installationsmediums

Link

Das Kopieren auf einen usb-Stick funktioniert auch mit cp, das wusste ich bis jetzt nicht

Wifi Einrichten

iwctl
device list
station wlan0 scan
station wlan0 get-networks
station wlan0 connect <MyNetwork>

Formatieren der Festplatte

fdisk
# GPT Partitionstabelle erstellen
# Partition 1 mit 1G für Boot erstellen, im Folgenden /dev/sda1
# Typ der Partition 1 zu EFI ändern
# Partition 2 für den Rest erstellen, im Folgenden /dev/sda2

mkfs.fat -F 32 -n BOOT /dev/sda1

cryptsetup luksFormat /dev/sda2
cryptsetup config --label crypt /dev/sda2
cryptsetup open /dev/disk/by-label/crypt arch
mkfs.btrfs -L arch /dev/mapper/arch
mount /dev/mapper/arch /mnt

for i in @ @home @root @srv @cache @log @swap;
do
    btrfs subvolume create /mnt/$i;
done

btrfs subvolume list /mnt
btrfs subvolume set-default 256 /mnt # @ als default subvolume festlegen
umount /mnt

# Jetzt wird @ als neues default Subvolume gemounted
mount /dev/mapper/arch -o compress=zstd /mnt 
mount -m /dev/disk/by-label/BOOT /mnt/boot
mkdir -p /mnt/boot/EFI/Linux
mkdir /mnt/var

mount -m /dev/mapper/arch -o subvol=@home,compress=zstd /mnt/home
mount -m /dev/mapper/arch -o subvol=@root,compress=zstd /mnt/root
mount -m /dev/mapper/arch -o subvol=@srv,compress=zstd /mnt/srv
mount -m /dev/mapper/arch -o subvol=@cache,compress=zstd /mnt/var/cache
mount -m /dev/mapper/arch -o subvol=@log,compress=zstd /mnt/var/log
mount -m /dev/mapper/arch -o subvol=@swap /mnt/swap

# Simple Quotas
btrfs quota enable -s /mnt # -s für simple quotas, alles andere bleibt gleich
btrfs qgroup limit 32G /mnt
btrfs qgroup limit 64G /mnt/home
btrfs qgroup limit 1G /mnt/root
btrfs qgroup limit 1G /mnt/srv
btrfs qgroup limit 16G /mnt/var/cache
btrfs qgroup limit 16G /mnt/var/log
btrfs qgroup limit 4G /mnt/swap

# Swapfile erzeugen
btrfs filesystem mkswapfile --size 4g --uuid clear /mnt/swap/swapfile
swapon /mnt/swap/swapfile

Chroot und Systemkonfiguration

Nachdem nun das grundsätzliche Layout des Systems steht, können jetzt die Pakete installiert und das System konfiguriert werden.

pacstrap -K /mnt base base-devel linux linux-firmware intel-ucode systemd-ukify dosfstools btrfs-progs iwd mg less tree bash-completion git efibootmgr vi sudo
genfstab -U /mnt >> /mnt/etc/fstab

arch-chroot /mnt
ln -sf /usr/share/zoneinfo/Europe/Berlin /etc/localtime
hwclock --systohc
# /etc/locale.gen editieren und mindestens de_DE.utf-8 einkommentieren
locale-gen
echo LANG=de_DE.UTF-8 > /etc/locale.conf
echo KEYMAP=us > etc/vconsole.conf
echo prox > /etc/hostname
systemctl enable iwd.service
# iwd Konfiguration, s. https://wiki.archlinux.org/title/Iwd#Enable_built-in_network_configuration
systemctl enable systemd-resolved.service
systemctl enable systemd-timesyncd.service

passwd

# /etc/mkinitcpio.conf: Hooks für systemd sd-vconsole sd-encrypt hinzufügen
# /etc/mkinitcpio.d/linux.preset: Zeilen für uki einkommentieren, image auskommentieren
# /etc/mkinitcpio.d/linux.preset: Analog für das fallback preset
# /etc/mkinitcpio.d/linux.preset: Zu fallback_options '--cmdline /etc/cmdline.d/base.conf' hinzufügen -> boot ist nicht quiet
mkdir /etc/cmdline.d
echo 'root=/dev/mapper/arch rw' > /etc/cmdline.d/base.conf
echo "rd.luks.name=$(blkid -s UUID -o value /dev/disk/by-label/crypt)=arch" >> /etc/cmdline.d/base.conf
echo 'quiet' > /etc/cmdline.d/quiet.conf # evtl. erst nach dem ersten erfolgreichen reboot
mkinitcpio -p linux
bootctl install # eine weitere Konfiguration ist nicht notwendig, da das UKI automatisch gefunden wird
systemctl enable systemd-boot-update.service

# btrfs-scrub aktivieren
systemctl enable btrfs-scrub@-.timer
systemctl enable btrfs-scrub@home.timer
# macht das für alle subvolumes Sinn?

exit
swapoff /mnt/swap/swapfile
umount -R /mnt
cryptsetup close arch
systemctl reboot

Nach der Eingabe des Passworts bootet dann hoffentlich das System wie gewünscht.

SD-Karte mit Keyfile vorbereiten

Nun wird noch die SD-Karte mit dem Keyfile vorbereitet

fdisk
# GPT Partitionstabelle erstellen
# Partition 1 mit 1G für Keyfile erstellen, im Folgenden /dev/mmcblk0p1
# Partition 2 für den Rest erstellen, im Folgenden /dev/mmcblk0p2

mkfs.fat -F 32 -n PROX_KEY /dev/mmcblk0p1
mount /dev/disk/by-label/PROX_KEY /mnt
mkdir /mnt/luks
openssl genrsa -out /mnt/luks/prox.key 4096
cryptsetup luksAddKey /dev/disk/by-label/crypt /mnt/luks/prox.key
echo "rd.luks.key=$(blkid -s UUID -o value /dev/disk/by-label/crypt)=/luks/prox.key:UUID=$(blkid -s UUID -o value /dev/disk/by-label/PROX_KEY)" >> /etc/cmdline.d/base.conf
echo "rd.luks.options=$(blkid -s UUID -o value /dev/disk/by-label/crypt)=keyfile-timeout=10s" >> /etc/cmdline.d/base.conf
umount /mnt
# Das vfat Modul muss in der mkinitcpio.conf hinzugefügt werden
mkinitcpio -p linux


# Verschlüsselten Speicher vorbereiten
cryptsetup luksFormat /dev/mmcblk0p2
cryptsetup config --label PROX_CRYPT /dev/sda2
cryptsetup open /dev/disk/by-label/PROX_CRYPT PROX_CRYPT
mkfs.fat -F 32 -n PROX_DATA /dev/mapper/PROX_CRYPT
mount /dev/disk/by-label/PROX_DATA /mnt
# Backup der Passphrase für das Hauptsystem
cryptsetup luksHeaderBackup /dev/disk/by-label/crypt --header-backup-file /mnt/luks_header.img
umount /mnt
cryptsetup close PROX_CRYPT

Der Kernel als EFI-Programm

Nachdem das Booten mit systemd-bootd klappt, kann man auch den Kernel direkt aus dem EFI heraus starten und den bootloader Überspringen. Die Konfiguration erfolgt mittels efibootmgr

efibootmgr -u
efibootmgr --create --disk /dev/sda --part 1 --loader '\EFI\Linux\arch-linux.efi' --label 'Arch Linux UKI' --unicode

Zusätzlich setze ich den Timeout für systemd-bootd auf 10s. Diesen kann ich dann im Zweifel über das temporäre Bootmenü des UEFI starten.

Fazit

Damit steht das Grundsystem. Erfahrungen zu Secure Boot, snapper und der Installation einer grafischen Benutzeroberfläche werden erst einmal vertagt.

Autor: Fabian Brosda

Erstellt: Mo 25.08.2025

Dieses Werk ist lizensiert unter CC BY 4.0CCBY

Erstellt mit: Emacs 29.3 (Org mode 9.6.15)