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.
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.