Arch Linux auf dem Notebook mit dm-crypt und Btrfs

Arch Linux auf dem Notebook mit dm-crypt und Btrfs

Hintergrund: Als ich mir neulich ein neues Notebook gekauft habe fiel die Wahl auf ein Gerät der Firma Tuxedo, weil ich sichergehen wollte, dass es linuxkompatible Hardwarekomponenten verbaut hat. Letztendlich ist es ein Tuxedo InfinityBook S15 Gen7 geworden.

Als es dann ankam, stellte sich die Frage, welche Linux-Distribution installiert werden soll. Zunächst entschied ich mich für das quasi hauseigene TUXEDO OS. Das ist schnell installiert, enthält bereits die tuxedoeigenen Module und Programme und es verwendet meine derzeit bevorzugte Desktopumgebung KDE Plasma. Und der Ubuntu 22.04 Unterbau garantiert eine gewisse Stabilität. Leider habe ich mich recht schnell dabei ertappt, dass ich mehr und mehr 3rd party Repositories eingebunden habe, um aktuellere Softwareversionen zu erhalten. Die Version von KDE Plasma war auch noch auf Ubuntu 22.04 Stand (5.24.x) und eine klare Aussage, ob/wann für TUXEDO OS die KDE-Version aktualisiert wird, gab es leider nicht.

Also habe ich dann doch beschlossen, Arch Linux zu installieren, auch wenn es etwas mehr Aufwand bedeutet. Im Folgenden möchte ich also die Installationsprozedur wie ich sie für mich gewählt habe, beschreiben. Hier führen natürlich viele Wege nach Rom und es gibt kein hartes Richtig oder Falsch. Dies soll also nur als grober Leitfaden dienen, den jede(r) nach eigenen Vorlieben anpassen kann.

Da Arch Linux sehr vielseitige Setups erlaubt, habe ich vorab einige Entscheidungen treffen müssen. Für folgende Eckpunkte habe ich mich entschieden:

  • Komplettverschlüsselung der Festplatte (außer /boot)
  • Als Dateisystem soll Btrfs verwendet werden
  • Verwendung eine Swapdatei (nicht: Swappartition)
  • Als Bootloader soll systemd-boot in Einsatz kommen

Selbstverständlich habe ich mich am Installation Guide von Arch Linux orientiert, den ich hier zur Vertiefung wärmstens empfehlen möchte.

Installationsmedium erstellen und Vorarbeiten

Zunächst lädt man sich von der Downloadseite über einen der Spiegelserver ein ISO-Image des Arch Linux Livesystems herunter. Dieses Image wird immer wieder aktualisiert; zum Zeitpunkt meiner Installation war dies archlinux-2022.11.01-x86_64.iso. Mit Tools wie etcher oder usbimager wird damit ein USB-Stick zum bootfähigen Installationsmedium, das auch später noch für Reparaturarbeiten hilfreich sein kann. Hiervon wird also nun gebootet (UEFI) und wir finden uns nun in einer etwas spartanischen Konsolenumgebung wieder.

So präsentiert sich das Livesystem

Die erste Aktion ist nun, mittels loadkeys de-latin1 das Tastaturlayout auf Deutsch umzustellen. Es ist auch kein Fehler, schonmal für eine Internetverbindung zu sorgen. Über dem Commandprompt informiert Arch Linux bereits, dass man dafür iwctl verwenden kann, wenn man eine Wi-Fi Verbindung aufbauen möchte. Nach Eingabe von iwctl befindet man sich in einer Shell, in der man sich mittels station DEVICE connect SSID im WLAN anmelden kann. DEVICE ist der Name des WLAN-Gerätes, etwa wlan0. SSID ist natülich der Name des WLAN-Netzwerks. Ist das gemacht, verlässt man mit exit die iwctl-Shell wieder.

Partitionierung und Verschlüsselung

Ich bevorzuge eine übersichtliche Einteilung der Festplatte mit nur wenigen Partitionen. Tatsächlich erstellen wir hier lediglich zwei: Eine kleine EFI-Partition, ohne die ein UEFI-System nicht auskommt und eine große Partition, die im nächsten Schritt verschlüsselt wird und auf der das eigentliche System installiert wird. Am Einfachsten geht die Partitionierung mit dem guten alten fdisk von der Hand. Da ich die Installation in einer virtuellen Maschine nochmal nachvollzogen habe, verwende ich hier der Einfachheit halber das Device /dev/vda. Ein aktuelles Notebook dürfte aber eher eine M.2 NVMe enthalten. Ein Devicename von /dev/nvme0n1 o. ä. dürfte also wahrscheinlicher sein. Hier, exemplarisch, die Prozedur mit fdisk:

root@archiso ~ # fdisk /dev/vda
Welcome to fdisk (util-linux 2.38.1)
[…]

Command (m for help): g
Created a new GPT disklabel (GUID: xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx).

Command (m for help): n
Patition number (1-128, default 1):
First sector (2048-41943006. default 2048):
Last sector, […]: +512M
[…]

Command (m for help): t
Selected partition 1
Partition type or alias (type L to list all): 1
Changed type of partition 'Linux filesystem' to 'EFI System'.

Command (m for help): n
Patition number (2-128, default 2):
First sector (1050624-41943006, default 1050624):
Last sector, […]: 
[…]

Command (m for help): w
The partition table has been altered.
Calling ioctl() to re-read partition table.
Syncing disks.

Die EFI-Partition formatieren wir gleich mit FAT32:

root@archiso ~ # mkfs.fat -F32 /dev/vda1

Jetzt muss die zweite, große Partition mit cryptsetup verschlüsselt werden:

root@archiso ~ # cryptsetup luksFormat /dev/vda2

WARNING!
========
This will overwrite data on /dev/vda2 irrevocably.

Are you sure? (Type 'yes' in calital letters): YES
Enter passphrase for /dev/vda2: 
Verify passphrase:
[…]

luksFormat bietet mannigfaltige Optionen, mit denen man den Verschlüsselungsalgorithmus und anderes anpassen kann. Doch kann man auch einfach, wie hier gezeigt, die Standardeinstellungen verwenden.

Btrfs

Jetzt kommt das Dateisystem Btrfs zum Einsatz. Dank Subvolumes kann man eine Partition praktisch einteilen, ohne eine feste Größe wie bei “echten” Partitionen angeben zu müssen. Außerdem kann man von den Subvolumes später Snapshots erstellen und davon dann wiederum konsistente Backups durchführen. Auch hier möchte ich es übersichtlich halten und nur folgende Subvolumes erstellen:

  • @ (für das System, also /)
  • @home (für die Homeverzeichnisse, also /home)
  • @swap (für die Swapdatei, dazu später mehr)

Zunächst aber muss die verschlüsselte Partition geöffnet werden, damit wir das Dateisystem darauf erstellen können. Anschließend wird das Btrfs-System gemountet, damit darin die Subvolumes erstellt werden können.

Los geht’s:

root@archiso ~ # cryptsetup open /dev/vda2 dm-0
Enter passphrase for /dev/vda2:
root@archiso ~ # mkfs.btrfs /dev/mapper/dm-0
btrfs-progs v6.0
[…]

root@archiso ~ # mount /dev/mapper/dm-0 /mnt
root@archiso ~ # btrfs subvolume create /mnt/@
Create subvolume '/mnt/@'
root@archiso ~ # btrfs subvolume create /mnt/@home
Create subvolume '/mnt/@home'
root@archiso ~ # btrfs subvolume create /mnt/@swap
Create subvolume '/mnt/@swap'
root@archiso ~ # umount /mnt

Jetzt können die Subvolumes (und die EFI-Partition) entsprechend ihrer Verwendung gemountet werden:

root@archiso ~ # mount -o compress=zstd,subvol=@ /dev/mapper/dm-0 /mnt
root@archiso ~ # mount --mkdir -o compress=zstd,subvol=@home /dev/mapper/dm-0 /mnt/home
root@archiso ~ # mount --mkdir /dev/vda1 /mnt/boot

Installation essentieller Pakete

Jetzt wird es langsam spannend, denn nun können wir die ersten Arch Linux Pakete nach /mnt installieren. Hier dürfen die btrfs-progs nicht vergessen werden. Auch kann man gleich einen Netzwerkmanager und einen Editor installieren. Bei mir sieht das Kommando hierfür so aus:

pacstrap -K /mnt base linux linux-firmware btrfs-progs networkmanager vim man-db man-pages

Konfiguration des Arch Systems

Wenn die Pakete installiert wurden, ist es Zeit, das System, das sich nun unter /mnt befindet, einzurichten. Zunächst erstellen wir dort eine /etc/fstab, basierend auf den aktuellen Mountpunkten:

root@archiso ~ # genfstab -U /mnt >> /mnt/etc/fstab

Jetzt wechseln wir in das neue System, in eine chroot-Umgebung, damit wir direkt dort die restlichen Einstellungen vornehmen können:

root@archiso ~ # arch-chroot /mnt

Zeitzone

Zunächst ein paar Zeit-Einstellungen:

[root@archiso /]# ln -sf /usr/share/zoneinfo/Europe/Berlin /etc/localtime
[root@archiso /]# hwclock --systohc

Lokalisation

In /etc/locale.gen entfernen wir bei en_US.UTF-8 UTF-8 und de_DE.UTF-8 UTF-8 die Kommentarzeichen und erstellen die locales:

[root@archiso /]# locale-gen

Dann erstellen wir die Datei /etc/locale.conf mit dem Inhalt LANG=de_DE.UTF-8. Außerdem erstellen wir die Datei /etc/vconsole.conf mit dem Inhalt KEYMAP=de-latin1.

Netzwerkkonfiguration

Schließlich tragen wir in die Datei /etc/hostname noch den Namen des Rechners ein, z. B. myhostname. Außerdem ist da noch /etc/hosts:

Static table lookup for hostnames.
# See hosts(5) for details.
127.0.0.1       localhost.localdomain   localhost
::1             localhost.localdomain   localhost
127.0.0.1       myhostname.localdomain  myhostname

Bootloader

Als Bootloader verwende ich nicht grub, sondern systemd-boot, da hier die Konfiguration einfacher von der Hand geht und der Bootloader eh mit systemd mitkommt. Zunächst muss er installiert werden:

[root@archiso /]# bootctl install

Das erstellt einige Verzeichnisse und Dateien unter /boot/EFI sowie unter /boot/loader.

In /boot/loader/loader.conf habe ich folgende Einträge gemacht, damit etwa arch.conf standardmäßig vorausgewählt ist und nach 3 Sekunden automatisch gebootet wird:

default arch.conf
timeout 3
console-mode max
editor no

Und in /boot/loader/entries werden noch zwei Dateien, also Einträge für das Bootloadermenü, erstellt:

arch.conf:

title   Arch Linux
linux   /vmlinuz-linux
initrd  /intel-ucode.img
initrd  /initramfs-linux.img
options rd.luks.name=xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx=dm-0 root=/dev/mapper/dm-0 rootflags=subvol=@ rw quiet

arch-fallback.conf:

title   Arch Linux (fallback initramfs)
linux   /vmlinuz-linux
initrd  /intel-ucode.img
initrd  /initramfs-linux-fallback.img
options rd.luks.name=xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx=dm-0 root=/dev/mapper/dm-0 rootflags=subvol=@ rw quiet

In beiden Fällen entspricht xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx der UUID der verschlüsselten Partition, welche mittels blkid ermittelt werden kann.

initrd /intel-ucode.img bindet die Microcode Updates für die CPU ein – in diesem Fall Intel. Dazu muss das Paket intel-ucode installiert werden:

[root@archiso /]# pacman -S intel-ucode

Für AMD-CPUs steht das Paket amd-ucode zur Verfügung.

Initramfs

Das Initramfs ist ein komprimiertes Archiv, das für den Systemstart benötigte Dateien enthält. Hier müssen wir aufpassen! In /etc/mkinitcpio.conf müssen einige Anpassungen gemacht werden, damit die verschlüsselte Partition eingebunden werden kann.

Die MODULES-Zeile sollte so aussehen: MODULES=(btrfs).

Die HOOKS-Zeile habe ich für die systemd-Variante angepasst (näheres siehe Arch Linux-Wiki): HOOKS=(base systemd autodetect keyboard sd-vconsole modconf block sd-encrypt filesystems fsck)

Schlussendlich erstellen wir die Initramfs noch:

[root@archiso /]# mkinitcpio -P

Passwort

Damit wir uns nachher am System einloggen können, müssen wir noch das Passwort für root setzen. Das machen wir mit dem Kommando passwd.

Reboot!

Jetzt ist es geschafft! Wir verlassen die chroot-Umgebung mit exit und unmounten /mnt mit umount -R /mnt. Mit reboot wird das System neu gestartet. Zu Beginn des Bootprozesses wird das Passwort für die Entschüsselung der Festplatte abgefragt. Anschließend sehen wir das Login-Prompt und wir können uns als root anmelden.

Als Allererstes stellen wir wieder eine Internetverbindung her. Da wir den Network Manager installiert haben, aktivieren wir diesen nun:

[root@myhostname ~]# systemctl enable --now NetworkManager

Die eigentliche Internetverbindung können wir nun recht bequem mit nmtui herstellen.

Damit sich bei neuen systemd-Versionen der Bootloader automatisch aktualisiert, müssen wir noch den entsprechenden Dienst aktivieren:

[root@myhostname ~]# systemctl enable --now systemd-boot-update

Swap

Der Einfachheit halber habe ich bisher das Erstellen des Swapfiles verschwiegen, weil wir es jetzt, da das System problemlos läuft, in Ruhe nachholen können. In /etc/fstab fügen wir folgende Einträge noch ein (natürlich auch hier die eigentliche UUID verwenden):

# swap
UUID=xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx       /swap           btrfs           rw,noatime,compress=zstd:3,ssd,space_cache=v2,subvol=/@swap    0 0
/swap/swapfile                                   none           swap            defaults 0 0

Außerdem mounten wir das Ganze nach /swap und erstellen darin ein Swapfile, nachdem wir das Verzeichnis mit dem NO_COW-Flag versehen haben:

[root@myhostname ~]# mkdir /swap && mount /swap
[root@myhostname ~]# chattr +C /swap
[root@myhostname ~]# dd if=/dev/zero of=/swap/swapfile bs=1M count=4096 status=progress

Jetzt müssen wir noch die Permissions anpassen und die Datei für Swap formatieren. Schließlich aktivieren wir das Swapfile:

[root@myhostname ~]# chmod 0600 /swap/swapfile
[root@myhostname ~]# mkswap -U clear /swap/swapfile
[root@myhostname ~]# swapon /swap/swapfile

Schluss

Noch ein Wort zum Tuxedo Notebook: Im AUR, dem Arch User Repository, gibt es die Pakete tuxedo-control-center-bin und tuxedo-keyboard-dkms. Mit ersterem kann man u. a. die Performance- und Lüftereinstellungen komfortabel festlegen. Letzteres installiert die Treiber für die Tastatur. Damit funktionieren dann auch die Tastenkombinationen, um etwa die LED-Beleuchtung zu justieren. Hier bitte nicht vergessen, vorab die linux-headers zu installieren. Wie Pakete aus dem AUR installiert werden, ist übrigens auch sehr gut beschrieben. Damit ist die minimale Einrichtung des Notebooks abgeschlossen. Nun haben wir ein Notebook mit aktuellem Linux und aktuellen Softwarepakten. Und Hardware, die komplett mit Linux funktioniert.

Es gäbe nun noch viele Möglichleiten, um das System einzurichten und zu verfeinern. Viele Pakete wollen noch installiert werden. Eine grafische Benutzeroberfläche wie etwa KDE Plasma möchte man sicherlich auch haben. An dieser Stelle verweise jedoch nochmals auf das hervorragende Wiki von Arch Linux. Hier findet man wirklich zu jedem Anliegen die passende Beschreibung. Insbesondere beim Setup eines Systems wie dem unseren hier, also die Kombination aus Verschlüsselung, Btrfs und systemd-boot, findet man manchmal in der Dokumentation den Wald vor lauter Bäumen nicht. Ich hoffe, dass die Anleitung hier als kleiner Leitfaden dienen kann, um es selbst einmal mit Arch Linux zu versuchen.