Arch Linux verschlüsselt mit Systemd-Boot + Dropbear im RAID
Diese Anleitung dient als Vorlage und muss den persönlichen Wünschen ggf. angepasst werden.
Bei falscher Anwendung droht Datenverlust!
Platten vorbereiten
Hier werden 2 NVMEs verwendet und eine GPT Tabelle mit 3 Partitionen eingerichtet.
Während die erste als notwendiger Platzhalter verwendet wird, ist die zweite als /boot und EFI Partition gedacht.
Auf der dritten Partition wird im späteren Verlauf ein LVM eingerichtet und das Linux-System installiert.
Sollte ein anderer RAID-Typ (z.B 0, 10, 5, 6, …) gewünscht sein, müssen weitere Festplatten vorbereitet werden…
erste NVME
parted -s /dev/nvme0n1 mklabel gpt
parted -s /dev/nvme0n1 mkpart primary 1m 4m
parted -s /dev/nvme0n1 mkpart primary 4m 1g
parted -s /dev/nvme0n1 mkpart primary 1g 100%free
parted -s /dev/nvme0n1 set 2 esp on
zweite NVME
parted -s /dev/nvme1n1 mklabel gpt
parted -s /dev/nvme1n1 mkpart primary 1m 4m
parted -s /dev/nvme1n1 mkpart primary 4m 1g
parted -s /dev/nvme1n1 mkpart primary 1g 100%free
parted -s /dev/nvme1n1 set 2 esp on
RAID
EFI
Damit die Boot und EFI Partition auch redundant verfügbar ist und das System damit beim Ausfall einer Platte weiterhin bootbar bleibt, wird ein RAID1 eingerichtet.
In Version 1.0 werden die Metadaten des RAIDS an das Ende geschrieben, sodass das eigentliche Dateisystem vorne für das UEFI lesbar bleibt!
mdadm --create --level=1 --raid-devices=2 --metadata=1.0 /dev/md/efi /dev/nvme0n1p2 /dev/nvme1n1p2
LVM (System)
mdadm --create --level=1 --raid-devices=2 --metadata=1.2 /dev/md/lvm /dev/nvme0n1p3 /dev/nvme1n1p3
Verschlüsselung
Beim luksFormat Befehl ist ein sicheres Kennwort zur Entsperrung der Partition zu wählen.
Dieses muss bei jedem Boot eingegeben werden:
cryptsetup -c aes-xts-plain -y -s 512 luksFormat /dev/md/lvm
Danach wird das Volume das erste mal geöffnet und steht unter `/dev/mapper/lvm_crypt zur Verfügung.
cryptsetup luksOpen /dev/md/lvm lvm_crypt
LVM Einrichtung
Für das Betriebssystem (/) werden 300 GiByte vorgesehen
pvcreate /dev/mapper/lvm_crypt
vgcreate vg0 /dev/mapper/lvm_crypt
lvcreate vg0 -n root -L 300g
Formatierung
Die EFI/Boot Partition muss von UEFI gelesen werden können. Hier empfiehlt sich das Fat32 Dateisystem.
Das Betriebssystem wird auf Ext4 installiert:
mkfs.fat -F 32 -n UEFI /dev/md/efi
mkfs.ext4 /dev/mapper/vg0-root
Einhängen der Volumes und Installation
mount /dev/mapper/vg0-root /mnt
mkdir /mnt/boot
mount /dev/md/efi /mnt/boot
pacstrap /mnt base lvm2 mdadm linux-lts linux-firmware dhcpcd vim bash-completion openssh
genfstab -Up /mnt > /mnt/etc/fstab
diverse Einstellungen
echo "server" > /mnt/etc/hostname
sed -e 's/^#de_DE/de_DE/g' -e 's/^#en_US/en_US/g' -i /mnt/etc/locale.gen
arch-chroot /mnt locale-gen
echo KEYMAP=de-latin1 > /mnt/etc/vconsole.conf
Initramfs Einstellungen
Diese Einstellungen sind nötig, damit der Bootprozess in der richtigen Reihenfolge abläuft.
Grob gesagt sieht dieser wie folgt aus:
- Festplatten erkennen (block)
- Scan und Starten von RAIDs
- Netzwerkkonfiguration
- Dropbear (SSH) starten
- Skript zum öffnen der Festplatte (Passwortabfrage)
Ist das LVM-RAID geöffnet, geht es weiter:
- LVM Scan (Gruppen & Volumes)
- Dateisysteme einhängen
cat - > /mnt/etc/mkinitcpio.conf.d/z-custom.conf <<EOF
HOOKS=(base udev autodetect keyboard keymap modconf block mdadm_udev netconf dropbear encryptssh lvm2 resume filesystems keyboard fsck)
EOF
Einrichtung von Dropbear und Systemd-Boot
arch-chroot /mnt pacman -S --noconfirm mkinitcpio-dropbear mkinitcpio-utils mkinitcpio-netconf
SSH Key hinterlegen
Dropbear unterstützt beim Booten nur eine keybasierte Authentifizierung.
Deshalb werden die bekannten SSH Keys hinterlegt (optional).
Sind keine Keys hinterlergt, kann der Bootprozess nicht per SSH unterstützt werden und die Passworteingabe erfolgt mittels Tastatur am Gerät selbst.
ssh-add -L > /mnt/root/.ssh/authorized_keys
ssh-add -L > /mnt/etc/dropbear/root_key
arch-chroot /mnt bootctl install
arch-chroot /mnt mkinitcpio -p linux-lts
IP=10.20.0.33
GW=10.20.0.1
NM=255.255.255.0
IF=eth0
UUID=$(blkid /dev/md/lvm --match-tag UUID -o value)
PARMS="ip=$IP:$IP:$GW:$NM:server:$IF:none"
cat - > /mnt/boot/loader/entries/arch.conf <<EOF
title Arch Linux
linux /vmlinuz-linux-lts
initrd /initramfs-linux-lts.img
options cryptdevice=UUID=${UUID}:cryptlvm:allow-discards root=/dev/mapper/vg0-root rw init=/usr/lib/systemd/systemd $PARMS
EOF
cat - > /mnt/boot/loader/entries/arch-fallback.conf <<EOF
title Arch Linux Fallback
linux /vmlinuz-linux-lts
initrd /initramfs-linux-lts-fallback.img
options cryptdevice=UUID=${UUID}:cryptlvm:allow-discards root=/dev/mapper/vg0-root rw init=/usr/lib/systemd/systemd $PARMS
EOF
cat - > /mnt/boot/loader/loader.conf <<EOF
timeout 3
default arch.conf
EOF
Prüfung ob Systemd-Boot korrekt konfiguriert ist
arch-chroot /mnt bootctl is-installed
yes
# no red entries
arch-chroot /mnt bootctl list
Root Passwort setzen
arch-chroot /mnt passwd root
Abschluss
umount /mnt/boot
umount /mnt
vgchange -an vg0
cryptsetup close lvm_crypt
sync
reboot