GRUB Bootloader zusammen mit LUKS2 und BTRFS Dateisystem
Die Einrichtung von Arch Linux mit vollständiger Festplattenverschlüsselung durch LUKS2 bietet ein hohes Maß an Sicherheit für Benutzerdaten und Systemintegrität. LUKS2 (Linux Unified Key Setup) ist eine weit verbreitete Methode zur Festplattenverschlüsselung unter Linux, die es ermöglicht, den gesamten Inhalt der Festplatte zu verschlüsseln, einschließlich des Betriebssystems und aller Benutzerdaten. Diese Vorgehensweise schützt die Daten vor unbefugtem Zugriff, selbst wenn das Gerät verloren geht oder gestohlen wird. In dieser Anleitung werden wir die Schritte zur Einrichtung von Arch Linux mit vollständiger Festplattenverschlüsselung durch LUKS2 erläutern, um eine robuste und sichere Betriebsumgebung zu schaffen, ohne die Benutzerfreundlichkeit zu beeinträchtigen.
Dieser Beitrag beschreibt, wie man die aktuelle LUKS2 Verschlüsselung, zusammen mit dem GRUB2 Bootloader verwenden kann. Und es werden nicht nur Teile oder einzelner Partitionen, sondern der gesamte Linux Bereich verschlüsselt, also auch /boot und /. Zusätzlich wird das Dateisystem BTRFS verwendet, welches viele Vorteile mit sich bringt.
Inhalt
1. Vorbereitung
Nach dem booten des Arch Linux Images sollte das erstes das entsprechende Tastaturlayout eingestellt werden. Für den deutschen Sprachraum wäre dies:
$ loadkeys de-latin1
Damit sind dann auch die Umlaute verfügbar, sowie ‘z’ und ‘y’ auf der richtigen Position.
Sofern man mit einem HiDPI Monitor arbeitet, sollte man noch eine größere Schriftart eingestellt werden.
$ setfont ter-132n
1.1 Systemzeit einstellen
Als erstes sollte die Systemzeit eingestellt und überprüft werden. Systemzeit über Netzwerk synchronisieren:
$ timedatectl set-ntp true
Und anschließend überprüfen:
$ timedatectl status
Local time: Sat 2022-02-23 07:47:38 UTC
Universal time: Sat 2022-02-23 07:47:38 UTC
RTC time: Sat 2022-02-23 07:47:38
Time zone: UTC (UTC, +0000)
System clock synchronized: yes
NTP service: active
RTC in local TZ: noDie Uhrzeit wird in UTC angezeigt, daher nicht wundern wenn diese entsprechend der eigenen Zeitzone abweicht. Die Zeitzone wird später noch eingestellt.
1.2 BTRFS Tools aktualisieren
Es wird empfohlen, die BTRFS Tools zu aktualisieren.
$ pacman -Syy btrfs-progs
1.3 Installationsfestplatte ermitteln
Jetzt sollte der Namen der Festplatte herausgesucht werden.
$ lsblk
NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINTS loop0 7:0 0 685.2M 1 loop /run/archiso/airootfs sda 8:0 0 32G 0 disk sr0 11:0 1 807.3M 0 rom /run/archiso/bootmnt
In meinem Beispiel sieht man eine verbaute Festplatte SDA, die auch noch nicht partitioniert ist. Die anderen beiden Geräte stammen von dem gebooteten ISO Image. Sollten mehrere Festplatten, bzw. SSDs verbaut sein, würden diese ebenfalls hier angezeigt.
Sollte die Festplatte schon Daten enthalten, könnte die Anzeige auch so aussehen:
NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINTS loop0 7:0 0 685.2M 1 loop /run/archiso/airootfs sda 8:0 0 32G 0 disk ├─sda1 8:1 0 512M 0 part └─sda2 8:2 0 31.5G 0 part sr0 11:0 1 807.3M 0 rom /run/archiso/bootmnt
Hier sind schon zwei Partitionen vorhanden. Diese sollten vor der Installation entfernt werden:
$ sgdisk --zap-all --clear /dev/sda
GPT data structures destroyed! You may now partition the disk using fdisk or other utilities. The operation has completed successfully.
Festplatten, bzw SATA Laufwerke haben normalerweise Namen wie SDA oder SDB, während aktuelle NVMe NVME0N1 oder NVME0N1 heißen. Es gibt auch noch andere Bezeichnungen, je nach Festplattencontroller, die aber heute in privaten Rechnern nur eher selten vorzufinden sind.
2. Festplatte einrichten
In meinem Beispiel habe ich eine 32GB große SATA SSD, die im Rechner unter /dev/sda zu finden ist. Alle weiteren Konfigurieren beziehen sich daher auf diese Bezeichnung. Wenn mehrere Festplatten oder NVMEs verbaut sind, muss der Name entsprechend angepasst werden.
2.1 Festplatte partitionieren
Es werden zwei Partitionen benötigt, einmal für das EFI und das Linux System selber. Die EFI Partition wird später nicht verschlüsselt, weil ansonsten der Rechner, bzw. das UEFI nicht darauf zugreifen könnte. Da dort aber auch keinerlei “interessanten” Informationen gespeichert sind, würde sich eine Verschlüsselung hier auch nicht lohnen.
$ gdisk /dev/sda
Dann gibt man auf die Fragen nacheinander folgendes ein:
o Y n [ENTER] 0 +512M ef00 n [ENTER] [ENTER] [ENTER] 8309 W Y
Das sieht auf der Konsole dann so aus:
GPT fdisk (gdisk) version 1.0.9.1
Partition table scan:
MBR: protective
BSD: not present
APM: not present
GPT: present
Found valid GPT with protective MBR; using GPT.
Command (? for help): o
This option deletes all partitions and creates a new protective MBR.
Proceed? (Y/N): Y
Command (? for help): n
Partition number (1-128, default 1):
First sector (34-67108830, default = 2048) or {+-}size{KMGTP}: 0
Last sector (2048-67108830, default = 67106815) or {+-}size{KMGTP}: +512M
Current type is 8300 (Linux filesystem)
Hex code or GUID (L to show codes, Enter = 8300): ef00
Changed type of partition to 'EFI system partition'
Command (? for help): n
Partition number (2-128, default 2):
First sector (34-67108830, default = 1050624) or {+-}size{KMGTP}:
Last sector (1050624-67108830, default = 67106815) or {+-}size{KMGTP}:
Current type is 8300 (Linux filesystem)
Hex code or GUID (L to show codes, Enter = 8300): 8309
Changed type of partition to 'Linux LUKS'
Command (? for help): w
Final checks complete. About to write GPT data. THIS WILL OVERWRITE EXISTING
PARTITIONS!!
Do you want to proceed? (Y/N): Y
OK; writing new GUID partition table (GPT) to /dev/sda.
The operation has completed successfully.Es wurde als erstes die Festplatte mit GPT initialisiert. Dann wurde die erste Partition mit einer Größe von 512MB angelegt, was für die EFI Daten mehr als ausreichend ist, und die zweite Partition wurde für den Rest eingerichtet.
2.2 EFI Partion formatieren
Die Partition /dev/sda1 für EFI muss im FAT Format formatiert werden:
$ mkfs.vfat -F 32 -n ESP /dev/sda1
2.3 Verschlüsselten LUKS2 Container anlegen
Auf der zweiten Partition /dev/sda2 wird ein verschlüsselter Container im LUKS2 Format angelegt:
$ cryptsetup --use-random luksFormat --type luks2 /dev/sda2
WARNING: Device /dev/sda2 already contains a 'crypto_LUKS' superblock signature. WARNING! ======== This will overwrite data on /dev/sda2 irrevocably. Are you sure? (Type 'yes' in capital letters): YES Enter passphrase for /dev/sda2: Verify passphrase: cryptsetup --use-random luksFormat --type luks2 /dev/sda2 30.47s user 4.22s system 147% cpu 23.559 total
2.3.1 LUKS2 Container öffnen
Damit nun auf diesen Container zugegriffen werden kann, muss dieser geöffnet werden. Dazu muss auch das vorher vergebene Passwort eingegeben werden.
$ cryptsetup luksOpen /dev/sda2 cryptbtrfs
Enter passphrase for /dev/sda2: cryptsetup luksOpen /dev/sda2 cryptbtrfs 6.56s user 0.15s system 110% cpu 6.071 total
2.4 Dateisystem mit BTRFS formatieren
In diesen Container wird nun ein Dateisystem mit BTRFS erstellt. Da BTRFS selber schon einen Logical Volume Manager mitbringt, wird hier nur ein Dateisystem benötigt. Als Label wird hier “archlinux” gewählt. Es kann aber auch jeder andere Name genutzt werden. Und als Devicename wurde hier cryptbtrfs gewählt. Es kann hier auch eine abweichende eigene Bezeichnung gewählt werden. Wichtig ist dann nur, dass später alle Einträge, die auf /dev/mapper/cryptbtrfs verweisen entsprechend angepasst werden:
$ mkfs.btrfs -L archlinux /dev/mapper/cryptbtrfs
btrfs-progs v6.6.3
See https://btrfs.readthedocs.io for more information.
NOTE: several default settings have changed in version 5.15, please make sure
this does not affect your deployments:
- DUP for metadata (-m dup)
- enabled no-holes (-O no-holes)
- enabled free-space-tree (-R free-space-tree)
Label: archlinux
UUID: 5c2ae1d1-26bb-47fc-9371-b6f2a707509f
Node size: 16384
Sector size: 4096
Filesystem size: 31.48GiB
Block group profiles:
Data: single 8.00MiB
Metadata: DUP 256.00MiB
System: DUP 8.00MiB
SSD detected: no
Zoned device: no
Incompat features: extref, skinny-metadata, no-holes, free-space-tree
Runtime features: free-space-tree
Checksum: crc32c
Number of devices: 1
Devices:
ID SIZE PATH
1 31.48GiB /dev/mapper/cryptbtrfs2.5 Subvolumes anlegen
Nun kann das neu erstellte Dateisystem gemountet werden:
$ mount /dev/mapper/cryptbtrfs /mnt
Um anschließend die Subvolumes anlegen zu können. Ich habe hier eine flache Hierarchie gewählt (Daher das ‘@‘ und nicht ‘/‘). Dies kann nach eigenen Vorlieben angepasst werden. Auch welche Verzeichnisse als Subvolumes genutzt werden, kann nach eigenem Geschmack verändert werden. Daher sollte dies hier nur als Beispiel gesehen werden:
$ btrfs subvolume create /mnt/@ $ btrfs subvolume create /mnt/@swap $ btrfs subvolume create /mnt/@opt $ btrfs subvolume create /mnt/@home $ btrfs subvolume create /mnt/@tmp $ btrfs subvolume create /mnt/@log $ btrfs subvolume create /mnt/@cache $ btrfs subvolume create /mnt/@snapshots
Ich habe damit Subvolumes für folgende Mountpoints erzeugt:
/ /swap /opt /home /tmp /var/log /var/cache /.snapshots
Für die Verzeichnisse, in denen sehr viel geschrieben und geändert wird, wird das Copy-on-Write (CoW) noch deaktiviert:
$ chattr +C /mnt/@swap $ chattr +C /mnt/@log $ chattr +C /mnt/@tmp $ chattr +C /mnt/@cache $ chmod 700 /mnt/@swap
2.6 Subvolumes mounten
Zunächst wird das eben gemountete Dateisystem wieder ausgehangen:
$ umount /mnt
Damit anschließend die einzelnen Subvolumes eingehangen werden können. Um sich etwas Tipparbeit zu ersparen, werden die Parameter für den `mount` Befehl in eine Variable geschrieben:
$ export mount_opt="defaults,noatime,autodefrag,compress=zstd:1,inode_cache"
Hier können natürlich auch wieder eigene Anpassungen vorgenommen werden. Als erstes wird das Wurzelverzeichnis ‘/‘ gemountet:
$ mount -o ${mount_opt},subvol=@ /dev/mapper/cryptbtrfs /mntUm dann zunächst die einzelnen Mountpoints anzulegen:
$ mkdir -p /mnt/{swap,opt,home,tmp,.snapshots,var/cache,var/log}Und zum Schluss die restlichen Subvolumes zu mounten:
$ mount -o ${mount_opt},subvol=@swap /dev/mapper/cryptbtrfs /mnt/swap
$ mount -o ${mount_opt},subvol=@opt /dev/mapper/cryptbtrfs /mnt/opt
$ mount -o ${mount_opt},subvol=@home /dev/mapper/cryptbtrfs /mnt/home
$ mount -o ${mount_opt},subvol=@tmp /dev/mapper/cryptbtrfs /mnt/tmp
$ mount -o ${mount_opt},subvol=@log /dev/mapper/cryptbtrfs /mnt/var/log
$ mount -o ${mount_opt},subvol=@cache /dev/mapper/cryptbtrfs /mnt/var/cache
$ mount -o ${mount_opt},subvol=@snapshots /dev/mapper/cryptbtrfs /mnt/.snapshots2.7 EFI Partition mounten
Die Partition für das EFI System muss ebenfalls noch eingehangen werden:
$ mount --mkdir /dev/sda1 /mnt/efi
3. Spiegelserver Liste aktualisieren
Als erstes eine Aktualisierung vornehmen:
$ pacman -Syy
Und das Reflector Paket installieren. Dies sollte eigentlich auf der aktuellen Distribution enthalten sein, aber man weiß ja nie:
$ pacman -S reflector
Zur Vorsicht die aktuelle Datei sichern, falls etwas schief gehen sollte:
$ cp /etc/pacman.d/mirrorlist /etc/pacman.d/mirrorlist.bak
Und dann die Liste aktualisieren:
$ reflector --verbose --protocol https --latest 10 --country Germany --sort rate --save /etc/pacman.d/mirrorlist
[2022-02-23 08:57:45] INFO: rating 10 mirror(s) by download speed [2022-02-23 08:57:45] INFO: Server Rate Time [2022-02-23 08:57:46] INFO: https://mirror.f4st.host/archlinux/ 15132.94 KiB/s 0.56 s [2022-02-23 08:57:46] INFO: https://mirror.moson.org/arch/ 19208.30 KiB/s 0.44 s [2022-02-23 08:57:49] INFO: https://archlinux.thaller.ws/ 3782.60 KiB/s 2.25 s [2022-02-23 08:57:49] INFO: https://mirror.sunred.org/archlinux/ 16019.91 KiB/s 0.53 s [2022-02-23 08:57:50] INFO: https://packages.oth-regensburg.de/archlinux/ 17791.15 KiB/s 0.48 s [2022-02-23 08:57:51] INFO: https://mirror.ubrco.de/archlinux/ 19159.46 KiB/s 0.44 s [2022-02-23 08:57:51] INFO: https://mirrors.niyawe.de/archlinux/ 19122.27 KiB/s 0.44 s [2022-02-23 08:57:52] INFO: https://arch.mirror.zachlge.org/ 18473.32 KiB/s 0.46 s [2022-02-23 08:57:52] INFO: https://mirror.selfnet.de/archlinux/ 19483.14 KiB/s 0.44 s [2022-02-23 08:57:53] INFO: https://arch.unixpeople.org/ 19293.12 KiB/s 0.44 s
4. Arch Linux installieren
4.1 Überprüfen, welche Hardwareplatform verwendet wird
Sollte nicht bekannt sein, ob es sich um eine Intel oder AMD CPU handelt, kann dies mit folgendem Befehl überprüft werden:
$ grep vendor_id /proc/cpuinfo
Danach sollte die Ausgabe in dieser Art aussehen:
vendor_id : AuthenticAMD vendor_id : AuthenticAMD vendor_id : AuthenticAMD vendor_id : AuthenticAMD
Es handelt sich hier also um eine Rechner mit einer AMD CPU (Diese Zeile wird pro CPU Core ausgegeben). Daher sollte auch der AMD Microcode installiert werden. Dazu gibt man folgendes ein:
$ export microcode="amd-ucode"
Sollte es sich aber um eine Intel CPU handeln, dann wird folgendes eingegeben:
$ export microcode="intel-ucode"
Nicht beides eingeben, da der letzte Eintrag der gültige ist und den vorherigen überschreibt!
4.2 Arch Linux Pakete installieren
Nun werden die benötigten Pakete auf die Festplatte überspielt. Ich würde in diesem Schritt nur die wirklich notwendigen Pakete auswählen. Es können natürlich zusätzliche Pakete hier schon angegeben werden. Ich empfehle aber, dies nach der Grundinstallation zu tun:
$ pacstrap -K /mnt base base-devel ${microcode} linux linux-headers linux-firmware openssh git sudo polkit git btrfs-progs efibootmgr mkinitcpio dhcpcd bash-completion vim neovim nano snapper snap-pac zsh mlocate htop net-tools wireless_tools aria2 hping elinks dialog networkmanager wpa_supplicant netctl os-prober dosfstools mtools reflector inetutilsDas dauert nun eine Zeit. Die Pakete werden aus dem Internet herunter geladen und nach /mnt installiert.
==> Creating install root at /mnt
gpg: /mnt/etc/pacman.d/gnupg/trustdb.gpg: trustdb created
gpg: no ultimately trusted keys found
gpg: starting migration from earlier GnuPG versions
gpg: porting secret keys from '/mnt/etc/pacman.d/gnupg/secring.gpg' to gpg-agent
gpg: migration succeeded
==> Generating pacman master key. This may take some time.
gpg: Generating pacman keyring master key...
gpg: directory '/mnt/etc/pacman.d/gnupg/openpgp-revocs.d' created
gpg: revocation certificate stored as '/mnt/etc/pacman.d/gnupg/openpgp-revocs.d/9A337B4B3A90B70827DF43D3F5DE321780347269.rev'
gpg: Done
==> Updating trust database...
gpg: marginals needed: 3 completes needed: 1 trust model: pgp
gpg: depth: 0 valid: 1 signed: 0 trust: 0-, 0q, 0n, 0m, 0f, 1u
==> Installing packages to /mnt
:: Synchronizing package databases...
core 128.9 KiB 704 KiB/s 00:00 [###############################################] 100%
extra 8.3 MiB 14.6 MiB/s 00:01 [###############################################] 100%
resolving dependencies...
...
...
... Sehr lange Ausgabe, daher nur gekürzt wiedergegeben
...
...
(13/17) Reloading system bus configuration...
Skipped: Running in chroot.
(14/17) Warn about old perl modules
(15/17) Updating Neovim help tags...
(16/17) Updating the info directory file...
(17/17) Performing snapper post snapshots for the following configurations...
fatal library error, lookup self
pacstrap -K /mnt base base-devel ${microcode} linux linux-headers openssh gi 33.38s user 36.05s system 59% cpu 1:57.66 total5. Einstellungen nach der Installation
5.1 Swapfile erzeugen
Es wird hier im Beispiel ein 4GB großes Swapfile erzeugt. Dies sollte entsprechend der Ausstattung und dem Einsatz des Rechners angepasst werden:
$ btrfs filesystem mkswapfile --size 4G /mnt/swap/swapfile
create swapfile /mnt/swap/swapfile size 4.00GiB (4294967296)
Anschließend wird dieses Swapfile noch aktiviert:
$ swapon /mnt/swap/swapfile
Es ist natürlich auch möglich, anstatt einer Datei den RAM für SWAP zu verwenden. Hierzu verweise ich auf folgenden Artikel: ZRAM als SWAP
5.2 /etc/fstab erzeugen
Damit die Dateisysteme, bzw. Subvolumes nach dem booten des Rechners auch automatisch eingehangen werden, muss noch die etc/fstab erzeugt werden. Dies kann am einfachsten gemacht werden, indem man den aktuellen Zustand in die Datei schreibt, da ja die entsprechenden Subvolumnes gerade gemountet sind:
$ genfstab -U -p /mnt > /mnt/etc/fstab
5.3 Installiertes System “aktivieren”
Damit man nun auf das gerade installierte System so zugreifen kann, als ob es gerade gestartet wurde, wird ein chroot ausgeführt. Das führt dazu, dass alles, was jetzt noch unter /mnt hängt, dann direkt unter / läuft. Das von USB gebootete Image wird also quasi “ausgeblendet”:
$ arch-chroot /mnt /bin/bash
5.4 Kontrollieren ob alle Subvolumes vorhanden sind
Es sollte noch einmal kontrolliert werden, ob bis hierhin alles richtig verlaufen ist:
$ lsblk
Die Ausgabe sollte dann ungefähr so aussehen:
NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINTS
loop0 7:0 0 685.2M 1 loop
sda 8:0 0 32G 0 disk
|-sda1 8:1 0 512M 0 part /efi
`-sda2 8:2 0 31.5G 0 part
`-cryptbtrfs 254:0 0 31.5G 0 crypt /.snapshots
/var/cache
/var/log
/tmp
/home
/opt
/swap
/
sr0 11:0 1 807.3M 0 rom 5.5 Zeitzone festlegen
Damit das Datum und die Uhrzeit auch richtig angezeigt wird, muss noch eine Zeitzone eingestellt werden. Für Deutschland wäre dies:
$ ln -s /usr/share/zoneinfo/Europe/Berlin /etc/localtime
5.6 /etc/adjtime erzeugen und Hardware Uhr auf UTC einstellen
Die Systemzeit sollte weiterhin mit UTC laufen, damit die Zeitzone auch richtig funktioniert:
$ hwclock --systohc --utc
5.7 Spracheinstellungen
Damit die Konsole und die Ausgabe ebenfalls auf Deutsch funktioniert, müssen noch diverse Einstellungen vorgenommen werden. Als erstes muss die Datei /etc/locale.gen editiert werden:
$ vim /etc/locale.gen
Dort kommentiert man die Zeile für die deutsche und englische Sprache aus:
de_DE.UTF-8 UTF-8 en_US.UTF-8 UTF-8
Und erzeugt die entsprechenden Sprachdateien:
$ locale-gen
Generating locales... de_DE.UTF-8... done en_US.UTF-8... done Generation complete.
Und fügt diese der Datei /etc/locale.conf hinzu:
$ echo LANG=de_DE.UTF-8 > /etc/locale.conf $ echo LANGUAGE=de_DE.UTF-8 >> /etc/locale.conf
Ebenso das deutsche Tastaturlayout in die Datei /etc/vconsole:
$ echo KEYMAP=de-latin1 > /etc/vconsole.conf
5.8 Hostnamen festlegen
Der Hostname, hier in dem Beispiel ‘archvm‘ wird in die Datei /etc/hostname eingetragen:
$ echo archvm > /etc/hostname
5.9 /etc/hosts konfigurieren
Und zusätzlich noch die Datei /etc/hosts konfigurieren:
$ vim /etc/hosts
Dort folgende Einträge hinzufügen:
127.0.0.1 localhost ::1 localhost 127.0.0.1 archvm
5.10 Networkmanager & SSHD aktivieren
Damit nach einem Neustart das Netzwerk funktioniert und der Zugrif per ssh möglich ist, müssen die entsprechenden Dienste aktiviert werden:
$ systemctl enable NetworkManager $ systemctl enable sshd
5.11 Default Editor systemweit festlegen
Damit diverse Linux Tools, wie zum Beispiel visudo den bevorzugten Editor nutzen, kann dieser voreingestellt werden. Hier wird der NeoVIM voreingestellt. Es kann auch jeder andere Editor hier gewählt werden:
$ echo "EDITOR=nvim" > /etc/environment $ echo "VISUAL=nvim" >> /etc/environment
5.12 Passwort für Benutzer “root” setzen
Bisher ist noch Passwort für den root User vergeben worden:
$ passwd
6 Eigenen Benutzer hinzufügen
Es wird Zeit, sich einen eigenen User anzulegen, der zusätzlich Superuser Rechte bekommt. Als erstes wird der Benutzer angelegt und direkt in die entsprechenden Gruppen eingefügt. In diesem Beispiel wird ein Benutzer mit dem Namen ‘archuser‘ angelegt, dieser kann beliebig auf die eigenen Bedürfnisse angepasst werden:
$ useradd -m -g users -G wheel,storage,power -s /bin/bash archuser
Danach wird ein Passwort für diesen Benutzer vergeben:
$ passwd archuser
Damit dieser Benutzer auch Superuserrechte bekommt, muss in der Datei /etc/sudoers die Gruppe wheel freigeschaltet werden, zu der der Benutzer ja hinzugefügt wurde. Dies kann entweder über den Befehl sed passieren:
$ sed -i "s/# %wheel ALL=(ALL:ALL) ALL/%wheel ALL=(ALL:ALL) ALL/" /etc/sudoers
Oder über folgenden Befehl ruft man den Editor auf:
$ EDITOR=nvim visudo
Und kommentiert folgende Zeile aus:
# %wheel ALL=(ALL:ALL) ALL
7. PARU Tool installieren
Zum leichteren Zugriff auf das AUR (Arch User Repository), welches wir später für einen modifizierten GRUB Bootlader benötigen, installieren wir das Tool PARU-BIN:
$ sudo su - archuser $ cd /tmp $ git clone https://aur.archlinux.org/paru-bin.git $ cd paru-bin $ makepkg -si
8. GRUB mit LUKS2 Support installieren
Der aktuelle GRUB Bootlader hat leider noch keine LUKS2 Unterstützung. Man könnte also entweder die Festplatte in dem alten LUKS1 Format nutzen, oder einen entsprechend modifizierten GRUB installieren. Ich habe mich für letzteres entschieden. Dies ist auch der Grund für das vorherige PARU Tool:
$ paru -S grub-improved-luks2-git --noconfirm
Die Installation dauert einige Zeit. Es werden diverse Dateien heruntergeladen und kompiliert. Je nach Rechner kann dies mehrere Minuten dauern.
Danach kann wieder zurück zum root User gewechselt werden:
$ exit
9. Schlüsseldatei erzeugen für einfache Passwortabfrage
Damit beim booten nicht zweimal nach dem Passwort gefragt wird, wird eine Schlüsseldatei erzeugt und in das initramfs geschrieben.
$ dd bs=512 count=4 iflag=fullblock if=/dev/random of=/crypt_keyfile.bin $ chmod 600 /crypt_keyfile.bin $ cryptsetup -v luksAddKey --type luks2 /dev/sda2 /crypt_keyfile.bin
Das beim erzeugen des LUKS2 Container vergebene Passwort muss hier angegeben werden.
10. Initramfs / mkinitcpio konfigurieren
Damit das System den verschlüsselten Container booten kann, muss das initramfs entsprechend erzeugt werden. Dazu wird die Datei /etc/mkinitcpio.conf angepasst:
$ vim /etc/mkinitcpio.conf
In dieser Datei müssen folgende Einträge hinzugefügt, bzw. ersetzt werden:
HOOKS=(...) --> HOOKS=(base udev kms keyboard autodetect keymap consolefont modconf block encrypt btrfs filesystems fsck) MODULES=() --> MODULES=(btrfs) FILES=() --> FILES=(/crypt_keyfile.bin)
In “HOOKS=(…)” stehen schon Einträge drin. Diese einfach komplett durch die neue Zeile ersetzen.
Danach kann das initramfs erzeugt werden:
$ mkinitcpio -P
==> Building image from preset: /etc/mkinitcpio.d/linux.preset: 'default' ==> Using default configuration file: '/etc/mkinitcpio.conf' -> -k /boot/vmlinuz-linux -g /boot/initramfs-linux.img --microcode /boot/amd-ucode.img ==> Starting build: '5.10.10-arch1-1' -> Running build hook: [base] -> Running build hook: [udev] -> Running build hook: [kms] ==> WARNING: Possibly missing firmware for module: 'ast' -> Running build hook: [keyboard] ==> WARNING: Possibly missing firmware for module: 'xhci_pci' -> Running build hook: [autodetect] -> Running build hook: [keymap] -> Running build hook: [consolefont] ==> WARNING: consolefont: no font found in configuration -> Running build hook: [modconf] -> Running build hook: [block] -> Running build hook: [encrypt] -> Running build hook: [btrfs] -> Running build hook: [filesystems] -> Running build hook: [fsck] ==> Generating module dependencies ==> Creating zstd-compressed initcpio image: '/boot/initramfs-linux.img' ==> Image generation successful ==> Building image from preset: /etc/mkinitcpio.d/linux.preset: 'fallback' ==> Using default configuration file: '/etc/mkinitcpio.conf' -> -k /boot/vmlinuz-linux -g /boot/initramfs-linux-fallback.img -S autodetect --microcode /boot/amd-ucode.img ==> Starting build: '5.10.10-arch1-1' -> Running build hook: [base] -> Running build hook: [udev] -> Running build hook: [kms] ==> WARNING: Possibly missing firmware for module: 'ast' -> Running build hook: [keyboard] ==> WARNING: Possibly missing firmware for module: 'xhci_pci' -> Running build hook: [keymap] -> Running build hook: [consolefont] ==> WARNING: consolefont: no font found in configuration -> Running build hook: [modconf] -> Running build hook: [block] ==> WARNING: Possibly missing firmware for module: 'aic94xx' ==> WARNING: Possibly missing firmware for module: 'bfa' ==> WARNING: Possibly missing firmware for module: 'qed' ==> WARNING: Possibly missing firmware for module: 'qla1280' ==> WARNING: Possibly missing firmware for module: 'qla2xxx' ==> WARNING: Possibly missing firmware for module: 'wd719x' -> Running build hook: [encrypt] -> Running build hook: [btrfs] -> Running build hook: [filesystems] -> Running build hook: [fsck] ==> Generating module dependencies ==> Creating zstd-compressed initcpio image: '/boot/initramfs-linux-fallback.img' ==> Image generation successful
Die Warnungen können ignoriert werden.
11. GRUB Bootloader installieren
11.1 UUID für den LUKS2 Container ermitteln
Als erstes wird die UUID des weiter oben erzeugten LUKS2 Container benötigt. Diese kann mit dem Befehl blkid ermittelt werden. Hier wird auch die entsprechende Partition angegeben, in diesem Beispiel also /dev/sda2:
$ blkid -s UUID -o value /dev/sda2
01b7f96e-fc78-4d13-a974-d36384cacf0d
Diese Zahl wird gleich noch benötigt, daher gut aufbewahren.
11.2 GRUB konfigurieren
Jetzt wird der Bootloader entsprechend konfiguriert. Dazu die Konfigurationsdatei /etc/default/grub editieren:
$ vim /etc/default/grub
Als erstes die Zeilen #GRUB_ENABLE_CRYPTODISK=y und #GRUB_DISABLE_SUBMENU=y durch entfernen des # vor den Zeilen auskommentieren.
Danach die Zeile GRUB_CMDLINE_LINUX_DEFAULT="..." (Dort werden ggf. schon Einträge enthalten sein) um folgenden Eintrag erweitern: cryptdevice=UUID=01b7f96e-fc78-4d13-a974-d36384cacf0d:cryptbtrfs.
Wichtig ist, die hier angegebene Zahlenkolonne durch die in Kapitel 11.1 ausgelesene zu ersetzen. Also dieses Beispiel nicht 1:1 per Cut&Paste eintragen, da dies dann nicht funktionieren würde.
In der Zeile GRUB_CMDLINE_LINUX="" wird zwischen den Anführungsstrichen noch cryptkey=rootfs:/crypto_keyfile.bin eingefügt.
Und zum Schluss noch bei dem Eintrag GRUB_PRELOAD_MODULES="part_gpt part_msdos" den Parameter luks2 hinzufügen.
Meine /etc/default/grub sieht dann wie folgt aus:
# GRUB boot loader configuration GRUB_DEFAULT=0 GRUB_TIMEOUT=5 GRUB_DISTRIBUTOR="Arch" GRUB_CMDLINE_LINUX_DEFAULT="loglevel=3 quiet cryptdevice=UUID=01b7f96e-fc78-4d13-a974-d36384cacf0d:cryptbtrfs" GRUB_CMDLINE_LINUX="cryptkey=rootfs:/crypt_keyfile.bin" # Preload both GPT and MBR modules so that they are not missed GRUB_PRELOAD_MODULES="part_gpt part_msdos luks2" # Uncomment to enable booting from LUKS encrypted devices GRUB_ENABLE_CRYPTODISK=y # Set to 'countdown' or 'hidden' to change timeout behavior, # press ESC key to display menu. GRUB_TIMEOUT_STYLE=menu # Uncomment to use basic console GRUB_TERMINAL_INPUT=console # Uncomment to disable graphical terminal #GRUB_TERMINAL_OUTPUT=console # The resolution used on graphical terminal # note that you can use only modes which your graphic card supports via VBE # you can see them in real GRUB with the command `vbeinfo' GRUB_GFXMODE=auto # Uncomment to allow the kernel use the same resolution used by grub GRUB_GFXPAYLOAD_LINUX=keep # Uncomment if you want GRUB to pass to the Linux kernel the old parameter # format "root=/dev/xxx" instead of "root=/dev/disk/by-uuid/xxx" #GRUB_DISABLE_LINUX_UUID=true # Uncomment to disable generation of recovery mode menu entries GRUB_DISABLE_RECOVERY=true # Uncomment and set to the desired menu colors. Used by normal and wallpaper # modes only. Entries specified as foreground/background. #GRUB_COLOR_NORMAL="light-blue/black" #GRUB_COLOR_HIGHLIGHT="light-cyan/blue" # Uncomment one of them for the gfx desired, a image background or a gfxtheme #GRUB_BACKGROUND="/path/to/wallpaper" #GRUB_THEME="/path/to/gfxtheme" # Uncomment to get a beep at GRUB start #GRUB_INIT_TUNE="480 440 1" # Uncomment to make GRUB remember the last selection. This requires # setting 'GRUB_DEFAULT=saved' above. #GRUB_SAVEDEFAULT=true # Uncomment to disable submenus in boot menu GRUB_DISABLE_SUBMENU=y
Bitte darauf achten, diese Datei nicht 1:1 zu übernehmen, da die UUID bei jeder Installation anders sein wird.
11.3 GRUB installieren
Als erstes wird der Bootloader installiert:
$ grub-install --target=x86_64-efi --efi-directory=/efi --bootloader-id=GRUB --recheck
Und anschließend noch entsprechend konfiguriert:
$ grub-mkconfig -o /boot/grub/grub.cfg
Generating grub configuration file ... Found linux image: /boot/vmlinuz-linux Found initrd image: /boot/amd-ucode.img /boot/initramfs-linux.img Found fallback initrd image(s) in /boot: initramfs-linux-fallback.img Warning: os-prober will not be executed to detect other bootable partitions. Systems on them will not be added to the GRUB boot configuration. Check GRUB_DISABLE_OS_PROBER documentation entry. Adding boot menu entry for UEFI Firmware Settings ... done
Jetzt sollte noch kontrolliert werden, ob auch die entsprechenden Module luks2 und cryptodisk eingebunden wurden:
$ grep "luks\|cryptodisk" /boot/grub/grub.cfg
Die Ausgabe sollte dann in etwas so aussehen. Wichtig ist, dass dort insmod cryptodisk und insmod luks2 zu finden ist:
insmod luks
insmod cryptodisk
insmod luks2
insmod cryptodisk
insmod luks2
insmod cryptodisk
insmod luks2Dann noch dem /boot nur Rechte für root geben:
$ chmod 700 /boot
12. Reboot
Noch die chroot Umgebung verlassen:
$ exit
Und den Rechner neu starten:
$ reboot
Nach dem Neustart sollte eine Passwortabfrage erfolgen, die in etwas so aussieht:
Enter passphrase for hd0.gpt (01b7f96e-fc78-4d13-a974-d36384cacf0d): _
Hier wird nun das beim erstellen des LUKS2 Containers angegeben Kennwort eingegeben und mit [ENTER] bestätigt. Danach sollte das GRUB Bootmenü kommen und der Rechner ganz normal booten.
Nach der Passwortabfrage dauert es je nach Hardware ein paar Sekunden, bis das GRUB Bootmenü erscheint. Das ist ganz normal und liegt an der Entschlüsselung.
FERTIG
Wer übrigens lieber Manjaro nutzt, für den habe ich diese Anleitung entsprechend angepasst.
