Ubuntu 20.04 → 24.04 Dist-Upgrade: LUKS2, GRUB, Secure Boot und systemd-boot
Diese Seite dokumentiert das Debugging eines fehlgeschlagenen Ubuntu-Release-Upgrade. Das System war danach nicht mehr bootbar. Die Ursachen lagen in einem Zusammenspiel aus LUKS2-Verschlüsselung, GRUB 2.12, Secure Boot und fehlenden Dotfiles — die sich gegenseitig verstärkten und zu einer langen Kette von Folgeproblemen führten.
Ausgangssituation
- Xubuntu 20.04, LUKS2-verschlüsselte Root-Partition
- Dual-Boot mit Windows auf derselben NVMe-SSD
- Eine weitere verschlüsselte Partition (Veracrypt/exFAT) als gemeinsamer Datenspeicher,
gemountet unter
/home/user/data - Persönliche Dotfiles (xmonad, zsh, vim, etc.) liegen als Symlinks auf dieser Veracrypt-Partition
- Neo2-Tastaturlayout, xmonad als Window Manager, Alacritty als Terminal
Phase 1: Fehlgeschlagenes Dist-Upgrade
do-release-upgrade von 20.04 → 22.04 gestartet. Das Upgrade blieb beim Paket
ConTeXt MarkIV (Teil von TeXLive) hängen — ein sehr großes Paket das beim
Post-Install-Script sehr lange läuft. Es wurde manuell abgebrochen.
Das System bootete danach nicht mehr. GRUB fiel direkt in die interaktive
Kommandozeile (grub>) ohne ein Bootmenü anzuzeigen.
Phase 2: Chroot-Reparatur via Live-USB
Das System wurde von einem Live-USB gebootet. Die verschlüsselte Partition wurde manuell geöffnet und eine chroot-Umgebung eingerichtet:
cryptsetup luksOpen /dev/sdXY cryptroot
mount /dev/mapper/cryptroot /mnt
mount /dev/sdXZ /mnt/boot/efi # EFI-Partition
mount --bind /dev /mnt/dev
mount --bind /proc /mnt/proc
mount --bind /sys /mnt/sys
mount --bind /run /mnt/run
mount --bind /sys/firmware/efi/efivars /mnt/sys/firmware/efi/efivars
chroot /mnt
Im chroot:
dpkg --configure -aundapt --fix-broken installreparierten kaputte Pakete- Der Kernel fehlte komplett (nur initrd vorhanden, kein vmlinuz):
apt install --reinstall linux-image-generic - Das Upgrade wurde mit
do-release-upgradeauf 22.04 und anschließend 24.04 abgeschlossen
Phase 3: GRUB + LUKS2 + Secure Boot — Das Kernproblem
Symptom
Nach dem Upgrade zeigte GRUB weiterhin keine Menüeinträge. Debugging in der GRUB-Kommandozeile:
grub> ls (hd1,gpt7)
# → "No known filesystem detected"
grub> insmod luks2
# → "file '/boot/grub/x86_64-efi/luks2.mod' not found"
Ursache
Das eigentliche Problem ist eine fundamentale Inkompatibilität:
Canonical’s vorsigniertes
grubx64.efienthält dasluks2-Modul bewusst nicht.
GRUB 2.12 kann LUKS2 technisch entschlüsseln (sofern PBKDF2 statt Argon2 als Key-Derivation-Function genutzt wird), aber das von Ubuntu ausgelieferte, Secure-Boot-signierte EFI-Binary lässt dieses Modul absichtlich weg — es gilt noch als nicht vollständig stabil.
grub-install --modules="... luks2 ..." hat deshalb keinen Effekt: Mit Secure Boot
aktiv nutzt grub-install immer das vorsignierte Image und ignoriert die
--modules-Option.
Ein manuell mit grub-mkimage erstelltes Image mit luks2-Unterstützung wird von
Secure Boot sofort abgelehnt:
Verification failed: (0x1A) Security Violation
Zusätzlich schlug grub-install im chroot grundsätzlich fehl, weil EFI-Variablen
im chroot nicht beschreibbar sind (grub-efi/install_devices_failed: true in
debconf-show grub-efi).
Optionen
| Option | Aufwand | Nachteil |
|---|---|---|
| Secure Boot deaktivieren | gering | Secure Boot inaktiv |
| LUKS2 → LUKS1 konvertieren | gering | Kein Backup-Header mehr |
| Eigenen MOK-Schlüssel + selbst signiertes GRUB | hoch | Muss bei jedem GRUB-Update wiederholt werden |
| Wechsel zu systemd-boot | mittel | Konfigurationsaufwand einmalig |
LUKS1 wurde abgelehnt, da LUKS2 einen Backup-Header mitbringt der sich bereits einmal als lebensrettend erwiesen hatte. Gewählt wurde systemd-boot.
Phase 4: Wechsel zu systemd-boot
Warum systemd-boot?
- Secure Boot wird nativ unterstützt (das Binary ist von den Distributionen signiert)
- LUKS wird nicht von systemd-boot selbst geöffnet — das übernimmt die initramfs beim Kernel-Start. Damit entfällt das LUKS2-Problem komplett
- Dual Boot mit Windows funktioniert: systemd-boot erkennt den Windows-EFI-Eintrag automatisch
- Kein shim als Vermittler nötig (anders als bei GRUB)
Installation
bootctl install --esp-path=/boot/efi
Kernel und initrd werden von kernel-install automatisch auf die EFI-Partition
kopiert. Bei jedem Kernel-Update wird ein neuer Boot-Entry angelegt.
LUKS-Parameter
Der automatisch generierte Boot-Entry enthielt keine LUKS-Parameter. Diese werden
dauerhaft in /etc/kernel/cmdline hinterlegt:
rd.luks.uuid=<UUID-der-LUKS-Partition> rd.luks.name=<UUID>=cryptroot root=/dev/mapper/cryptroot rw quiet splash
kernel-install add <version> /boot/vmlinuz-<version> regeneriert den Entry mit
diesen Parametern. Zukünftige Kernel-Updates setzen die Parameter automatisch korrekt.
Secure Boot Problem
systemd-bootx64.efi war auf dem System nicht signiert — Ubuntu liefert kein
.efi.signed-Paket für systemd-boot aus. Vorläufige Lösung: Secure Boot im
BIOS deaktiviert.
Für eine spätere saubere Lösung mit aktivem Secure Boot:
# Eigenen Signing-Key generieren
openssl req -newkey rsa:4096 -nodes -keyout /root/mok.key \
-new -x509 -sha256 -days 3650 \
-subj "/CN=My Boot Signing Key/" -out /root/mok.crt
# systemd-boot signieren
sbsign --key /root/mok.key --cert /root/mok.crt \
--output /boot/efi/EFI/systemd/systemd-bootx64.efi \
/boot/efi/EFI/systemd/systemd-bootx64.efi
# Schlüssel bei Secure Boot registrieren
mokutil --import /root/mok.crt
# → Beim nächsten Boot einmalig im MOK-Manager bestätigen
EFI-Boot-Reihenfolge
Der alte GRUB-Eintrag wurde entfernt und systemd-boot als erster Eintrag gesetzt:
efibootmgr --delete-bootnum --bootnum XXXX # alten Ubuntu/GRUB-Eintrag löschen
efibootmgr --bootorder 0001 # Linux Boot Manager an erste Stelle
Phase 5: Veracrypt-Partition — Der eigentliche Mount-Fehler
Symptom
Die Veracrypt-Partition wurde beim Boot nicht gemountet. Das Journal zeigte:
mount: wrong fs type, bad option, bad superblock on /dev/mapper/data,
missing codepage or program, or other error
Das klang nach einem ernsthaften Problem — war es aber nicht.
Diagnose mit -v
cryptsetup open /dev/sdXY data \
--type tcrypt --veracrypt \
--key-file /home/user/.data.key -v
# → Error: device already exists
device already exists bedeutet: cryptsetup hatte die Partition bereits erfolgreich
geöffnet. Das Problem lag allein beim anschließenden Mount-Vorgang.
Ursache: Ungültige fstab-Optionen für exFAT
Die /etc/fstab enthielt für die Partition:
/dev/mapper/data /home/user/data auto permissions,users,nosuid,nodev,nofail,...
permissions ist keine gültige Mount-Option für exFAT-Dateisysteme und führt zu
einem sofortigen Mount-Fehler. Die korrigierte Zeile:
/dev/mapper/data /home/user/data exfat nofail,fmask=133,dmask=022,uid=1000,gid=1000 0 0
Phase 6: Keyboard-Layout-Chaos durch fehlende Dotfiles
Was passierte
Da die Veracrypt-Partition nicht gemountet war, fehlten alle Symlink-Ziele:
.xmonad/→ xmonad startete nicht, XFCE wurde als Fallback geladen.zshrc→ versuchte Dateien von der nicht gemounteten Partition zu laden.vimrc→ Symlink ins Leere- xkb/xmodmap-Konfiguration fehlte
XFCE initialisierte das Tastaturlayout ohne die benutzerspezifische xkb-Konfiguration.
Das Ergebnis war ein BadKey (0xcf) als mod2-Modifier in X11 — sichtbar mit:
xmodmap -pm
# mod2 BadKey (0xcf)
Dieser ungültige Modifier-Eintrag aktivierte Layer-4-Sonderzeichen statt normaler
Eingabe. Neo2-Layer-4 belegt die Zifferntasten mit Symbolen wie º, £, ¤ —
was erklärt warum die Tastatur scheinbar komplett kaputt war.
Lösung
Nach korrektem Mount der Veracrypt-Partition startete xmonad mit den vorhandenen Dotfiles normal. Das Tastaturlayout funktionierte sofort ohne weiteren Eingriff, da die xmodmap-Konfiguration korrekt geladen wurde.
Zusammenfassung: Lessons Learned
LUKS2 + GRUB + Secure Boot ist auf Ubuntu derzeit nicht out-of-the-box möglich. Die Kombination erfordert entweder einen eigenen MOK-Schlüssel mit selbst gebautem GRUB-Image, die Konvertierung auf LUKS1, oder den Wechsel zu einem anderen Bootloader. systemd-boot ist hier die eleganteste Lösung da er LUKS der initramfs überlässt und Secure Boot nativ unterstützt.
Dotfiles auf verschlüsselten Partitionen sind ein zweischneidiges Schwert: Sie sind sicher, aber wenn die Partition beim Boot nicht verfügbar ist, bricht die gesamte Session-Initialisierung still und mit kryptischen Folgefehlern zusammen. Eine minimale Fallback-Konfiguration direkt im Home-Verzeichnis ist empfehlenswert.
cryptsetup -v ist unverzichtbar beim Debugging — ohne verbose Output sieht
“device already exists” genauso aus wie ein echter Fehler.
Offene Punkte
- Secure Boot wieder aktivieren via eigenem MOK-Schlüssel für systemd-boot
- Alten
/boot-fstab-Eintrag bereinigen python-Symlink:sudo ln -s /usr/bin/python3 /usr/bin/python- Audio-Fehler (alsactl) aus dem Journal untersuchen