[FIX] qemu debian s390x : journal de console et question reseau Z

« L'installation a echoue, pas de sortie pertinente » : une console pty
ne garde RIEN. Quand d-i s'arrete, il l'ecrit a l'ecran d'une VM que
personne ne regarde, et il ne reste rien a lire. La voie installateur
ecrit desormais un journal qui survit a l'arret du domaine.

Ce journal a immediatement nomme la premiere cause : d-i s'arretait sur
« Configure the network device », une question propre a s390x posee par
le udeb s390-netdevice — ctc, qeth, iucv ou virtio. Elle n'a AUCUNE
valeur par defaut, donc priority=critical ne la saute pas. Preseedee a
virtio, elle disparait.

Reste un second arret, non resolu : netcfg n'essaie aucun DHCP et tombe
sur la saisie d'une adresse statique. Ni le delai de lien, ni le nom
explicite de l'interface n'y changent quoi que ce soit.

--- EN ---

"The install failed, no relevant output": a pty console keeps NOTHING.
When d-i stops, it says so on the screen of a VM nobody watches, and
nothing is left to read. The installer path now writes a log that
outlives the domain.

That log immediately named the first cause: d-i stopped on "Configure
the network device", an s390x-only question from the s390-netdevice
udeb — ctc, qeth, iucv or virtio. It has NO default, so
priority=critical does not skip it. Preseeded to virtio, it is gone.

A second stop remains, unsolved: netcfg attempts no DHCP and falls to
static address entry. Neither the link timeout nor naming the interface
explicitly changes anything.

Assisted-by: Claude Opus 5
(cherry picked from commit d1a371a8f4775e8488522fba24a79775a5a101e8)
This commit is contained in:
Mathieu Benoit 2026-08-13 17:08:25 -04:00
parent 4df994f721
commit 12db87e1c2

View file

@ -1733,9 +1733,32 @@ def build_preseed(
lines = [ lines = [
"d-i debian-installer/locale string en_US.UTF-8", "d-i debian-installer/locale string en_US.UTF-8",
"d-i keyboard-configuration/xkb-keymap select us", "d-i keyboard-configuration/xkb-keymap select us",
# Question propre à s390x, posée par le udeb « s390-netdevice » et
# inexistante ailleurs : le matériel Z offre ctc, qeth, iucv ou
# virtio, et d-i ne devine pas. Elle n'a AUCUNE valeur par défaut,
# donc « priority=critical » ne la saute pas — l'installation se
# figeait dessus, sur le premier choix de la liste (ctc), en
# n'affichant rien d'autre qu'un écran bleu. Mesuré.
"d-i s390-netdevice/choose_networktype select virtio",
# « auto » évite la question du choix d'interface : sous virtio-ccw # « auto » évite la question du choix d'interface : sous virtio-ccw
# elle s'appelle enc1 et non eth0, et le nom n'est pas devinable. # elle s'appelle enc1 et non eth0, et le nom n'est pas devinable.
"d-i netcfg/choose_interface select auto", # « enc1 » et non « auto ». Sur s390x la liste d'interfaces est bâtie
# par le udeb s390-netdevice, et « auto » ne s'y résout pas : netcfg
# n'essaie alors AUCUN DHCP — aucun bail côté dnsmasq — et tombe
# droit sur la saisie d'une adresse statique. Mesuré deux fois.
# Le nom est déterministe sous s390-ccw-virtio : le premier NIC
# virtio-ccw est enc1, comme le journal du noyau le montre
# (« virtio_net virtio2 enc1: renamed from eth0 »).
"d-i netcfg/choose_interface select enc1",
# Émulation TCG : le lien met bien plus longtemps à monter qu'en
# natif — « enc1 » n'est renommé qu'à 4,7 s de temps invité, et
# netcfg sonde avant. Sans lien détecté il n'ESSAIE MÊME PAS le DHCP
# et tombe droit sur la saisie d'une adresse statique. Mesuré : zéro
# DHCPDISCOVER côté dnsmasq, aucun bail. On lui laisse le temps, et
# un échec repart en autoconfiguration au lieu de poser la question.
"d-i netcfg/link_wait_timeout string 60",
"d-i netcfg/dhcp_timeout string 120",
"d-i netcfg/dhcp_options select Retry network autoconfiguration",
f"d-i netcfg/get_hostname string {args.hostname}", f"d-i netcfg/get_hostname string {args.hostname}",
"d-i netcfg/get_domain string localdomain", "d-i netcfg/get_domain string localdomain",
"d-i netcfg/hostname string " + args.hostname, "d-i netcfg/hostname string " + args.hostname,
@ -1941,6 +1964,7 @@ def virt_install(
# s390x n'a pas de port série ISA : la console est SCLP (ttysclp0), et non # s390x n'a pas de port série ISA : la console est SCLP (ttysclp0), et non
# ttyS0. Ailleurs (x86/arm64), console série classique. # ttyS0. Ailleurs (x86/arm64), console série classique.
console_target = "sclp" if args.arch == "s390x" else "serial" console_target = "sclp" if args.arch == "s390x" else "serial"
console_log = f"/var/log/libvirt/qemu/{args.name}-console.log"
# Écran virtuel pour une VM graphique. s390x en est écarté : QEMU y expose # Écran virtuel pour une VM graphique. s390x en est écarté : QEMU y expose
# bien « virtio-gpu-ccw », mais rien ne garantit que le noyau s390x de la # bien « virtio-gpu-ccw », mais rien ne garantit que le noyau s390x de la
# distribution embarque le pilote DRM virtio-gpu — la VM démarrerait alors # distribution embarque le pilote DRM virtio-gpu — la VM démarrerait alors
@ -2027,7 +2051,14 @@ def virt_install(
"--graphics", "--graphics",
graphics, graphics,
"--console", "--console",
f"pty,target_type={console_target}", # Journal de console pour la voie installateur. Une console « pty »
# seule ne gardE rien : quand d-i échoue, il l'écrit à l'écran d'une
# VM que personne ne regarde, et il ne reste RIEN à lire ensuite —
# exactement « l'installation a échoué, pas de sortie pertinente ».
# Le fichier, lui, survit à l'arrêt du domaine.
f"pty,target_type={console_target},log.file={console_log}"
if installer
else f"pty,target_type={console_target}",
# Canal virtio de l'agent invité (org.qemu.guest_agent.0) : permet à # Canal virtio de l'agent invité (org.qemu.guest_agent.0) : permet à
# virsh de piloter la VM SANS réseau (ex. étendre le FS invité après # virsh de piloter la VM SANS réseau (ex. étendre le FS invité après
# un redimensionnement de disque). Inoffensif si l'agent est absent. # un redimensionnement de disque). Inoffensif si l'agent est absent.