From d6a01462efb8d4c140b857e93d51182023d8e8ce Mon Sep 17 00:00:00 2001 From: Thomas Stallinger Date: Thu, 6 Aug 2026 14:35:11 +0200 Subject: [PATCH] =?UTF-8?q?feat:=20backend=5Flaunch()=20f=C3=BCr=20Mint=20?= =?UTF-8?q?real=20implementieren=20(Phase=201)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Startet die unbeaufsichtigte Ubiquity-Installation direkt aus dem laufenden Live-System heraus per kexec - das personalisierte, erst zur Laufzeit erzeugte Preseed (Hostname/Geräte-ID/Partitionierung sind erst hier bekannt) wird dafür in eine zusätzliche Initrd-Schicht eingebettet (aneinandergehängte cpio-Archive, vom Kernel nativ unterstützt) statt per file=/cdrom/... (read-only Medium) oder url= (Prozess-/Netzwerkzustand geht beim Kexec-Sprung verloren). backend_init() installiert kexec-tools jetzt bei Bedarf nach (auf dem Live-Medium anders als im Zielsystem nicht vorinstalliert). Real per QEMU verifiziert: kexec aus laufender Live-Sitzung heraus funktioniert, automatic-ubiquity mit sowohl url= als auch initrd-eingebettetem file= erreicht, komplette unbeaufsichtigte Installation (Partitionierung, Paketinstallation, success_command) bis zum funktionierenden Login-Bildschirm durchlaufen lassen. Danach zusätzlich der tatsächliche, committete backend.sh-Code (nicht nur die Spike-Annäherung) end-to-end über alle fünf Lifecycle-Funktionen gegen ein reales runtime_blueprint.json/response.json bestätigt. Bekannte Restlücke: jq/envsubst/base64 sind auf dem Live-Medium ebenfalls nicht vorinstalliert (backend_init prüft nur, installiert nicht nach) - vorbestehende Lücke, nicht Teil dieser Änderung. Co-Authored-By: Claude Sonnet 5 --- backends/mint/backend.sh | 60 ++++++++++++++++++++++++++++++++++++++-- 1 file changed, 58 insertions(+), 2 deletions(-) diff --git a/backends/mint/backend.sh b/backends/mint/backend.sh index b730d9e..2451970 100644 --- a/backends/mint/backend.sh +++ b/backends/mint/backend.sh @@ -31,6 +31,22 @@ backend_init() { { backend_fatal "Benötigtes Werkzeug fehlt: ${cmd}"; return 1; } done + # kexec-tools ist auf dem Live-Medium selbst (anders als im Zielsystem, + # siehe pkgsel/include in preseed.tpl) nicht vorinstalliert - real gegen + # das Live-Abbild verifiziert (Phase-1-Spike). Bis das Paket fest in die + # ISO gebacken wird (Folgeschritt), hier als Live-Nachinstallation. + if ! command -v kexec >/dev/null 2>&1; then + backend_log "kexec-tools fehlt auf dem Live-Medium, installiere nach." + + sed -i '/^deb cdrom/d' /etc/apt/sources.list 2>/dev/null || true + rm -f /etc/apt/sources.list.d/*cdrom* 2>/dev/null || true + + apt-get update -qq || + { backend_fatal "apt-get update fehlgeschlagen (kexec-tools)."; return 1; } + DEBIAN_FRONTEND=noninteractive apt-get install -y kexec-tools || + { backend_fatal "Installation von kexec-tools fehlgeschlagen."; return 1; } + fi + [[ -r "${PRESEED_TEMPLATE}" ]] || { backend_fatal "Preseed-Template nicht gefunden: ${PRESEED_TEMPLATE}"; return 1; } @@ -156,8 +172,48 @@ backend_generate_config() { } backend_launch() { - backend_log "Phase 1: Start des nativen Installers ist noch nicht aktiv." - backend_log "Erzeugte Konfiguration liegt bereit unter: ${CONFIG_FILE}" + local cdrom_vmlinuz="/cdrom/casper/vmlinuz" + local cdrom_initrd="/cdrom/casper/initrd.lz" + local extra_initrd_dir="${RUNTIME_DIR}/initrd-extra" + local extra_cpio="${RUNTIME_DIR}/extra.cpio.gz" + local custom_initrd="${RUNTIME_DIR}/initrd-custom.lz" + + [[ -r "${cdrom_vmlinuz}" && -r "${cdrom_initrd}" ]] || + { backend_fatal "Casper-Kernel/-Initrd nicht gefunden unter /cdrom/casper."; return 1; } + + # Das personalisierte Preseed (CONFIG_FILE, erst live auf diesem Gerät + # erzeugt - Hostname/Geräte-ID/Partitionierung sind erst hier bekannt, + # nicht schon beim ISO-Bau) kann nicht per file=/cdrom/... übergeben + # werden (read-only Medium, Inhalt seit ISO-Bau fixiert) und auch nicht + # per url= von einem selbst gestarteten lokalen Server - der komplette + # Prozess- und Netzwerkzustand dieser Sitzung geht beim Kexec-Sprung + # verloren, ein soeben gestarteter HTTP-Server koennte die neue + # Boot-Umgebung also nicht mehr bedienen. Stattdessen wird das Preseed in + # eine zusaetzliche Initrd-Schicht eingebettet: der Kernel unterstuetzt + # aneinandergehaengte cpio-Archive als initramfs (spaetere Archive + # ergaenzen fruehere), das uebersteht den Kexec-Uebergang unveraendert. + # Real gegen QEMU verifiziert (Phase-1-Spike, beide Ansaetze getestet). + rm -rf "${extra_initrd_dir}" + install -d --mode=0700 --owner=root --group=root "${extra_initrd_dir}" + cp "${CONFIG_FILE}" "${extra_initrd_dir}/preseed.cfg" + + (cd "${extra_initrd_dir}" && find . | cpio -o -H newc 2>/dev/null | gzip) \ + >"${extra_cpio}" || + { backend_fatal "Preseed-Initrd-Schicht konnte nicht gebaut werden."; return 1; } + + cat "${cdrom_initrd}" "${extra_cpio}" >"${custom_initrd}" || + { backend_fatal "Initrd konnte nicht zusammengesetzt werden."; return 1; } + + backend_log "Lade Kexec-Ziel fuer automatisierten Ubiquity-Start." + + kexec -l "${cdrom_vmlinuz}" \ + --initrd="${custom_initrd}" \ + --append="boot=casper automatic-ubiquity noprompt file=/preseed.cfg debian-installer/language=de keyboard-configuration/layoutcode=de quiet splash ---" || + { backend_fatal "kexec -l fehlgeschlagen."; return 1; } + + backend_log "Starte unbeaufsichtigte Installation (kexec -e). Kein Ruecksprung erwartet - ab hier laeuft die eigentliche Installation im neuen Kernel weiter." + + kexec -e } backend_postinstall() {