ee0082baa1
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.
158 lines
7.7 KiB
Bash
158 lines
7.7 KiB
Bash
#!/bin/sh
|
|
# Lancé par startx (cf. /root/.zprofile), uniquement dans le live FWS.
|
|
if [ ! -d /run/archiso ]; then
|
|
exit 0
|
|
fi
|
|
|
|
xsetroot -solid "#1a1a2e"
|
|
|
|
# Openbox en arrière-plan : gestionnaire de fenêtres pour l'installateur.
|
|
openbox &
|
|
_OB_PID=$!
|
|
|
|
# Chantier C : lance l'installateur Anaconda en mode live s'il est présent.
|
|
# « liveinst » re-exécute anaconda (ici on est déjà root → pas de pkexec/polkit).
|
|
#
|
|
# DEBUG (premier run réel) : on CAPTURE stdout+stderr — un plantage d'import
|
|
# précoce de Python n'apparaît QUE là, pas dans /tmp/anaconda.log — et, si
|
|
# liveinst quitte en erreur, on regroupe tous les logs Anaconda et on les AFFICHE
|
|
# (zenity) au lieu de laisser startx rendre la main → .zprofile relancerait X en
|
|
# 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
|
|
# 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
|
|
# logs et on les affiche systématiquement (zenity). Le traceback Python d'un
|
|
# crash d'import précoce n'est QUE dans $LIVEINST_LOG (stderr capturé).
|
|
# Log du %post chrooté (grub-install / mkinitcpio) = CE qui rend le disque
|
|
# bootable. Le kickstart en copie une version dans le LIVE
|
|
# (/tmp/fws-post-chroot.log, via un %post --nochroot final, cible encore
|
|
# montée → fiable). SECOURS si absent : on réactive le LVM (pvscan/vgscan
|
|
# rescannent les PV qu'Anaconda a désactivés) et on remonte le disque pour
|
|
# le lire.
|
|
if [ ! -s /tmp/fws-post-chroot.log ]; then
|
|
pvscan --cache >/dev/null 2>&1 || true
|
|
vgscan --mknodes >/dev/null 2>&1 || true
|
|
vgchange -ay >/dev/null 2>&1 || true
|
|
udevadm settle --timeout=10 >/dev/null 2>&1 || true
|
|
mkdir -p /run/fws-installed
|
|
for _dev in /dev/mapper/*-root /dev/mapper/* /dev/sd*[0-9] /dev/vd*[0-9] /dev/nvme*n*p*; do
|
|
[ -b "$_dev" ] || continue
|
|
mount -o ro "$_dev" /run/fws-installed 2>/dev/null || continue
|
|
if [ -f /run/fws-installed/var/log/fws-post.log ]; then
|
|
cp -f /run/fws-installed/var/log/fws-post.log /tmp/fws-post-chroot.log 2>/dev/null
|
|
umount /run/fws-installed 2>/dev/null || true
|
|
break
|
|
fi
|
|
umount /run/fws-installed 2>/dev/null || true
|
|
done
|
|
fi
|
|
|
|
DBG=/tmp/fws-debug.txt
|
|
{
|
|
echo "===== liveinst sorti (code $rc) — logs Anaconda ====="
|
|
echo
|
|
echo "########## sortie liveinst (stdout+stderr) ##########"
|
|
cat "$LIVEINST_LOG" 2>/dev/null
|
|
echo
|
|
echo "########## %post chrooté = grub-install / mkinitcpio ##########"
|
|
echo "########## >>> C'EST CE BLOC QUI DIT SI LE DISQUE VA BOOTER <<< ##########"
|
|
cat /tmp/fws-post-chroot.log 2>/dev/null || echo "(log introuvable)"
|
|
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
|
|
echo "########## $f ##########"
|
|
tail -n 200 "$f" 2>/dev/null || echo "(absent)"
|
|
done
|
|
} >"$DBG" 2>&1
|
|
|
|
# Succès d'install = les DEUX étapes qui rendent le disque bootable ont
|
|
# réussi dans le %post : mkinitcpio (« Initcpio image generation successful »)
|
|
# ET grub-install (« Installation finished. No error reported. »). Si oui →
|
|
# on montre un écran de RÉUSSITE et on éteint (l'utilisateur retire l'ISO puis
|
|
# rallume sur FWS). Sinon → on affiche tous les logs de debug (comportement
|
|
# debug). Les lignes cosmétiques (load_policy, warnings GTK…) n'influent PAS
|
|
# sur cette détection : on ne regarde que le log du %post.
|
|
if grep -q 'Initcpio image generation successful' /tmp/fws-post-chroot.log 2>/dev/null \
|
|
&& grep -q 'Installation finished. No error reported.' /tmp/fws-post-chroot.log 2>/dev/null; then
|
|
if command -v zenity >/dev/null 2>&1; then
|
|
zenity --info --width=480 --title="FWS — installation réussie ✅" \
|
|
--text="<b>FWS est installé sur le disque.</b>\n\n1. Clique OK pour <b>éteindre</b> la machine.\n2. <b>Retire l'ISO</b> (lecteur CD/DVD).\n3. Rallume → FWS démarre." \
|
|
2>/dev/null
|
|
fi
|
|
systemctl poweroff
|
|
else
|
|
# Échec (ou install non terminée) : on montre les logs pour diagnostiquer.
|
|
if command -v zenity >/dev/null 2>&1; then
|
|
zenity --text-info --title="FWS — logs Anaconda (sortie $rc)" \
|
|
--filename="$DBG" --width=1100 --height=720 2>/dev/null &
|
|
fi
|
|
wait "$_OB_PID"
|
|
fi
|
|
else
|
|
echo "[FWS] Anaconda absent de l'ISO — à builder (setup-aur.sh) + ajouter à packages.x86_64." >&2
|
|
exec openbox
|
|
fi
|