feat(anaconda): add automatic hardware detection and driver installation

Add hardware detection and automatic driver installation during system installation. This includes:

- Virtualization platform detection with automatic guest tools configuration
- Automatic GPU driver installation (NVIDIA, AMD, Intel)
- Removal of incompatible guest tools for other hypervisors
- Network-resilient installation (non-blocking if network unavailable)

The detection uses the fws-hw-detect script which provides the same hardware information shown to the user in the live environment summary screen. This ensures what was announced to the user is what gets applied during installation.

Update section numbering in kickstart file to accommodate the new hardware configuration step.
This commit is contained in:
2026-07-03 03:24:28 +02:00
parent 071cc307b4
commit 20e0643a02
@@ -194,7 +194,47 @@ else
echo "[FWS] AVERTISSEMENT : grub-install a échoué — bootloader à refaire à la main" echo "[FWS] AVERTISSEMENT : grub-install a échoué — bootloader à refaire à la main"
fi fi
# --- 4) Bureau choisi : pacman -S du DE (non bloquant si pas de réseau) ------- # --- 4) Drivers matériels : détection + activation/installation AUTO ----------
# Toute la DÉTECTION vit dans /usr/local/bin/fws-hw-detect : livré par
# l'airootfs → recopié dans la cible par le payload liveimg → présent dans ce
# chroot. C'est la MÊME source de vérité que l'écran « Récapitulatif avant
# installation » du live (.xinitrc, mode --text) : ce qui a été ANNONCÉ à
# l'utilisateur = ce qu'on APPLIQUE ici. La détection marche en chroot car
# Anaconda bind-monte le /sys et le /proc du LIVE (le code plus haut s'appuie
# déjà dessus : /sys/firmware/efi, findmnt) → on voit le VRAI matériel.
# Variables produites par --env :
# FWS_VIRT hyperviseur (vmware/oracle/kvm/qemu/none…)
# FWS_VIRT_SVC services invité à activer (paquets DÉJÀ dans l'image → OK
# hors ligne ; c'était le chaînon manquant, rien n'activait
# vmtoolsd & co sur le système installé)
# FWS_VIRT_RM guest tools des AUTRES hyperviseurs, à purger
# FWS_DRV_PKGS paquets GPU à installer, dédoublonnés. NVIDIA embarque
# « linux » dans la même transaction : le module des dépôts
# est bâti pour le noyau des dépôts, pas celui du live ; les
# chemins /boot/* étant stables, le grub.cfg de l'étape 3
# reste valable (le hook pacman de nvidia relance mkinitcpio).
# NB : microcode CPU (amd-ucode/intel-ucode) et linux-firmware sont DÉJÀ dans
# l'image → recopiés, et grub-mkconfig (étape 3) a généré les initrd qui vont
# bien. Rien à faire pour eux.
if [ -x /usr/local/bin/fws-hw-detect ]; then
eval "$(/usr/local/bin/fws-hw-detect --env)"
# (a) Hyperviseur : activer le bon service invité, purger les autres.
[ -n "$FWS_VIRT_SVC" ] && { systemctl enable $FWS_VIRT_SVC || true; }
[ -n "$FWS_VIRT_RM" ] && { pacman -Rns --noconfirm $FWS_VIRT_RM || true; }
# (b) GPU : install réseau, NON bloquante (même philosophie que le
# bureau). --needed : ne réinstalle pas ce que l'image a déjà (mesa…).
if [ -n "$FWS_DRV_PKGS" ]; then
pacman-key --init &>/dev/null || true
pacman-key --populate archlinux &>/dev/null || true
if ! pacman -Sy --noconfirm --needed $FWS_DRV_PKGS; then
echo "[FWS] Drivers non installés ($FWS_DRV_PKGS) — réseau ? À refaire au 1er boot."
fi
fi
else
echo "[FWS] fws-hw-detect introuvable — drivers/guest tools NON configurés."
fi
# --- 5) Bureau choisi : pacman -S du DE (non bloquant si pas de réseau) -------
DESK="cli" DESK="cli"
[ -f /tmp/fws-desktop ] && DESK="$(tr -d '[:space:]' < /tmp/fws-desktop)" [ -f /tmp/fws-desktop ] && DESK="$(tr -d '[:space:]' < /tmp/fws-desktop)"
DM="" DM=""
@@ -216,14 +256,14 @@ if [ -n "$PKGS" ]; then
fi fi
fi fi
# --- 5) Sécurité : verrouiller root s'il est resté SANS mot de passe ---------- # --- 6) Sécurité : verrouiller root s'il est resté SANS mot de passe ----------
# L'airootfs live a souvent un root sans mot de passe ; si l'utilisateur n'en a # L'airootfs live a souvent un root sans mot de passe ; si l'utilisateur n'en a
# pas défini dans le GUI, on verrouille plutôt que de laisser le compte ouvert. # pas défini dans le GUI, on verrouille plutôt que de laisser le compte ouvert.
if passwd -S root 2>/dev/null | grep -qE '\bNP\b'; then if passwd -S root 2>/dev/null | grep -qE '\bNP\b'; then
passwd -l root || true passwd -l root || true
fi fi
# --- 6) Le resolv.conf du live ne doit pas rester figé ----------------------- # --- 7) Le resolv.conf du live ne doit pas rester figé -----------------------
# NetworkManager (activé sur le système installé) régénère /etc/resolv.conf. # NetworkManager (activé sur le système installé) régénère /etc/resolv.conf.
rm -f /tmp/fws-desktop /etc/resolv.conf 2>/dev/null || true rm -f /tmp/fws-desktop /etc/resolv.conf 2>/dev/null || true
%end %end