refactor(anaconda): clarify payload mechanism and enhance desktop environment configurations

Update interactive-defaults.ks kickstart file with:

- Clarified documentation on LiveOS payload detection and mounting via /run/rootfsbase bind-mount instead of direct liveimg directive
- Added comprehensive comments explaining why liveimg directive is intentionally omitted and how anaconda --liveinst handles payload creation
- Enhanced XFCE and Hyprland package sets with noto-fonts for proper TTF rendering and additional tools (thunar, hyprlock, grim, slurp, wl-clipboard, playerctl)
- Implemented SDDM theme configuration with FWS theme support and accent colors per desktop environment (teal for XFCE, Catppuccin blue for Hyprland, Breeze blue for KDE)
- Added GDM (GNOME) configuration via dconf with welcome banner, clock enhancements, and numlock settings
- Expanded Waybar configuration installation for Hyprland with config and style files
- Added comprehensive documentation for greeter customization and Hyprland VM compatibility
- Included details about FWS recap spoke (standalone GUI summary screen) replacing zenity-based pre-install approach
This commit is contained in:
2026-07-03 23:59:09 +02:00
parent 68850f0ed2
commit d8e67fe861
@@ -5,33 +5,36 @@
# lancée en mode interactif (chemin fixe codé en dur dans Anaconda : # lancée en mode interactif (chemin fixe codé en dur dans Anaconda :
# /usr/share/anaconda/interactive-defaults.ks). Aucun inst.ks= n'est requis. # /usr/share/anaconda/interactive-defaults.ks). Aucun inst.ks= n'est requis.
# #
# RÔLE : empêcher Anaconda d'installer Fedora. # RÔLE : finaliser une install « copie du live » (surtout pas Fedora).
# ---------------------------------------------------------------------------- # ----------------------------------------------------------------------------
# Sans payload défini, Anaconda utilise DNF → des RPM depuis les dépôts # Anaconda n'a AUCUN backend pacman ; son payload par défaut (DNF) poserait
# Fedora = il installe Fedora. Anaconda n'a AUCUN backend pacman. La seule # des RPM Fedora. Ici le payload est LiveOS, imposé par « anaconda --liveinst »
# façon de poser FWS/Arch est le payload « liveimg » : il recopie une image # (cf. bloc « Source d'installation » ci-dessous) : il recopie le squashfs du
# de système de fichiers (ici le squashfs du live = FWS) sur le disque, puis # live (= FWS) sur le disque, puis on finalise nous-mêmes (grub, mkinitcpio,
# on finalise nous-mêmes (grub, mkinitcpio, bureau) en %post. C'est le modèle # bureau) en %post. C'est le modèle « Sabayon » : le système installé EST une
# « Sabayon » : le système installé EST une copie du live. # copie du live.
# #
# L'utilisateur garde la main dans le GUI sur tout ce qui N'EST PAS fixé ici : # L'utilisateur garde la main dans le GUI sur tout ce qui N'EST PAS fixé ici :
# partitionnement, fuseau, clavier, langue, création d'utilisateur, mot de # partitionnement, fuseau, clavier, langue, création d'utilisateur, mot de
# passe root, etc. # passe root, etc.
# ============================================================================ # ============================================================================
# --- Source d'installation : l'image du live (FWS), surtout pas Fedora ------- # --- Source d'installation : le payload LiveOS (surtout pas Fedora/DNF) ------
# Squashfs archiso sur le média booté : # AUCUNE directive de payload ici, et c'est VOULU. liveinst lance
# /run/archiso/bootmnt/<install_dir>/<arch>/airootfs.sfs # « anaconda --liveinst » et anaconda.py teste opts.liveinst AVANT le type du
# install_dir=fws, arch=x86_64, airootfs_image_type=squashfs (cf. profiledef.sh). # payload DBus → il crée TOUJOURS un payload LiveOS et IGNORE tout payload du
# Anaconda loop-monte ce .sfs et rsync son contenu vers la cible. # kickstart (un « liveimg » ici serait du code mort — vérifié dans
# pyanaconda/anaconda.py, propriété payload, et reproduit hors VM).
# #
# ⚠ À VALIDER sur ISO réelle : certaines versions d'Anaconda attendent une # Le payload LiveOS détecte l'image live via /dev/mapper/live-base ou
# structure « LiveOS/rootfs.img » à l'intérieur du squashfs (format Fedora # /run/rootfsbase (chemins Fedora/dracut, absents d'archiso → c'était le crash
# Live) et non un squashfs « plat » comme celui d'archiso. Si l'install # « SourceSetupError: No Live OS image found! » au démarrage). Le .xinitrc du
# échoue à monter la source, basculer sur un tarball de rootfs dédié : # live bind-monte donc /run/archiso/airootfs (squashfs FWS, ro) sur
# liveimg --url=file:///run/archiso/bootmnt/fws/x86_64/fws-rootfs.tar.gz # /run/rootfsbase AVANT de lancer liveinst : Anaconda monte le loop device et
# (un build-rootfs.sh produirait alors ce tar via pacstrap). # rsync son contenu vers la cible = le système installé EST une copie du live,
liveimg --url=file:///run/archiso/bootmnt/fws/x86_64/airootfs.sfs # puis on finalise en %post (grub, mkinitcpio, bureau, matériel).
# DNF/libdnf5 n'est jamais importé : le module DNF n'est chargé QUE si le
# payload actif est DNF (import lazy dans modules/payloads/payload/factory.py).
# --- Disque : repartir d'un disque PROPRE, même s'il a déjà servi ------------ # --- Disque : repartir d'un disque PROPRE, même s'il a déjà servi ------------
# Sans ça, une réinstallation sur un disque déjà partitionné (typiquement une # Sans ça, une réinstallation sur un disque déjà partitionné (typiquement une
@@ -69,9 +72,21 @@ clearpart --all --initlabel --disklabel=msdos
# partitionnement (auto ou manuel) car la plateforme l'impose. # partitionnement (auto ou manuel) car la plateforme l'impose.
bootloader --disabled bootloader --disabled
# Pas de section %packages : le payload liveimg n'installe aucun paquet # Pas de section %packages : le payload LiveOS n'installe aucun paquet
# (il copie une image). Toute installation de paquets se fait en %post. # (il copie une image). Toute installation de paquets se fait en %post.
# --- Récapitulatif avant installation : PAGE GUI dédiée (pas de %pre-install) -
# L'écran « RÉCAPITULATIF AVANT INSTALLATION » est une standalone spoke
# Anaconda (overlay airootfs : pyanaconda/ui/gui/spokes/fws_recap.py,
# postForHub=SummaryHub, priority -10) intercalée ENTRE le hub et l'écran de
# progression : l'utilisateur clique « Commencer l'installation », voit le
# récap (bureau choisi, hostname, disques, GPU, réseau — AUCUNE écriture
# disque à ce stade), et l'installation ne démarre qu'à son clic « Lancer
# l'installation ». L'ancien récap zenity en %pre-install a été abandonné :
# le module scripts tourne avec LC_ALL=C et un env X incertain (zenity 4
# refuse les libellés UTF-8 en locale C → rc=255 pris pour « Annuler » →
# poweroff en plein install au 1er test réel).
# ============================================================================ # ============================================================================
# %post --nochroot — s'exécute dans le LIVE, la cible montée sous /mnt/sysroot # %post --nochroot — s'exécute dans le LIVE, la cible montée sous /mnt/sysroot
@@ -250,8 +265,13 @@ DM=""
case "$DESK" in case "$DESK" in
kde) PKGS="plasma-meta sddm konsole dolphin"; DM="sddm" ;; kde) PKGS="plasma-meta sddm konsole dolphin"; DM="sddm" ;;
gnome) PKGS="gnome gdm"; DM="gdm" ;; gnome) PKGS="gnome gdm"; DM="gdm" ;;
xfce) PKGS="xfce4 xfce4-goodies sddm"; DM="sddm" ;; # noto-fonts : KDE l'a via plasma-meta et GNOME a cantarell, mais XFCE et
hyprland) PKGS="hyprland kitty wofi waybar sddm"; DM="sddm" ;; # Hyprland ne garantissent AUCUNE police TTF → greeter SDDM/apps illisibles.
# Hyprland : la stack des raccourcis FWS (mêmes touches que la config
# i3/sway maison) — thunar (Super+E), hyprlock (Super+L), grim+slurp+
# wl-clipboard (captures), playerctl (touches multimédia).
xfce) PKGS="xfce4 xfce4-goodies sddm noto-fonts"; DM="sddm" ;;
hyprland) PKGS="hyprland kitty wofi waybar sddm noto-fonts thunar hyprlock grim slurp wl-clipboard playerctl"; DM="sddm" ;;
cli|*) PKGS="" ;; cli|*) PKGS="" ;;
esac esac
# Navigateur de base ajouté DÈS QU'un bureau est choisi (jamais en CLI). # Navigateur de base ajouté DÈS QU'un bureau est choisi (jamais en CLI).
@@ -262,10 +282,60 @@ if [ -n "$PKGS" ]; then
if pacman -Sy --noconfirm $PKGS; then if pacman -Sy --noconfirm $PKGS; then
[ -n "$DM" ] && systemctl enable "$DM" || true [ -n "$DM" ] && systemctl enable "$DM" || true
systemctl set-default graphical.target || true systemctl set-default graphical.target || true
# SDDM (KDE / XFCE / Hyprland) : pavé numérique allumé au login. # SDDM (KDE / XFCE / Hyprland) : pavé numérique + écran de connexion FWS.
# Le thème « fws » (livré par l'airootfs → recopié par le payload dans
# /usr/share/sddm/themes/fws) est en pur QtQuick/Controls Basic :
# qt6-declarative, dépendance de sddm, suffit → même écran soigné pour
# les 3 DE SANS paquet de thème supplémentaire (Breeze n'existe qu'avec
# plasma). Accent adapté au bureau via theme.conf.user (mécanisme de
# surcharge standard de SDDM, lu par-dessus theme.conf du thème).
if [ "$DM" = "sddm" ]; then if [ "$DM" = "sddm" ]; then
install -d /etc/sddm.conf.d install -d /etc/sddm.conf.d
printf '[General]\nNumlock=on\n' > /etc/sddm.conf.d/10-fws.conf cat > /etc/sddm.conf.d/10-fws.conf <<'SDDMEOF'
[General]
Numlock=on
[Theme]
Current=fws
SDDMEOF
case "$DESK" in
xfce) _ACCENT="#16a085" ;; # sarcelle (assorti à XFCE)
hyprland) _ACCENT="#89b4fa" ;; # bleu Catppuccin (assorti à Hyprland)
*) _ACCENT="#3daee9" ;; # bleu Breeze (KDE, défaut)
esac
if [ -d /usr/share/sddm/themes/fws ]; then
printf '[General]\naccent=%s\n' "$_ACCENT" \
> /usr/share/sddm/themes/fws/theme.conf.user
else
echo "[FWS] thème SDDM fws introuvable — thème par défaut conservé"
sed -i '/^Current=fws$/d' /etc/sddm.conf.d/10-fws.conf
fi
fi
# GDM (GNOME) : « la même chose » autant que possible — le greeter de
# GDM EST GNOME Shell, il ne se thème pas comme SDDM. On passe par
# dconf (base système « gdm ») : bannière d'accueil FWS, horloge avec
# date complète, pavé numérique allumé — même confort qu'avec SDDM.
if [ "$DM" = "gdm" ]; then
install -d /etc/dconf/profile /etc/dconf/db/gdm.d
cat > /etc/dconf/profile/gdm <<'GDMEOF'
user-db:user
system-db:gdm
file-db:/usr/share/gdm/greeter-dconf-defaults
GDMEOF
cat > /etc/dconf/db/gdm.d/10-fws <<'GDMEOF'
[org/gnome/login-screen]
banner-message-enable=true
banner-message-text='Bienvenue sur FWS'
[org/gnome/desktop/interface]
clock-show-date=true
clock-show-weekday=true
[org/gnome/desktop/peripherals/keyboard]
numlock-state=true
remember-numlock-state=false
GDMEOF
dconf update || echo "[FWS] dconf update a échoué (bannière GDM à refaire)"
fi fi
# Hyprland en VM : sur GPU virtuel (VMware/VirtualBox) le compositeur # Hyprland en VM : sur GPU virtuel (VMware/VirtualBox) le compositeur
# crashe au lancement → SDDM « remet au login ». On le lance via un # crashe au lancement → SDDM « remet au login ». On le lance via un
@@ -317,11 +387,18 @@ if [ "$DESK" = "hyprland" ] && [ -f /usr/local/share/fws/hyprland.conf.tmpl ]; t
sed -e "s/__KB_LAYOUT__/${XL:-us}/" -e "s/__KB_VARIANT__/${XV}/" \ sed -e "s/__KB_LAYOUT__/${XL:-us}/" -e "s/__KB_VARIANT__/${XV}/" \
/usr/local/share/fws/hyprland.conf.tmpl > /tmp/fws-hyprland.conf /usr/local/share/fws/hyprland.conf.tmpl > /tmp/fws-hyprland.conf
install -Dm644 /tmp/fws-hyprland.conf /etc/skel/.config/hypr/hyprland.conf install -Dm644 /tmp/fws-hyprland.conf /etc/skel/.config/hypr/hyprland.conf
# Waybar FWS : barre assortie + bouton « ⌨ Raccourcis » (fws-hypr-keys,
# aussi sur SUPER+K) qui liste les binds RÉELS chargés par Hyprland
# (hyprctl binds -j) — les descriptions viennent des bindd de la config.
install -Dm644 /usr/local/share/fws/waybar-config.json /etc/skel/.config/waybar/config
install -Dm644 /usr/local/share/fws/waybar-style.css /etc/skel/.config/waybar/style.css
while IFS=: read -r _u _x _uid _g _gec _home _sh; do while IFS=: read -r _u _x _uid _g _gec _home _sh; do
[ "$_uid" -ge 1000 ] && [ "$_uid" -le 60000 ] && [ -d "$_home" ] || continue [ "$_uid" -ge 1000 ] && [ "$_uid" -le 60000 ] && [ -d "$_home" ] || continue
install -Dm644 /tmp/fws-hyprland.conf "$_home/.config/hypr/hyprland.conf" install -Dm644 /tmp/fws-hyprland.conf "$_home/.config/hypr/hyprland.conf"
install -Dm644 /usr/local/share/fws/waybar-config.json "$_home/.config/waybar/config"
install -Dm644 /usr/local/share/fws/waybar-style.css "$_home/.config/waybar/style.css"
chown "$_u": "$_home/.config" 2>/dev/null || true chown "$_u": "$_home/.config" 2>/dev/null || true
chown -R "$_u": "$_home/.config/hypr" 2>/dev/null || true chown -R "$_u": "$_home/.config/hypr" "$_home/.config/waybar" 2>/dev/null || true
done < /etc/passwd done < /etc/passwd
rm -f /tmp/fws-hyprland.conf rm -f /tmp/fws-hyprland.conf
fi fi