#!/bin/bash # ============================================================================ # FWS — détection matérielle + drivers + stack « remplacement de Windows ». # # Appelé par le %post du kickstart : fws-setup-hardware # ( = cli|gnome|kde|xfce|hyprland). Réseau requis ; CHAQUE étape est # NON bloquante (pas de set -e) : un paquet manquant ou pas de réseau ne casse # pas l'installation. # # Installe : # - les drivers GPU détectés via lspci (Intel / AMD / NVIDIA) + Mesa/Vulkan, # - les outils invité selon l'hyperviseur (VMware/VirtualBox/QEMU/Hyper-V), # - le son/micro/casque (PipeWire), le Bluetooth (BlueZ), les conteneurs # (Podman), # - et — si un bureau est choisi — la stack « comme Windows » : Steam, Wine, # VR (Monado/OpenXR → SteamVR pour HTC Vive / Valve Index ; Oculus n'a pas # de support Linux officiel), winboat-bin (apps Windows). # ============================================================================ DESK="${1:-cli}" log() { echo "[FWS-hw] $*"; } # ── 1) Drivers GPU (détection lspci) ───────────────────────────────────────── DRIVERS="mesa" GPU="$(lspci 2>/dev/null | grep -iE 'VGA compatible controller|3D controller|Display controller')" case "$GPU" in *NVIDIA*|*GeForce*) DRIVERS="$DRIVERS nvidia-dkms nvidia-utils linux-headers dkms" ;; *AMD*|*ATI*|*Radeon*) DRIVERS="$DRIVERS vulkan-radeon libva-mesa-driver" ;; *Intel*) DRIVERS="$DRIVERS vulkan-intel intel-media-driver" ;; esac # ── 2) Outils invité selon l'hyperviseur ───────────────────────────────────── VMSVC="" case "$(systemd-detect-virt 2>/dev/null)" in vmware) DRIVERS="$DRIVERS open-vm-tools"; VMSVC="vmtoolsd vmware-vmblock-fuse" ;; oracle) DRIVERS="$DRIVERS virtualbox-guest-utils"; VMSVC="vboxservice" ;; qemu|kvm) DRIVERS="$DRIVERS qemu-guest-agent spice-vdagent"; VMSVC="qemu-guest-agent spice-vdagentd" ;; microsoft) DRIVERS="$DRIVERS hyperv"; VMSVC="hv_fcopy_daemon hv_kvp_daemon hv_vss_daemon" ;; esac # ── 3) Stack de base : son / micro / casque, Bluetooth, luminosité, conteneurs # brightnessctl : réglage de luminosité sans root (via logind) — consommé par # les touches XF86MonBrightness* et la molette du module backlight de waybar. BASE="pipewire pipewire-alsa pipewire-pulse pipewire-jack wireplumber \ pavucontrol bluez bluez-utils brightnessctl podman" # Gestionnaire Bluetooth graphique : KDE et GNOME ont le leur ; blueman pour # les bureaux qui n'en fournissent pas (tray + assistant d'appairage). case "$DESK" in hyprland|xfce) BASE="$BASE blueman" ;; esac # ── 4) Stack desktop : jeux, Windows-compat, VR (si un bureau est choisi) ──── DESKTOP="" if [ "$DESK" != "cli" ]; then # multilib requis (Steam / Wine 32 bits). grep -qE '^\[multilib\]' /etc/pacman.conf \ || printf '\n[multilib]\nInclude = /etc/pacman.d/mirrorlist\n' >> /etc/pacman.conf DESKTOP="steam wine winetricks wine-mono wine-gecko \ lib32-mesa lib32-pipewire monado gamemode \ noto-fonts ttf-liberation" fi # ── Sync + filtre aux paquets RÉELLEMENT existants ─────────────────────────── # (un nom de paquet manquant/renommé ne doit pas faire échouer tout le reste). pacman -Sy --noconfirm || log "synchro pacman échouée (réseau ?)" VALID="" for p in $DRIVERS $BASE $DESKTOP; do pacman -Si "$p" >/dev/null 2>&1 && VALID="$VALID $p" done if [ -n "$VALID" ]; then log "installation :$VALID" pacman -S --noconfirm --needed $VALID || log "certains paquets non installés" fi # NB : winboat-bin (AUR) n'est PAS installé ici (fws-local n'existe pas sur la # cible) : il est intégré à l'image FWS via packages.x86_64 et recopié par le # payload LiveOS d'Anaconda → déjà présent sur le système installé. # ── Services matériels ─────────────────────────────────────────────────────── [ -n "$VMSVC" ] && systemctl enable $VMSVC 2>/dev/null systemctl enable bluetooth.service 2>/dev/null systemctl enable podman.socket 2>/dev/null exit 0