Installation de Arch Linux

Aujourd'hui je dois réinstaller mon système suite quelques problèmes techniques. Je fais chacun de mes installations de Arch Linux avec quelques petites modifications pour explorer de nouvelles divers approches. Nous allons voir ensemble cette l'installation.

Spécifications

  • Système de fichier: BTRFS au dessus de LUKS2 (chiffrement)
  • Gestionnaire de boot: systemd-boot
  • Type de démarrage: UEFI

Matériel

Comme je réalise régulièrement des installations de différents OS j'utilise un IODD ST400 sur lequel j'ajoute simplement mes fichiers ISO et me permettant de créer des lecteurs CD virtuels via USB.

En ce qui concerne la machine sur laquelle je fais faire cette installation il s'agit d'un Framework Laptop 16:

  • AMD Ryzen™ 9 7940HS
  • 64Go RAM DDR5
  • 2x2To SSD
  • Radeon™ RX 7700S

Cette installation sera donc pour les processeurs AMD, avec la configuration pour une carte graphique AMD et sur le premier SSD.

Connexion au Wifi

Afin de vous connecter au wifi nous allons utiliser la iwd.

Dans un premier temps vous devez récupérer le nom de votre carte réseau, dans mon cas il s'agit de wlan0:

# iwctl station list

Ensuite vous pouvez vous connecter à votre réseau:

# iwctl station <carte reseau> connect <SSID>

Stockage

Afin de pouvoir procéder à l'installation nous devons commencer par préparer le disque sur lequel mettre notre système.

Création des partitions

Vous pouvez identifier ce disque :

# lsblk
NAME        MAJ:MIN RM   SIZE RO TYPE MOUNTPOINTS
loop0         7:0    0 794.4M  1 loop /run/archiso/airootfs
sda           8:0    1 931.5G  0 disk
└─sda1        8:1    1 931.5G  0 part
sr0          11:0    1   1.1G  0 rom  /run/archiso/bootmnt
nvme0n1     259:4    0   1.9T  0 disk

Ici mon disque est nvme0n1.

Maintenant que le disque est identifié (assurez-vous qu'il s'agit du bon) nous allons supprimer la table de partition actuellement existente:

sgdisk --zap-all /dev/nvme0n1

Ensuite nous allons définir notre table de partition enn y incluant des labels. Ayant beaucoup de RAM et un disque SSD je ne vais pas mettre de SWAP sur mon disque. Il n'y aura donc que 2 partitions :

sgdisk --clear --new=1:0:+512MiB --typecode=1:ef00 --change-name=1:EFI --new=2:0:0 --typecode=2:8300 --change-name=2:cryptsystem /dev/nvme0n1

La première partition sera utilisée pour le boot EFI et la deuxième pour le système.

Nous pouvons vérifier la table de partition :

# fdisk -l /dev/nvme0n1
Disk /dev/nvme0n1: 1.86 TiB, 2048408248320 bytes, 4000797360 sectors
Disk model: WD PC SN740 SDDPTQE-2T00
Units: sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disklabel type: gpt
Disk identifier: 33857BEA-76EC-43B4-AAD5-4743FCF68B43

Device           Start        End    Sectors  Size Type
/dev/nvme0n1p1    2048    1050623    1048576  512M EFI System
/dev/nvme0n1p2 1050624 4000797326 3999746703  1.9T Linux filesystem

Ensuite procédons à la création de notre partition chiffrée :

cryptsetup luksFormat --type luks2 --align-payload=8192 -s 256 -c aes-xts-plain64 /dev/disk/by-partlabel/cryptsystem

Puis ouvrir le conteneur chiffré :

cryptsetup open /dev/disk/by-partlabel/cryptsystem system

Création des système de fichiers

Nous allons procéder au formatage des partitions, BTRFS pour le partition systèmè et vfat pour la partition EFI.

Système

mkfs.btrfs --label system /dev/mapper/system

Maintenant il faut définir un layout pour BTRFS afin de pouvoir gérer correctement la fonction de snapshots du système de fichier par la suite. Voici mon layout :

Sous volume Point de montage
@ /
@home /home
@root /root
@snapshots /.snapshots
@opt /opt
@srv /srv
@tmp /tmp
@usr_local /usr/local
@var /var
@var_log /var/log
@var_cache /var/cache
@var_tmp /var/tmp
@libvirt /var/lib/libvirt/images

Pour procéder à la création des sous volumes nous allons monter la partition :

mount -t btrfs LABEL=system /mnt

Et procéder à la création de ces derniers:

btrfs subvolume create /mnt/@
btrfs subvolume create /mnt/@home
btrfs subvolume create /mnt/@root
btrfs subvolume create /mnt/@snapshots
btrfs subvolume create /mnt/@opt
btrfs subvolume create /mnt/@srv
btrfs subvolume create /mnt/@tmp
btrfs subvolume create /mnt/@usr_local
btrfs subvolume create /mnt/@var
btrfs subvolume create /mnt/@var_log
btrfs subvolume create /mnt/@var_cache
btrfs subvolume create /mnt/@var_tmp
btrfs subvolume create /mnt/@libvirt

Il faut ensuite monter les sous volumes:

mount -t btrfs -o defaults,x-mount.mkdir,compress=zstd,ssd,noatime,subvol=@ LABEL=system /mnt/
mount -t btrfs -o defaults,x-mount.mkdir,compress=zstd,ssd,noatime,subvol=@home LABEL=system /mnt/home
mount -t btrfs -o defaults,x-mount.mkdir,compress=zstd,ssd,noatime,subvol=@root LABEL=system /mnt/root
mount -t btrfs -o defaults,x-mount.mkdir,compress=zstd,ssd,noatime,subvol=@snapshots LABEL=system /mnt/.snapshots
mount -t btrfs -o defaults,x-mount.mkdir,compress=zstd,ssd,noatime,subvol=@opt LABEL=system /mnt/opt
mount -t btrfs -o defaults,x-mount.mkdir,compress=zstd,ssd,noatime,subvol=@srv LABEL=system /mnt/srv
mount -t btrfs -o defaults,x-mount.mkdir,compress=zstd,ssd,noatime,subvol=@tmp LABEL=system /mnt/tmp
mount -t btrfs -o defaults,x-mount.mkdir,compress=zstd,ssd,noatime,subvol=@usr_local LABEL=system /mnt/usr/local
mount -t btrfs -o defaults,x-mount.mkdir,compress=zstd,ssd,noatime,subvol=@var LABEL=system /mnt/var
mount -t btrfs -o defaults,x-mount.mkdir,compress=zstd,ssd,noatime,subvol=@var_log LABEL=system /mnt/var/log
mount -t btrfs -o defaults,x-mount.mkdir,compress=zstd,ssd,noatime,subvol=@var_cache LABEL=system /mnt/var/cache
mount -t btrfs -o defaults,x-mount.mkdir,compress=zstd,ssd,noatime,subvol=@var_tmp LABEL=system /mnt/var/tmp
mount -t btrfs -o defaults,x-mount.mkdir,compress=zstd,ssd,noatime,nodatacow,subvol=@libvirt LABEL=system /mnt/var/lib/libvirt/images

L'option ssd est à définir uniquement sur les disques SSD. Je désactive également la fonction de Copy-on-Write avec l'option nodatacow pour le répertoire des disques des VMs libvirt.

EFI

# Formatage de la partition
mkfs.fat -F32 -n EFI /dev/disk/by-partlabel/EFI
# Création du point de montage dans la partition racine
mkdir /mnt/efi
# Montage de la partition
mount LABEL=EFI /mnt/efi

Installation du système

Maintenant que l'architecture de notre système est créé nous allons pouvoir installer la base du système et le kernel.

J'utilise la version zen du kernel linux, pour la version standard, vous pouvez remplacer linnux-zen par linux. Si vous avez un processeur Intel et non AMD remplacer également amd-ucode par intel-ucode.

pacstrap /mnt base linux-zen linux-firmware amd-ucode iptables-nft nftables vim

Je procède à l'installation de nftables lors de cette étape pour être sûr que iptables ne soit pas installé comme dépendant d'un autre paquet.

Ensuite nous allons généré le fichier fstab en utilisant les labels pour les partitions :

genfstab -L -p /mnt >> /mnt/etc/fstab

Il faut également définir un nom pour notre nouveau système, ici ce sera nowhere.

echo "nowhere" > /etc/hostname

Il faut également définir le contenu du fichier /etc/hosts, je vais ça en une seule commande mais vous pouvez également éditer le fichier manuellement :

cat <<EOF> /etc/hosts
127.0.0.1       localhost.localdomain  localhost
127.0.1.1       nowhere.nowhere        nowhere

::1             localhost ip6-localhost ip6-loopback
ff02::1         ip6-allnodes
ff02::2         ip6-allrouters
EOF

Configuration du système

Configuration basique

Dans un premier temps nous devons entrer dans notre nouveau système:

arch-chroot /mnt

Puis définir la zone temporelle et définir l'heure matériel sur notre machine, pour moi il s'agit de Paris:

ln -sf /usr/share/zoneinfo/Europe/Paris /etc/localtime
hwclock --systohc

Cette configuration sera faite pour le français mais vous pouvez adapter fr_FR par la langue de votre choix.

sed -i '/fr_FR.UTF-8 UTF-8/s/^#//g' /etc/locale.gen
locale-gen
echo "LANG=fr_FR.UTF-8" > /etc/locale.conf

Installation des paquets supplémentaires

Nous allons ensuite ajouter des paquets supplémentaires utiles pour l'installation de notre système.

pacman -Syu networkmanager base-devel efibootmgr btrfs-progs gptfdisk neovim zsh sudo ttf-dejavu sbctl polkit git openssh wget

Préparation de notre système de boot

Pour cette installation j'ai décidé d'utiliser systemd-init à la place de busybox-init notamment pour son meilleur support de plymouth avec le chiffrement complet du disque.

Dans le fichier /etc/mkinitcpio.conf nous allons modifier les variables MODULES pour le support du GPU, BINARIES pour corriger un problème d'affichage avec plymouth et HOOKS pour correspondre à la configuration de notre système en ajoutant le hook BTRFS notamment.

MODULES=(amdgpu)
BINARIES=(setfont)
HOOKS=(base systemd plymouth autodetect microcode modconf kms keyboard sd-vconsole sd-encrypt block btrfs filesystems fsck)

Ensuite dans le fichier /etc/kernel/cmdline nous allons définir les paramètres de démarrage de notre kernel, notamment pour lui indiquer sur quel partition démarré :

fbcon=nodefer rw rd.luks.allow-discards plymouth.use-simpledrm quiet bgrt_disable root=LABEL=system rootflags=subvol=@root,rw splash vt.global_cursor_default=0

plymouth.use-simpledrm est spécifique à l'utilisation de plymouth avec un GPU AMD qui peut causer des problèmes d'affichage.

Puis comme notre système est chiffré il faut ajouter la configuration nécessaire pour le démarrage dans le fichier /etc/crypttab.initramfs :

system /dev/disk/by-partlabel/cryptsystem none timeout=180

Pour le support du secure boot nous devons créer les clé de signatures :

sbctl create-keys

Et généré l'image efi du kernel :

sbctl bundle -k /boot/vmlinuz-linux-zen -f /boot/initramfs-linux-zen.img -s /efi/main.efi

Avec le kernel standard de linux la commande n'a pas besoin des chemins comme avec le kernel zen : sbctl bundle -s /efi/main.efi

Ensuite nous ajoutons dans notre UEFI l'entrée pour le boot de notre système :

efibootmgr --create --disk /dev/nvme0n1 --part 1 --label "Arch Linux" --loader 'main.efi' --unicode

Ici /dev/nvme0n1 est le disque sur lequel j'ai fait l'installation et 1 le numéro de partition EFI. C'est informations sont vérifiable avec fdisk -l.

utilisateur

Nous allons pouvoir ajouter un utilisateur qui nous servira également pour l'installation de la version de developpement de plymouth pour la gestion de l'écran de démarrage.

Dans un premier temps changeons le mot de passe de l'utilisateur root:

passwd

Puis ajoutons notre utilisateur qui utilisera zsh comme terminal, le nom de ce dernier sera nothing dans mon cas. Nous allons également en profiter pour définir son mot de passe :

useradd -m -G wheel,storage,power,tty,systemd-journal --btrfs-subvolume-home -s /usr/bin/zsh nothing

passwd nothing

Libre à vous de modifier les groups auquel appartiendra votre utilisateur cependant dans le cas de mon utilisation quotitienne l'appartenance à ces groupes est nécessaire.

Pour la suite il est nécessaire de donner à notre utilisateur des droits sudo. Une solution commune est d'éditer le /etc/sudoers avec la commande visudo pour décommenter une des lignes donnant ces droits via le groupe wheel.

Ici je vais simplement ajouter une ligne dédié à mon utilisateur :

echo "nothing ALL=(ALL:ALL) ALL" > /etc/sudoers.d/nothing

Nous allons maintenant prendre l'identité de cet utilisateur mais avec le shell bash pour éviter la configuration de zsh :

su -s /usr/bin/bash - nothing

Afin d'installer les paquets AUR d'Arch Linux j'utile yay mais plusieurs autres solution sont possibles comme aura, paru ou l'installation des AUR directement via makepkg.

cd /tmp
git clone https://aur.archlinux.org/yay.git
cd yay
makepkg -si

Nous pouvons ensuite installer plymouth et si vous le souhaitez mkinitcpio-firmware pour limiter les message d'avertissement de mkinitcpio indiquant des firmwares manquants.

yay -Sy plymouth-git mkinitcpio-firmware

Nous allons ensuite définir le thème pour notre plymouth :

sudo plymouth-set-default-theme -R spinner

Si vous ne savez pas le quel choisir je vous recommande de laisser celui-ci pour le moment et de le changer après le redémarrage de votre système.

Nous allons regénéré l'image efi :

sudo sbctl generate-bundles -s

Finalisation

Sortez de votre utilisateur non root et du chroot puis redémarrez le système. Nous continuerons une fois le système démarré.

exit
exit
reboot

Si tout est bien configuré votre système devrait démarrer et vous demander votre mot de passe pour dévérouiller le disque.

Une fois le système redémarré et connecté avec notre utilisateur nous allons ajouté les clés secure boot dans l'EFI du système.

Si vous avez un dual-boot avec Windows il faudra rajouter l'argument -m à cette commande.

sudo sbctl enroll-keys

Activons la synchronisation du temps:

sudo timedatectl set-ntp true

Il faut définir le type de clavier pour vconsole, dans mon il s'agit de us-acentos, vous pouvez obtenir la liste avec la commande localectl list-keymaps:

sudo localectl set-keymap us-acentos

Framework Laptop 16

Comme je suis sur un Framework Laptop 16 il y a quelques ajustements conseillés pour ce matériel dans la documentation.

Ici je ne traiterais que les configurations utiles avant la présence d'un environnement graphique.

Paramètres Wifi

Afin d'assurer le bon fonctionnement de la carte Wifi en utilisant les fréquence de notre zone géographique l'installation de la base de donnée des zones géographiques et sa configuration est nécessaire:

sudo pacman -S wireless-regdb
sudo sed -i '/WIRELESS_REGDOM="FR"/s/^#//g' /etc/conf.d/wireless-regdom
echo "country=FR" | sudo tee /etc/wpa_supplicant/wpa_supplicant.conf

L'application de cette configuration nécessitera un redémarrage.

Désactivation de la sortie de veille par clavier ou touchpad

Dans certains cas de transport l'écran peut appuyer sur le clavier et sorti l'ordiateur de veille ce qui peut poser problème. Pour que la sortie de veille ne se fasse qu'avec le bouton d'alimentation dans le fichier /etc/udev/rules.d/90-disable-keyboard-wake.rules il faut ajouter le contenu:

ACTION=="add", SUBSYSTEM=="usb", ATTRS{idVendor}=="32ac", ATTRS{idProduct}=="0012", ATTR{power/wakeup}="disabled"

Et recharger les règles :

sudo udevadm control --reload
sudo udevadm trigger

Gestion des capteurs

La récupération des informations provenant des capteurs et souvent faite via lm_sensors cependant la configuration pour les framework.

Nous allons donc ajouter la configuration nécessaire :

sudo pacman -S lm_sensors --needed
sudo curl https://raw.githubusercontent.com/FrameworkComputer/lm-sensors/refs/heads/framework/configs/Framework/Framework16-AMD.conf -o /etc/sensors.d/Framework16-AMD.conf

Personnalisations

La suite de l'installation concerne les personnalisations comme l'environnement de bureau.
Je ne détaillerais pas cette partie ici cependant vous trouverez mes dotfiles pour cette partie ici.
J'ai deux configurations avec Plasma6 ou Sway que je gère avec l'outil chezmoi.

J'espère que cette article vous a été utile, n'hésitez pas à laisser un commentaire.