Arch Linux Setup mit Verschlüsselung (LVM auf LUKS)

Sep 26 2020

Ich möchte Arch Linux mit Verschlüsselung einrichten. Ich habe das Tutorial im Arch-Wiki gefunden und denke, dass die zweite Option (LVM auf LUKS) die beste Option für mich ist. Hier ist die Partitionierung, die ich verwenden möchte (Thinkpad X1 Carbon, ~ 500 GB SSD, 16 GB RAM):

  1. [Ausrichtungslücke] 1 MB
  2. /boot 256 MB (FAT 32)
  3. Swap 16 GB (Speichergröße)
  4. / (root) 64 GB (ext4)
  5. /var 8 GB (ext4)
  6. /tmp 4 GB (ext4)
  7. /home ~ 400 GB (ext4, Rest)

Die Festplatte hat den Namen nvme0n1. Nach dem Booten des Installationsprogramms (Version September 2020) und dem Herstellen einer Verbindung zum WLAN überschreibe ich die Festplatte mit zufälligen Daten:

# shred --random-source=/dev/urandom --iterations=3 /dev/nvme0n1

Dann richte ich ein neues GPT-Partitionsschema ein:

# parted -s /dev/nvme0n1 mklabel gpt

Als Nächstes erstelle und formatiere ich eine Boot-Partition mit einer Ausrichtungslücke von 1 MB davor.

# parted -s /dev/nvme0n1 mkpart boot fat32 1MiB 257MiB
# parted -s /dev/nvme0n1 set 1 esp on
# mkfs.fat -F 32 /dev/nvme0n1p1

Jetzt kommt der Teil, in dem das Wiki unklar ist. (Es wird nur erwähnt, dass es möglich ist, /bootauf einem anderen Gerät zu arbeiten, was ich nicht habe.) Ich habe beschlossen, eine andere Partition zu erstellen, auf der sich mein verschlüsseltes Volume befindet:

# parted -s /dev/nvme0n1 mkpart cryptlvm 257MiB '100%'

Dadurch wird eine zweite Partition /dev/nvme0n1p2mit der verbleibenden Festplattengröße erstellt. (Möglicherweise verursacht dieser Schritt das Problem.) Ich richte die Verschlüsselung weiter ein:

# cryptsetup luksFormat /dev/nvme0n1p2     # YES, entering passphrase  twice
# cryptsetup open /dev/nvme0n1p2 cryptlvm  # entering passphrase
# pvcreate /dev/mapper/cryptlvm
# vgcreate VolumeGroup /dev/mapper/cryptlvm

Dann erstelle ich die Partitionen wie oben beschrieben:

# lvcreate -L 16G VolumeGroup -n swap
# lvcreate -L 64G VolumeGroup -n root
# lvcreate -L 8G VolumeGroup -n var
# lvcreate -L 4G VolumeGroup -n tmp
# lvcreate -l '100%FREE' VolumeGroup -n home

Die Partitionen werden jetzt formatiert:

# mkswap /dev/VolumeGroup/swap
# mkfs.ext4 -F /dev/VolumeGroup/root
# mkfs.ext4 -F /dev/VolumeGroup/var
# mkfs.ext4 -F /dev/VolumeGroup/tmp
# mkfs.ext4 -F /dev/VolumeGroup/home

Und montiert:

# mount /dev/VolumeGroup/root /mnt

# mkdir /mnt/boot
# mount /dev/nvme0n1p1 /mnt/boot

# mkdir /mnt/var
mount /dev/VolumeGroup/var /mnt/var

# mkdir /mnt/tmp
mount /dev/VolumeGroup/tmp /mnt/tmp

# mkdir /mnt/home
mount /dev/VolumeGroup/home /mnt/home

Das System kann jetzt zusammen mit folgenden Funktionen gebootet werden lvm2:

# pacstrap /mnt base liux linux-firmware lvm2

Ich erstelle und speichere auch fstab:

# genfstab -U /mnt >> /mnt/etc/fstab

Ich chrootin das Bootstrap-System:

# arch-chroot /mnt

Wie im Wiki erwähnt, füge ich die Hooks hinzu encryptund lvm2in /etc/mkinitcpio.conf:

HOOKS=(base udev autodetect keyboard keymap consolefont modconf block filesystems fsck encrypt lvm2)

Ich fahre mit den üblichen Setup-Aufgaben fort (Root-Passwort einrichten, Basispakete installieren, Zeitzone, Gebietsschema, Sprache, Hostname festlegen):

# passwd
# pacman -S iw wpa_supplicant dialog intel-ucode netctl dhcpcd
# ln -sf /usr/share/zoneinfo/Europe/Zurich /etc/localtime
# timedatectl set-ntp true
# hwclock --systohc
# echo 'en_US.UTF-8 UTF-8' >> /etc/locale.gen
# locale-gen
# echo 'LANG=en_US.UTF-8' > /etc/locale.conf
# echo -n 'x1' > /etc/hostname

Jetzt kommt der Bootloader. Hier verwende ich traditionell den systemd Bootloader anstelle von grub. So habe ich es eingerichtet:

# systemd-machine-id-setup
# bootctl --path=/boot install

Ich finde die UUID (nicht PARTUUID) der Root-Partition wie folgt heraus:

# blkid | grep /dev/VolumeGroup/root | egrep -o 'UUID="[^"]!"'
UUID="6d5b4777-2621-4bec-8bbc-ebd4b5ba9faf"

Dann erstelle ich den Starteintrag in /boot/loader/entries/arch.conf:

title   Arch Linux
linux   /vmlinuz-linux
initrd  /initramfs-linux.img
options cryptdevice=UUID=6d5b4777-2621-4bec-8bbc-ebd4b5ba9faf:cryptlvm root/dev/VolumeGroup/root

Und eine Übereinstimmung /boot/loader/loader.conf:

default arch
timeout 0
editor  0

Zu guter Letzt renne ich mkinitcpio, bevor ich mich auf den Weg zu einem neuen Boot mache:

# mkinitcpio -P
# exit
# umount -R /mnt
# shutdown -h now

Das war also mein Setup-Verfahren. Ich entferne den USB-Dongle und starte das System. Der Bootloader wird angezeigt, aber dann wird der folgende Bildschirm angezeigt:

:: running early hook [udev]
Starting version 246.6-1-arch
:: running early hook [lvm2]
:: running hook [udev]
:: Triggering uevents...
:: running hook [encrypt]
Waiting 10 seconds for device /dev/disk/by-uuid/6d5b4777-2621-4bec-8bbc-ebd4b5ba9faf ...
Waiting 10 seconds for device /dev/VolumeGroup/root ...
ERROR: device '/dev/VolumeGroup/root' not found. Skippng fsck.
:: mounting '/dev/VolumeGroup/root' on real root
mount: /new_root: no filesystem type specified.
You are now being dropped into an emergency shell.

Jetzt bin ich ziemlich ahnungslos, was ich falsch gemacht habe. Ein Verdacht ist die zweite Partition ( /dev/nvme0n1p2), die ich erstellen musste. Ein weiterer Verdacht ist, dass ich mit dem Bootloader etwas falsch gemacht habe. Bei normalen Setups verwende ich immer die PARTUUID anstelle der UUID. (Es gibt jedoch keine PARTUUID in der Ausgabe von blikd, daher ist dies wahrscheinlich nicht das Problem.)

Antworten

1 PatrickBucher Sep 26 2020 at 18:34

Da @frostschutz seine richtige Lösung für das Problem noch nicht als Antwort geschrieben hat, fasse ich das Problem hier schnell zusammen: Ich habe die UUID der falschen Partition ausgewählt. Die Root-Partition unter /dev/VolumeGroup/rootist nicht die zu wählende, sondern die eigentliche Partition /dev/nvme0n1p2. So extrahieren Sie diese UUID:

# uuid=$(blkid --match-tag UUID -o value /dev/nvme0n1p2)

Was dann in der Bootloader-Eintragskonfiguration verwendet werden kann:

# cat <<EOF >/boot/loader/entries/arch.conf
title   Arch Linux
linux   /vmlinuz-linux
initrd  /initramfs-linux.img
options cryptdevice=UUID=${uuid}:cryptlvm root=/dev/volgrp/root
EOF

Ich habe den gesamten Vorgang auf meiner privaten Website zusammengefasst . Vielen Dank auch an @Cbhihe für den Rat zu Partitionsgrößen.