#!/bin/bash # build-iso.sh — Ubuntu 24.04 Autoinstall ISO für Ventoy bauen # Funktioniert auf macOS (xorriso via brew) und Linux (xorriso via apt) # Ergebnis: ubuntu-macbook-autoinstall.iso (~3.2 GB) set -e UBUNTU_ISO_URL="https://releases.ubuntu.com/24.04/ubuntu-24.04.4-live-server-amd64.iso" UBUNTU_ISO="ubuntu-24.04.4-live-server-amd64.iso" OUTPUT_ISO="ubuntu-macbook-autoinstall.iso" SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)" RED='\033[0;31m'; GREEN='\033[0;32m'; YELLOW='\033[1;33m'; NC='\033[0m' ok() { echo -e "${GREEN}✓ $*${NC}"; } warn() { echo -e "${YELLOW}⚠ $*${NC}"; } err() { echo -e "${RED}✗ $*${NC}"; exit 1; } OS="$(uname -s)" echo "════════════════════════════════════════════" echo " macbook-setup ISO Builder ($OS)" echo "════════════════════════════════════════════" # ── Modell aus user-data erkennen ────────────────────────────────────────── HOSTNAME=$(grep 'hostname:' "$SCRIPT_DIR/user-data" | awk '{print $2}') # Modell aus Hostname ableiten: m13 → 13, m16 → 16 MODEL=$(echo "$HOSTNAME" | grep -o '[0-9]*') if [[ -z "$MODEL" || -z "$HOSTNAME" ]]; then err "Konnte Modell/Hostname nicht aus user-data ermitteln (hostname: m13 oder m16)" fi ok "Modell: MBP $MODEL\" (Hostname: $HOSTNAME)" # ── Abhängigkeiten ─────────────────────────────────────────────────────── echo -e "\n=== Abhängigkeiten prüfen ===" if [[ "$OS" == "Darwin" ]]; then if ! command -v xorriso &>/dev/null; then echo "xorriso nicht gefunden, installiere via Homebrew..." brew install xorriso fi ok "xorriso verfügbar (macOS)" else if ! command -v xorriso &>/dev/null; then sudo apt install -y xorriso fi ok "xorriso verfügbar (Linux)" fi # ── Ubuntu ISO herunterladen ───────────────────────────────────────────── if [[ ! -f "$UBUNTU_ISO" ]]; then echo -e "\n=== Ubuntu 24.04 ISO herunterladen ===" curl -L --progress-bar -o "$UBUNTU_ISO" "$UBUNTU_ISO_URL" ok "ISO heruntergeladen" else ok "ISO bereits vorhanden: $UBUNTU_ISO" fi # Prüfen ob es eine echte ISO ist if ! file "$UBUNTU_ISO" | grep -q "ISO 9660"; then rm -f "$UBUNTU_ISO" err "Download fehlgeschlagen (keine gültige ISO). Bitte erneut starten." fi # ── Autoinstall-Dateien vorbereiten ────────────────────────────────────── echo -e "\n=== Autoinstall-Dateien vorbereiten ===" TMPDIR=$(mktemp -d) # NoCloud-Verzeichnis (Fallback für cloud-init) mkdir -p "$TMPDIR/autoinstall" cp "$SCRIPT_DIR/user-data" "$TMPDIR/autoinstall/" cp "$SCRIPT_DIR/meta-data" "$TMPDIR/autoinstall/" # autoinstall.yaml im ISO-Root (direkter Subiquity-Weg, Ubuntu 24.04+) # Subiquity sucht im Root des Installationsmediums nach autoinstall.yaml # Datei 1:1 kopieren — #cloud-config ist ein YAML-Kommentar, autoinstall: Top-Level-Key wird unterstützt cp "$SCRIPT_DIR/user-data" "$TMPDIR/autoinstall.yaml" ok "user-data und autoinstall.yaml bereit" # ── WireGuard-Config einbetten ──────────────────────────────────────────── echo -e "\n=== WireGuard-Config ===" WG_CONF="" # Suche nach passender Config: wireguard/m16.conf, wireguard/m13.conf, etc. for candidate in "$SCRIPT_DIR/wireguard/${HOSTNAME}.conf" "$SCRIPT_DIR/wireguard/m${MODEL}.conf"; do if [[ -f "$candidate" ]]; then WG_CONF="$candidate" break fi done if [[ -n "$WG_CONF" ]]; then cp "$WG_CONF" "$TMPDIR/autoinstall/wg0.conf" ok "WireGuard-Config eingebettet: $(basename "$WG_CONF")" else warn "Keine WireGuard-Config gefunden in wireguard/ — übersprungen" warn "Erwartet: wireguard/${HOSTNAME}.conf oder wireguard/m${MODEL}.conf" fi # ── GRUB-Eintrag vorbereiten ──────────────────────────────────────────── echo -e "\n=== GRUB-Eintrag vorbereiten ===" # Originale grub.cfg extrahieren xorriso -osirrox on -indev "$UBUNTU_ISO" \ -extract /boot/grub/grub.cfg "$TMPDIR/grub.cfg" 2>/dev/null chmod u+w "$TMPDIR/grub.cfg" # Autoinstall-Eintrag voranstellen TMPGRUB=$(mktemp) cat > "$TMPGRUB" <<'GRUBEOF' set default=0 set timeout=10 menuentry "Ubuntu MacBook AutoInstall" { set gfxpayload=keep linux /casper/vmlinuz quiet autoinstall subiquity.autoinstallpath=/cdrom/autoinstall.yaml cloud-config-url=/dev/null ds=nocloud\;s=/cdrom/autoinstall/ --- initrd /casper/initrd } GRUBEOF cat "$TMPGRUB" "$TMPDIR/grub.cfg" > "$TMPDIR/grub-new.cfg" rm "$TMPGRUB" ok "GRUB konfiguriert (autoinstall als Standard)" # ── ISO modifizieren (Boot-Records bleiben erhalten) ───────────────────── echo -e "\n=== ISO bauen ===" cp "$UBUNTU_ISO" "$OUTPUT_ISO" xorriso -indev "$OUTPUT_ISO" \ -outdev "$OUTPUT_ISO" \ -map "$TMPDIR/autoinstall" /autoinstall \ -map "$TMPDIR/autoinstall.yaml" /autoinstall.yaml \ -map "$TMPDIR/grub-new.cfg" /boot/grub/grub.cfg \ -boot_image any replay \ -commit rm -rf "$TMPDIR" ok "ISO erstellt: $OUTPUT_ISO" echo "" echo "Größe: $(du -sh "$OUTPUT_ISO" | cut -f1)" echo "Modell: MBP $MODEL\" | Hostname: $HOSTNAME" [[ -n "$WG_CONF" ]] && echo "WireGuard: $(basename "$WG_CONF")" || echo "WireGuard: nicht eingebettet" echo "" warn "Nächster Schritt: ISO auf USB-Stick schreiben" if [[ "$OS" == "Darwin" ]]; then echo " diskutil unmountDisk /dev/diskX" echo " sudo dd if=$OUTPUT_ISO of=/dev/rdiskX bs=4m" else echo " sudo dd if=$OUTPUT_ISO of=/dev/sdX bs=4M status=progress" fi