tuxflotte-installer/scripts/image_deploy_test.sh
Thomas Stallinger 5845e0108a feat: Golden-Image-Deployment als Ersatz fuer Ubiquity-Automatisierung (Phase 0+1)
Neue Richtung nach ADR-0024-Diskussion: statt Distributions-Installer
(Ubiquity/Anaconda) zu automatisieren - strukturell fragil, siehe
ADR-0023-Nachtrag zum partman-rebuild-cache-Loop - wird das
curtin/FAI-Muster genutzt: Zieldatentraeger direkt partitionieren, ein
fertiges Root-Filesystem-Image entpacken, per chroot nacharbeiten.

- build_golden_image.sh: baut eine schlanke Debian-bookworm-Basis per
  debootstrap (Kernel, breites linux-firmware, NetworkManager,
  openssh-server) - KEINE Desktop-Umgebung, die kommt wie jedes andere
  Merkmal per Ansible-Blueprint nach dem ersten Boot (ADR-0002). Keine
  SSH-Hostkeys/kein Root-Passwort im Ergebnis - reale Zugangsdaten
  entstehen erst durch den Provisioning Agent pro Geraet.
- scripts/lib/image_deploy.sh: Kernmechanik als wiederverwendbare
  Funktionsbibliothek (partitionieren, formatieren, mounten, Image
  entpacken, fstab aus echten UUIDs, chroot-Fixup fuer machine-id/SSH-
  Hostkeys/initramfs, Bootloader-Installation UEFI+BIOS).
- scripts/image_deploy_test.sh: isolierter Testtreiber fuer Phase 1,
  ruft dieselben Funktionen auf, die spaeter backends/mint-image/
  backend.sh (Phase 2) nutzen wird.

Golden Image real gebaut und verifiziert (enterprise/LMDE 6, debootstrap
bookworm): 302 MB, Kernel vorhanden, keine SSH-Hostkeys, machine-id leer.
Deployment-Mechanik noch nicht live getestet - naechster Schritt.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
2026-08-29 22:26:37 +02:00

84 lines
2.8 KiB
Bash
Executable File

#!/usr/bin/env bash
set -Eeuo pipefail
# Isolierter Testtreiber fuer scripts/lib/image_deploy.sh (Phase 1 des
# Golden-Image-Deployment-Plans, siehe ADR-0024) - direkt in einer
# frischen Live-Mint-Session ausgefuehrt, OHNE Umweg ueber Kiosk/
# Aktivierung/Kexec, um den Iterationszyklus kurz zu halten. Wird erst in
# Phase 2 durch backends/mint-image/backend.sh ersetzt/ergaenzt, das
# dieselben Bibliotheksfunktionen im echten Self-Service-Ablauf aufruft.
#
# WARNUNG: ueberschreibt den angegebenen Datentraeger vollstaendig. Nur
# auf einer Test-VM mit einer garantiert leeren/wegwerfbaren Platte
# ausfuehren.
usage() {
echo "Usage: sudo $0 <disk> <golden-image.tar.zst> [root_fs] [hostname]" >&2
echo " disk: z.B. /dev/vda oder /dev/sda - WIRD KOMPLETT ÜBERSCHRIEBEN" >&2
}
DISK="${1:-}"
IMAGE_PATH="${2:-}"
ROOT_FS="${3:-ext4}"
HOSTNAME_VALUE="${4:-tuxflotte-image-test}"
if [[ -z "${DISK}" || -z "${IMAGE_PATH}" ]]; then
usage
exit 1
fi
if [[ "${EUID}" -ne 0 ]]; then
echo "Fehler: muss als root laufen." >&2
exit 1
fi
[[ -b "${DISK}" ]] || { echo "Fehler: ${DISK} ist kein Blockgerät." >&2; exit 1; }
REPO_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")/.." && pwd)"
# shellcheck source=lib/image_deploy.sh
source "${REPO_DIR}/scripts/lib/image_deploy.sh"
TARGET="/target"
declare -a MOUNT_STACK=()
cleanup() {
image_deploy_unbind_mounts MOUNT_STACK
umount -R "${TARGET}" 2>/dev/null || true
}
trap cleanup EXIT
if [[ -d /sys/firmware/efi ]]; then
IS_EFI="true"
else
IS_EFI="false"
fi
image_deploy_log "Firmware-Modus: $([ "${IS_EFI}" = true ] && echo UEFI || echo BIOS)"
image_deploy_log "Schritt 1/8: Partitionieren von ${DISK}"
read -r BOOT_PART ROOT_PART <<<"$(image_deploy_partition "${DISK}" "${IS_EFI}")"
image_deploy_log " -> BOOT_PART='${BOOT_PART}' ROOT_PART='${ROOT_PART}'"
image_deploy_log "Schritt 2/8: Formatieren"
image_deploy_format "${BOOT_PART}" "${ROOT_PART}" "${ROOT_FS}"
image_deploy_log "Schritt 3/8: Mounten unter ${TARGET}"
image_deploy_mount "${TARGET}" "${BOOT_PART}" "${ROOT_PART}"
image_deploy_log "Schritt 4/8: Golden Image entpacken (${IMAGE_PATH})"
image_deploy_extract_image "${IMAGE_PATH}" "${TARGET}"
image_deploy_log "Schritt 5/8: fstab schreiben"
image_deploy_write_fstab "${TARGET}" "${BOOT_PART}" "${ROOT_PART}" "${ROOT_FS}"
image_deploy_log "Schritt 6/8: bind mounts + chroot-Fixup (machine-id/SSH-Hostkeys/initramfs)"
image_deploy_bind_mounts "${TARGET}" MOUNT_STACK
image_deploy_chroot_fixup "${TARGET}"
image_deploy_log "Schritt 7/8: Bootloader installieren"
image_deploy_install_bootloader "${TARGET}" "${DISK}" "${IS_EFI}"
image_deploy_log "Schritt 8/8: Hostname setzen (${HOSTNAME_VALUE})"
image_deploy_set_hostname "${TARGET}" "${HOSTNAME_VALUE}"
image_deploy_log "Fertig. Zum Test: VM neu starten und von ${DISK} booten."