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:
@@ -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
|
||||
|
||||
Reference in New Issue
Block a user