feat(xinitrc): add anaconda installer improvements and splash screen

Add several improvements to the liveinst installer workflow:

- Expose archiso squashfs at /run/rootfsbase where Anaconda expects to find
  the Live OS image, fixing SourceSetupError crashes
- Display immediate splash screen with zenity during Anaconda startup (2-4 min
  wait time) to provide user feedback and prevent perceived hangs
- Wrap liveinst with dbus-run-session to provide D-Bus session bus, fixing
  GLib.GError crashes from missing ScreenSaver service
- Add hardware summary log output to debug information collection

These changes address three crash scenarios identified during testing and
improve user experience during installer initialization.
This commit is contained in:
2026-07-03 23:58:28 +02:00
parent 0b0fcd8ce4
commit ee0082baa1
+55 -1
View File
@@ -20,10 +20,61 @@ _OB_PID=$!
# boucle (symptôme « fond bleu qui clignote/reboote »). On NE rend jamais la main
# à startx : on reste sur Openbox pour lire les logs / rebooter proprement.
if command -v liveinst >/dev/null 2>&1; then
# Payload LiveOS : avec --liveinst (passé par liveinst), Anaconda IGNORE le
# payload du kickstart (anaconda.py teste opts.liveinst AVANT le type du
# payload DBus — un « liveimg » dans le ks serait du code mort) et détecte
# l'image live sur des chemins Fedora/dracut : /dev/mapper/live-base,
# /dev/mapper/live-osimg-min ou /run/rootfsbase — tous ABSENTS d'archiso →
# « SourceSetupError: No Live OS image found! » = crash au démarrage
# (reproduit hors VM dans un chroot de l'airootfs). On expose donc le
# squashfs archiso (monté ro sur /run/archiso/airootfs) là où Anaconda le
# cherche : findmnt y résout le loop device → montage → rsync vers la cible.
if [ -d /run/archiso/airootfs ] && [ ! -e /run/rootfsbase ]; then
mkdir -p /run/rootfsbase
mount --bind /run/archiso/airootfs /run/rootfsbase || rmdir /run/rootfsbase
fi
# ÉCRAN D'ATTENTE immédiat : le démarrage d'anaconda peut prendre 2 à
# 4 minutes (observé en VM VMware : un worker udev se bloque au boot et
# n'est tué par udevd qu'après 180 s → le « udevadm settle » d'anaconda
# attend tout ce temps). Sans feedback, l'écran reste bleu et muet et
# l'utilisateur croit à une panne (« l'installateur ne se lance pas »)
# alors que TOUT va bien. Le splash pulse pendant la préparation ;
# anaconda s'ouvre PAR-DESSUS quand il est prêt (openbox donne le focus
# aux nouvelles fenêtres) et on tue le splash à la sortie de liveinst.
# tail -f /dev/null : zenity --progress lit stdin — un stdin qui ne se
# ferme jamais garde la fenêtre ouverte sans consommer de CPU.
_SPLASH_PID=""
if command -v zenity >/dev/null 2>&1; then
tail -f /dev/null | zenity --progress --pulsate --no-cancel \
--title="FWS" \
--text="<b>Préparation de l'installateur FWS…</b>\n\nAnalyse du matériel et des disques en cours.\nCela peut prendre 2 à 4 minutes, c'est normal." \
--width=420 2>/dev/null &
_SPLASH_PID=$!
fi
LIVEINST_LOG=/tmp/fws-liveinst.log
liveinst >"$LIVEINST_LOG" 2>&1
# Bus D-Bus de SESSION : au démarrage (--liveinst), inhibit_screensaver()
# de pyanaconda se connecte au bus de session. S'il n'y en a AUCUN (notre
# startx root minimal n'en garantit pas), Gio lève une GLib.GError que
# pyanaconda n'attrape PAS (il n'attrape que DBusError) → crash immédiat
# (2e crash reproduit hors VM). dbus-run-session fournit un bus de session
# pour toute la durée de l'installateur ; avec un bus présent, l'absence du
# service ScreenSaver est attrapée (simple warning dans anaconda.log).
if command -v dbus-run-session >/dev/null 2>&1 && [ -z "${DBUS_SESSION_BUS_ADDRESS:-}" ]; then
dbus-run-session -- liveinst >"$LIVEINST_LOG" 2>&1
else
liveinst >"$LIVEINST_LOG" 2>&1
fi
rc=$?
# liveinst terminé (install finie ou échec) : le splash n'a plus de raison
# d'être — kill du pipeline tail|zenity (pkill -P attrape les deux).
if [ -n "$_SPLASH_PID" ]; then
pkill -P "$_SPLASH_PID" 2>/dev/null
kill "$_SPLASH_PID" 2>/dev/null
fi
# ATTENTION : liveinst NE propage PAS le code de sortie d'anaconda — il
# enchaîne son propre nettoyage et sort souvent 0 même quand anaconda a
# planté. On ne se fie donc PAS à $rc : en phase debug on regroupe TOUS les
@@ -66,6 +117,9 @@ if command -v liveinst >/dev/null 2>&1; then
echo
echo "########## %post --nochroot (/tmp/fws-post-nochroot.log) ##########"
cat /tmp/fws-post-nochroot.log 2>/dev/null || echo "(absent)"
echo
echo "########## Récapitulatif (page GUI fws_recap, avant install) ##########"
cat /tmp/fws-hw-summary.txt 2>/dev/null || echo "(absent — page récap pas atteinte)"
for f in /tmp/anaconda.log /tmp/syslog /tmp/program.log \
/tmp/storage.log /tmp/dbus.log /tmp/packaging.log /tmp/X.log; do
echo