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
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.