#!/usr/bin/env bash set -Eeuo pipefail # Baut das Golden Image aus einer bereits fertig installierten # Referenz-VM (siehe ADR-0024-Nachtrag "Referenz-VM statt debootstrap") - # laeuft DIREKT AUF der Referenz-VM (als root), anders als # build_golden_image.sh, das auf einem separaten Build-Host ein # Basissystem von Grund auf neu baut. Bereinigt zuerst alle maschinen-/ # betriebsspezifischen Spuren, packt danach den verbleibenden Dateibaum # in genau dem Format, das image_deploy_extract_image() # (scripts/lib/image_deploy.sh, Phase 1) erwartet - tar/zstd, keine # Blockgeraete-Kopie. # # WICHTIG: entfernt als Teil der Bereinigung auch den bisherigen # Betriebs-/Testzugang zu dieser Maschine (Testkonto, SSH-Autorisierung, # Root-Passwort) - das ist beabsichtigt (jede damit ausgerollte # Kundeninstallation wuerde sonst dieselben, bekannten Zugangsdaten # tragen), nicht versehentlich. Das Ergebnis-Archiv muss ueber dieselbe, # bereits authentifizierte Verbindung abgeholt werden, mit der dieses # Skript gestartet wurde (z.B. per SSH-ControlMaster) - eine NEUE # Verbindung nach dem Lauf funktioniert nicht mehr. Ein Proxmox-Snapshot # von VOR diesem Lauf ist die vorgesehene Rueckfallebene fuer kuenftige # Wartung/Versions-Upgrades der Referenz-VM (siehe Plan). OUTPUT_FILE="${1:-/root/golden-image.tar.zst}" if [[ "${EUID}" -ne 0 ]]; then echo "Fehler: muss als root laufen." >&2 exit 1 fi echo "==> Entferne Betriebs-/Testzugang (nicht Teil des Kundenimages)" if id tuxflotte >/dev/null 2>&1; then userdel -r tuxflotte 2>/dev/null || userdel tuxflotte 2>/dev/null || true fi mkdir -p /root/.ssh : > /root/.ssh/authorized_keys passwd -l root >/dev/null echo "==> Entferne maschinenspezifische Identität" rm -f /etc/ssh/ssh_host_* : > /etc/machine-id # Manche Distributionen legen /var/lib/dbus/machine-id als echte Kopie an # statt als Symlink auf /etc/machine-id (siehe ADR-0024-Fund, 29.08.2026) - # beide Fälle abdecken, ein Symlink zeigt ohnehin automatisch auf die # gerade geleerte Datei. if [[ -e /var/lib/dbus/machine-id && ! -L /var/lib/dbus/machine-id ]]; then : > /var/lib/dbus/machine-id fi echo "==> Entferne Netzwerk-Zugangsdaten der Referenz-VM" rm -f /etc/NetworkManager/system-connections/* echo "==> Bereinige Caches/Logs/temporäre Dateien" apt-get clean rm -rf /var/lib/apt/lists/* find /var/log -type f -exec truncate -s0 {} \; rm -rf /tmp/* /var/tmp/* rm -f /root/.bash_history rm -f /home/*/.bash_history 2>/dev/null || true # Paketauswahl eindampfen (Browser, Office-Pakete o.Ä.) bewusst NICHT im # ersten Lauf - siehe Plan ("erster Durchlauf zeigt, wie groß das Archiv # real wird, dann gezielt nachschärfen"). Blindes Purgen ohne die # tatsächliche Paketliste gesehen zu haben, riskiert eher kaputte # Abhängigkeiten als sinnvolle Einsparung. Nach diesem Lauf: # `dpkg-query -Wf '${Installed-Size}\t${Package}\n' | sort -rn | head -30` # auf der Referenz-VM zeigt die groessten Kandidaten fuer einen gezielten # zweiten Durchlauf. echo "==> Packe nach ${OUTPUT_FILE}" # WICHTIG: tar -C / erzeugt relative Elementnamen (./proc/..., ./sys/...), # nicht absolute (/proc/...) - ein --exclude mit fuehrendem Slash matcht # dagegen NICHT (live am 31.08.2026 entdeckt: das lief zunaechst # unbemerkt gegen die echte Referenz-VM und haette u.a. /proc/kcore mit # eingepackt). Ausschluesse deshalb ohne fuehrenden Slash angeben. tar --numeric-owner --xattrs \ --exclude=proc --exclude=sys --exclude=dev \ --exclude=run --exclude=tmp --exclude=var/tmp \ --exclude="${OUTPUT_FILE#/}" \ -C / -cf - . | zstd -f -T0 -19 -o "${OUTPUT_FILE}" echo "==> Fertig: ${OUTPUT_FILE} ($(du -h "${OUTPUT_FILE}" | cut -f1))" echo "==> Root-Zugang zu dieser Maschine ist jetzt gesperrt (Testkonto entfernt, SSH-Autorisierung geleert, Root-Passwort gesperrt) - Proxmox-Snapshot ist die Rueckfallebene fuer kuenftige Laeufe."