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>
84 lines
2.8 KiB
Bash
Executable File
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."
|