ArchLinux auf einem Laptop installieren (mit Verschlüsselung)

Ich installiere ArchLinux auf eine verschlüsselte Partition auf meinem Laptop
Arch
ubuntuusers
Autor:in

Joe Slam

Veröffentlichungsdatum

9. Februar 2024

Geändert

21. Februar 2024

In diesem Blogpost möchte ich zeigen, wie ich ArchLinux auf einem Laptop installiere. Hierbei erfolgt die Installation auf eine verschlüsselte Partition, was bei tragbaren Geräten empfehlenswert ist. So fallen keine Daten in falsche Hände, falls das Gerät geklaut oder vergessen wird.

Image auf Stick flashen

  • Lade dir ein aktuelles Arch-Image herunter, siehe https://archlinux.org/download/
  • Stecke einen USB-Stick in dein Gerät und checke dessen /dev/-Adresse mittels
$ lsblk

Das kann dann z.B. so aussehen:

NAME            MAJ:MIN RM   SIZE RO TYPE  MOUNTPOINTS  
sda             259:0    0 931,5G  0 disk
sdb               8:0    1   7,4G  0 disk 

In diesem Beispiel ist sda die Festplatte, und sdb der USB-Stick. Bei euch kann das durchaus anders aussehen.

  • Flashe das Arch-Image auf den Stick, z.B. mittels
$ dd if=archlinux*.iso of=/dev/sdb

wobei sdb bei euch evtl. entsprechend angepasst werden muss.

booten vom Stick

Stecke den Stick in den Laptop, und wähle beim Starten den Stick als Bootquelle aus. Bei mir funktioniert das, indem ich F12 beim Starten gedrückt halte.

Es sollte sich recht bald das Arch-Bootmenu melden

Wähle den ersten Eintrag aus und warte, bis dich die Kommandozeile begrüßt.

Netzwerkverbindung herstellen

Ist Arch gestartet, stellen wir als erstes eine Netzwerkverbindung her. Das Netzwerk brauchen wir, um frische Installationspakete zu holen, aber auch, um uns gleich per SSH auf die neue Kiste einzuloggen.

LAN

Wenn ein LAN-Kabel bereit liegt, kann dieses einfach eingesteckt werden, und die Verbindung sollte direkt funktionieren.

WLAN

Möchtet ihr euch mit einem WLAN verbinden, geht dies am Einfachsten mit dem Befehl

$ iwctl

Um den WLAN-Devicenamen herauszufinden hilft der Befehl

$ devices list

Meistens heisst das Device wlan0.

Stelle eine Verbindung zum WLAN her mittels

$ station wlan0 connect <SSID>

Gib das Passwort des WLANs ein. Wenn alles fertig ist, verlasse das Proggi mittels

$ exit

SSH

Ich verbinde mich an dieser Stelle gerne mittels SSH auf den Laptop. Stelle sicher, dass sshd läuft,

$ systemctl start sshd

Setze ein temporäres Admin-Passwort mittels

$ passwd

Finde die IP-Adresse des Laptops heraus, zB mittels

$ ip a

Logge dich von einem anderen PC auf die neue Kiste ein mittels

$ ssh root@IP-ADRESSE

Partitionierung der Festplatte

Nun partitionieren wir die Festplatte. Wir wollen 2 Partitionen erstellen,

  • eine EFI-Partition zum Booten,
  • und eine verschlüsselte root-Partition für das Archsystem.

Zunächst finden wir wieder die /dev/-Bezeichnungen der Laptopfestplatte heraus mittels

$ lsblk
NAME            MAJ:MIN RM   SIZE RO TYPE  MOUNTPOINTS
sda             259:0    0 931,5G  0 disk 
sdb               8:0    1   7,4G  0 disk  
├─sdb1            8:1    1   917M  0 part  
└─sdb2            8:2    1    15M  0 part  

In diesem Beispiel ist sda die Festplatte des Laptops und sdb der Boot-Stick. Wir wollen also /dev/sda partitionieren.

Starte gdisk mittels

$ gdisk /dev/sda

Wir können mit p schauen, welche Partitionen schon auf der Platte sind. Meine Platte ist neu und leer, und daher gibt es nichts zu sehen. Möchtet ihr eine bereits gebrauchte Festplatte benutzen, könnt ihr die vorhandenen Partitionen mittels d löschen.

Wir erstellen eine neue Partition mittels n.

  • die erste Partition wird unsere Boot-Partition.
  • die voreingestellte Partitionsnummer 1 ist korrekt, so dass wir einfach ENTER drücken können.
  • ebenfalls korrekt ist der erste Sektor. Auch diesen können wir mittels ENTER bestätigen.
  • beim “letzten Sektor” geben wir +512M ein, damit die Partition 512 MB groß wird.
  • der Partitionscode im Hexformat lautet: ef00 (EFI-Partition)

Wir erstellen eine weitere Partition mittels n.

  • diese zweite Partition soll die verschlüsselte Systempartition werden.
  • die voreingestellte Partitionsnummer 2 ist korrekt, so dass wir einfach ENTER drücken können.
  • ebenfalls korrekt ist der erste Sektor. Auch diesen können wir mittels ENTER bestätigen
  • und auch der letzte Sektor ist korrekt, weil wir den gesamten Rest der Festplatte verwenden möchten. Wir können also einfach ENTER drücken können.
  • der Partitionscode im Hexformat lautet: 8309 (LUKS-Partition)

Wir können mittels p überprüfen, ob alles richtig ist.

Zum Schluss schreiben wir die Partitionstabelle mittels w.

Verschlüsselung

Um sicher zu sein, dass alles klappen wird, laden wir die Encryption-Module

$ modprobe dm-crypt
$ modprobe dm-mod

Nun erstellen wir ein LUKS-LVM auf der root-Partition (/dev/sda2):

$ cryptsetup luksFormat -v -s 512 -h sha512 /dev/sda2

Hier geben wir unser gewünschtes Passwort ein und merken es uns!!!. Wenn ihr das Passwort vergesst, kommt ihr nicht mehr an eure Daten!!!

Jetzt können wir das Laufwerk mounten

$ cryptsetup open /dev/sda2 luks_lvm

(hier muss das Passwort eingegeben werden, welches wir soeben für die Partition erzeugt haben)

Volume Setup

Zunächst erstellen wir ein Volume und eine Volume-Gruppe

$ pvcreate /dev/mapper/luks_lvm
$ vgcreate arch /dev/mapper/luks_lvm

Wir benötigen auch ein SWAP-Volume. Als Faustregel gilt: RAM-Größe plus 2GB. Mein Laptop hat zB 8GB RAM, daher erstellen wir 10GB Swap mittels

$ lvcreate -n swap -L 10G arch

Den Rest der Platte verwenden wir für unser Arch-System

$ lvcreate -n root -l +100%FREE arch

Filesystems

Nun müssen die Partitionen formatiert werden.

Die EFI-Partition benötigt das Format FAT32:

$ mkfs.fat -F32 /dev/sda1 

Für die verschlüsselte root-Partition können wir z.B. btrfs oder ext4 verwenden. Ich persönlich begnüge mich mit ext4.

$ mkfs.btrfs -L root /dev/mapper/arch-root
# oder
$ mkfs.ext4 -L root /dev/mapper/arch-root

Nun formatieren wir noch unseren Swap:

$ mkswap /dev/mapper/arch-swap

Mounten

Zuerst mounten und aktivieren wir die SWAP-Partition

$ swapon /dev/mapper/arch-swap
$ swapon -a

Anschließend mounten wir die root-Partition nach /mnt:

$ mount /dev/mapper/arch-root /mnt

Unterhalb von /mnt erstellen wir das /boot-Verzeichnis:

mkdir -p /mnt/boot

Hierhin mounten wir die erzeugte boot Partiton (/dev/sda1)

$ mount /dev/sda1 /mnt/boot

Installiere ArchLinux

Nun ist es endlich an der Zeit gekommen, Archlinux zu installieren. Dieser Befehl bringt die essentiellen Pakete auf die neue Platte:

$ pacstrap -K /mnt base base-devel linux linux-firmware nano openssh

Wir erzeugen die fstab-Datei für unser neues System mittels:

$ genfstab -U -p /mnt > /mnt/etc/fstab

chroot in die Installation

Wir wechseln in unser neues System mittels:

$ arch-chroot /mnt /bin/bash

Hier können wir nun die grundlegenden Konfigurationen vornehmen.

Konfiguration

entschlüssele die Laufwerke

Damit Linux unsere Partition entschlüsseln kann, müssen wir die Datei mkinitcpio.conf anpassen.

Öffne mkinitcpio.conf

$ nano /etc/mkinitcpio.conf

und füge encrypt lvm2 zwischen die Hooks block und filesystem ein. Das sieht dann in etwa so aus:

HOOKS=(... block encrypt lvm2 filesystems fsck)

Wir müssen gleich noch weitere Änderungen an der Datei vornehmen, aber zunächst installieren wir den Volumemanager lvm2

$ pacman -S lvm2

Bootloader

Wir werden systemd-boot für unser System nutzen. Dafür benötigen wir noch ein paar Pakete:

$ pacman -S efibootmgr dosfstools gptfdisk

Zuerst installieren wir den EFI-Booteintrag per:

$ bootctl install

Jetzt müssen wir die UUID unserer verschlüsselten LUKS-Partition herausfinden. Da wir Partition /dev/sda2 verschlüsselt haben, erhalten wir dessen UUID per:

$ blkid /dev/sda2

Das sieht dann in etwa so aus:

/dev/sda2: UUID="272b13c4-ce78-47de-b04c-66210edb977d" TYPE="crypto_LUKS" PARTLABEL="Linux LUKS" PARTUUID="6b6b86e4-b8fe-4b7d-874d-96c67075b90c"

Die UUID lautet in unserem Beispiel also 272b13c4-ce78-47de-b04c-66210edb977d.

Mit diesem Wissen können wir die Datei /boot/loader/entries/arch-uefi.conf mit folgendem Inhalt erstellen:

$ nano /boot/loader/entries/arch-uefi.conf
title    Arch Linux
linux    /vmlinuz-linux
initrd   /initramfs-linux.img
options  root=/dev/mapper/arch-root cryptdevice=UUID=<uuid>:luks_lvm  locale=de_DE.UTF-8

In unserem Beispiel ändert sich die letzte Zeile in

options  root=/dev/mapper/arch-root cryptdevice=UUID=272b13c4-ce78-47de-b04c-66210edb977d:luks_lvm  locale=de_DE.UTF-8

Nun bearbeiten wir die Datei /boot/loader/loader.conf so, dass automatisch in unser Archsystem gebootet wird:

$ nano /boot/loader/loader.conf
default   arch-uefi
timeout   1

Keyfile

Optional können wir noch Keyfiles erstellen. Hierfür erzeugen wir ein eigenes Verzeichnis:

$ mkdir /secure

…und erstelle ein Keyfile für unserer root-Partition.

$ dd if=/dev/random of=/secure/root_keyfile.bin bs=512 count=8

Anschließend muss die Berechtigung geändert werden:

$ chmod 000 /secure/*

Jetzt können wir den Keyfile der Partition zuweisen:

$ cryptsetup luksAddKey /dev/sda2 /secure/root_keyfile.bin

(hier muss wieder das Passwort eingegeben werden, welches wir für die Partition erzeugt haben)

Den Schlüssel müssen wir noch für Linux bekanntmachen:

$ nano /etc/mkinitcpio.conf

Unter FILES fügen wir den Pfad auf den Keyfile hinzu:

FILES=(/secure/root_keyfile.bin)

…und erstellen Linux neu:

$ mkinitcpio -p linux

Systemkonfiguration

Zeit für ein paar weitere Systemkonfigurationen.

Timezone

Unsere Zeitzone ist Europe/Berlin.

$ ln -sf /usr/share/zoneinfo/Europe/Berlin /etc/localtime

NTP

Mittels NTP holen wir uns die aktuelle Zeit aus dem Netz

$ nano /etc/systemd/timesyncd.conf

Folgende NTP Server können wir verwenden.

[Time]
NTP=0.arch.pool.ntp.org 1.arch.pool.ntp.org 2.arch.pool.ntp.org 3.arch.pool.ntp.org 
FallbackNTP=0.pool.ntp.org 1.pool.ntp.org

Jetzt kann NTP aktiviert werden

$ systemctl enable systemd-timesyncd.service

Locale

Wir stellen die Sprache auf “deutsch”. Hierfür öffnen wir /etc/locale.gen

$ nano /etc/locale.gen

und kommentieren die Zeile mit de_DE.utf8 aus.

#de_CH ISO-8859-1
de_DE.UTF-8 UTF-8
#de_DE ISO-8859-1
#de_DE@euro ISO-8859-15

Jetzt erzeugen wir alle lokalen Sprachdateien

$ locale-gen

…und schreiben es auch noch in /etc/locale.conf

$ nano /etc/locale.conf
LANG=de_DE.UTF-8

virtuelle und TTY Konsolen

Damit auch die virtuellen Tastaturen auf deutsch eingestellt sind, gebe ich noch ein:

$ echo KEYMAP=de-latin1-nodeadkeys > /etc/vconsole.conf
$ localectl --no-convert set-x11-keymap de pc105 deadgraveacute
$ localectl --no-convert set-keymap de-latin1-nodeadkeys

Wir können die Einstellungen noch überprüfen mit

$ localectl status

Die Ausgabe sollte so aussehen:

System Locale: LANG=de_DE.UTF-8
    VC Keymap: de-latin1-nodeadkeys
   X11 Layout: de
    X11 Model: pc105
  X11 Variant: deadgraveacute

Beim nächsten Neustart ist das Tastaturlayout auch für TTY auf deutsch.

Hostname

Mein Laptop soll “Norbert” heissen.

$ echo "Norbert" > /etc/hostname

Users

Bislang waren wir als root unterwegs. Erzeugen wir uns also einen neuen Benutzer “produnis” mit sudo-Rechten

$ useradd -m -G wheel -s /bin/bash produnis

und vergeben ein Passwort für diesen User mittels

$ passwd produnis

Damit “produnis” sudo-Rechte bekommt, führen wir folgenden Befehl aus

$ EDITOR=nano visudo

und kommentieren die folgende Zeile aus:

%wheel ALL=(ALL:ALL) ALL

Damit unsere sudo-Befehle nicht aus-timen, kann am Ende der Datei noch hinzugefügt werden:

Defaults passwd_timeout=0

Netzwerk

Damit wir beim Neustart Netzwerk haben, installieren und aktivieren wir den Networkmanager.

$ pacman -S networkmanager
$ systemctl enable NetworkManager

Damit auch ssh funktioniert, ergänzen wir

$ systemctl enable sshd

Microcode

Es wird empfohlen, die Micorcodes entsprechend eurer CPU zu installieren.

# Für AMD
$ pacman -S amd-ucode
# ODER
# Für Intel
$ pacman -S intel-ucode

Desktop

An dieser Stelle sind wir eigentlich schon fertig und können zum ersten Mal neustarten. Ich installiere aber noch einen Desktop und Login-Manager, damit ich direkt auf einer graphischen Oberfläche loslegen kann. Ich selbst verwende am liebsten KDE (also Plasma) mit Wayland (ihr könnt aber auch GNOME oder XFCE installieren). Für eine minimale Installation wähle ich

$ pacman -S plasma-desktop plasma-wayland-session  kde-applications  sddm sddm-kcm plasma-nm

Ich bestätige immmer die Vorauswahl, falls Pacman fragt.

Zum Schluss aktiviere ich noch den Loginmanager sddm

$ systemctl enable sddm

Fertig, Zeit für einen Reboot.

Reboot

Zunächst verlassen wir die chroot-Umgebung und unmounten die Partitionen.

$ exit
$ umount -R /mnt
$ reboot now

Bei mir meldet sich nach dem Start nun das UEFI-Bootmenu, welches nach 2 Sekunden Archlinux bootet. Hier werde ich nach dem Verschlüsslungspasswort gefragt. Anschließend meldet sich der sddm-Loginbildschirm, und ich kann meine Plasmasession starten.

Deutsches Tastaturlayout

Noch ist die KDE-Tastatur nicht auf deutsch eingestellt. Hierfür geht ihr in die Systemeinstellungen, und wählt unter “Tastaur” den Reiter “Belegungen”.

Setzt den Haken bei “Belegungen einrichten” und fügt “Deutsch” hinzu. Sobald ihr unten auf “Anwenden” klickt, ist die Tastatur auf deutsches Layout eingestellt.

…what if?

Falls doch etwas schief laufen sollte, und ihr z.B. nicht ins System booten könnt, stellt ihr wie folgt wieder die chroot-Umgebung her:

  • boote vom USB-Stick, so wie oben beschrieben
  • cryptsetup open /dev/sda2 luks_lvm
  • mount /dev/mapper/arch-root /mnt
  • mount /dev/sda1 /mnt/boot
  • arch-chroot /mnt /bin/bash

Jetzt liegt es aber an euch, den Fehler zu finden… ;)