tuxflotte-installer/scripts/build_boot_medium.sh
Thomas Stallinger 8b47751b31 boot-medium: Konsolen-Rauschen bei 40_backend.sh verbergen, toram, neues Banner
Drei zusammenhaengende Punkte aus dem zweiten echten Hardware-Test
(02.09.2026):

1. "Das backend40-Script/Partitionierung zeigt viele Zeilen Ausgaben...
   Nach dem Entpacken kommen wieder sehr viele Zeilen Ausgaben" - neue
   run_module_backend() (utils.sh) faengt jetzt auch 40_backend.sh ab
   (Partitionieren/Formatieren/chroot-Fixup/Bootloader/Postinstall
   verborgen wie jedes andere Modul), OHNE animierten Kreisel (statischer
   Titel, da das Modul seinen eigenen Fortschritt zeigt). Der Download-
   Fortschrittsbalken selbst bleibt sichtbar: curl schreibt ihn bei
   aktivem TUXFLOTTE_TTY_LIVE direkt auf /dev/tty1, umgeht damit gezielt
   die stdout/stderr-Umleitung des Moduls (image_deploy.sh).

2. "Wenn ich... mit Enter den Neustart auslösen möchte, kommt es zu
   zahlreichen squashfs-Fehlern, weil das Dateisystem nicht mehr da ist."
   - "toram" im Bootappend (build_boot_medium.sh) kopiert das gesamte
   Boot-Medium beim Start einmalig in eine Tmpfs; danach ist der Stick fuer
   den laufenden Betrieb komplett irrelevant, ein Ziehen jederzeit
   gefahrlos moeglich - vorher blieb das laufende System per Squashfs+
   Loop-Mount direkt vom physischen Medium abhaengig.

3. Neues Boot-Banner (pics/tuxflotte-terminal-80neu.txt).

Beim eigenen Testen von Punkt 1 zwei echte Bugs gefunden+behoben (siehe
Kommentare in image_deploy.sh): "pipeline || true" ueberschreibt
PIPESTATUS mit dem einelementigen Ergebnis von "true", sobald die
Pipeline fehlschlaegt - traf live bei einer echten Netzwerkunterbrechung
waehrend des Downloads auf ("pipe_status[1]: unbound variable" unter
"set -u"). Der Wechsel auf eine "if"-Bedingung (set -e-Ausnahme ohne ein
zweites Kommando) reichte allein nicht, PIPESTATUS blieb bei einem
echten, mitten im Transfer abgebrochenen curl|tar manchmal trotzdem
unvollstaendig - jetzt zusaetzlich robust mit ":-1"-Fallback direkt auf
den einzelnen Indizes statt einer vorausgesetzten vollstaendigen Kopie.

Live in QEMU verifiziert: neues Banner + verborgenes Partitionier-Rauschen
+ sichtbarer Fortschrittsbalken bestaetigt (Screenshot). Eine echte,
waehrend des Testens aufgetretene Netzwerk-Durchsatzverschlechterung
(anode nur noch ~4,6 MB/s, unabhaengig von diesem Code) verhinderte einen
weiteren vollstaendigen Erfolgsdurchlauf in dieser Session - der
pipe_status-Fix selbst wurde aber genau durch diese Unterbrechung bestaetigt
(sauberer [FEHLER]-Abbruch mit klarer Meldung statt Bash-Crash). toram
selbst (Boot bis zum Auto-Modus-Start, Konfiguration/Partitionierung liefen
durch) und die Rauschen-Unterdrueckung sind bestaetigt; die volle
Stick-waehrend-Reboot-Sequenz bleibt fuer den naechsten echten
Hardware-Test zu bestaetigen.
2026-09-01 19:11:59 +02:00

94 lines
3.6 KiB
Bash
Executable File

#!/usr/bin/env bash
set -Eeuo pipefail
# Baut das eigenstaendige Tuxflotte-Boot-Medium (Debian trixie, per
# Debian-live-build) - siehe Plan ~/.claude/plans/inherited-floating-treasure.md
# und Memory project_independent_boot_medium.md.
#
# Ersetzt langfristig scripts/build.sh/build_customer_iso.sh (Casper-Patchen
# einer echten Linux-Mint-Live-ISO): dieses Boot-Medium enthaelt nur
# Tuxflottes eigenen, headless-tauglichen Code (Module 00-40,
# backends/mint-image/) und beruehrt niemals Ubiquity/Casper/eine
# Distributions-Live-Session - macht die Bug-Klasse, die zu dieser
# Architektur gefuehrt hat (siehe Memory-Datei), strukturell unmoeglich.
#
# --dev aktiviert einen SSH-Debug-Zugang (Testzugang tuxflotte/test123,
# analog bestehender Test-Fixtures wie WLAN-Test-Org) - ohne --dev bleibt
# SSH deaktiviert, keine gebackenen Zugangsdaten (Produktiv-Default,
# konsistent damit, dass auch das Golden Image selbst keine Zugangsdaten
# enthaelt). Siehe boot-medium/config/hooks/live/0900-tuxflotte-ssh-mode.hook.chroot.
#
# "toram" im Bootappend (02.09.2026, echter Hardware-Test): ohne dieses
# Flag bleibt das laufende System ueber Squashfs+Loop-Mount direkt vom
# physischen Boot-Medium abhaengig - zieht der Kunde den USB-Stick, sobald
# er dazu aufgefordert wird (siehe "Fertig!"-Hinweis in backend.sh), noch
# WAEHREND des anschliessenden Reboot-Shutdowns, verliert das noch
# laufende System mitten im Herunterfahren seine eigene Root-Partition -
# Ergebnis waren zahlreiche Squashfs-I/O-Fehler. "toram" kopiert das ganze
# Boot-Medium beim Start einmalig in eine Tmpfs (RAM) - danach ist der Stick
# fuer den laufenden Betrieb komplett irrelevant, ein Ziehen jederzeit
# gefahrlos moeglich. Kostet etwas Bootzeit (das ganze Medium, ~700 MB,
# muss zuerst einmal komplett gelesen werden) und etwas mehr RAM
# waehrenddessen - auf jeder Zielhardware, die ueberhaupt Linux Mint
# Cinnamon stemmen soll, unproblematisch.
usage() {
echo "Usage: $0 [--dev]" >&2
echo " --dev SSH-Debug-Zugang aktivieren (tuxflotte/test123)" >&2
}
DEV_BUILD=false
for arg in "$@"; do
case "$arg" in
--dev) DEV_BUILD=true ;;
-h|--help) usage; exit 0 ;;
*) echo "Error: Unbekannter Parameter: $arg" >&2; usage; exit 1 ;;
esac
done
if [[ "${EUID}" -ne 0 ]]; then
echo "Error: muss als root laufen (live-build braucht root fuer chroot/mount)." >&2
exit 1
fi
for cmd in lb; do
command -v "${cmd}" >/dev/null 2>&1 ||
{ echo "Error: fehlendes Werkzeug: ${cmd} (apt-get install live-build)" >&2; exit 1; }
done
REPO_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")/.." && pwd)"
BOOT_MEDIUM_DIR="${REPO_DIR}/boot-medium"
DEV_MARKER="${BOOT_MEDIUM_DIR}/config/includes.chroot/etc/tuxflotte-dev-build"
[[ -d "${BOOT_MEDIUM_DIR}/config" ]] ||
{ echo "Error: ${BOOT_MEDIUM_DIR}/config fehlt - lb config wurde noch nie ausgefuehrt." >&2; exit 1; }
cd "${BOOT_MEDIUM_DIR}"
if [[ "${DEV_BUILD}" == true ]]; then
echo "==> Dev-Build: SSH-Debug-Zugang wird aktiviert (tuxflotte/test123)."
mkdir -p "$(dirname "${DEV_MARKER}")"
touch "${DEV_MARKER}"
else
echo "==> Produktiv-Build: SSH bleibt deaktiviert."
rm -f "${DEV_MARKER}"
fi
echo "==> lb clean"
lb clean
echo "==> lb config"
lb config \
--distribution trixie \
--architectures amd64 \
--archive-areas "main contrib non-free non-free-firmware" \
--binary-images iso-hybrid \
--bootloaders "grub-efi,syslinux" \
--debian-installer none \
--bootappend-live "boot=live components toram quiet splash vconsole.keymap=de"
echo "==> lb build"
lb build
echo "==> Boot-Medium gebaut: ${BOOT_MEDIUM_DIR}/live-image-amd64.hybrid.iso"