#!/bin/bash # Phase 4a: Debian arm64 Kernel beschaffen (bookworm, cloud-Variante bevorzugt), # RootFS aufbereiten, ext4-Image bauen, ggf. Mini-Initramfs erstellen. set -euo pipefail WORK="${WORK:-/build/work}" LOGS="${LOGS:-/build/logs}" export WORK mkdir -p "$WORK/deb-kernel" "$LOGS" echo "== 1) Debian Packages-Index (bookworm arm64) ==" if [ ! -f "$WORK/Packages" ]; then wget -q -O "$WORK/Packages.xz" \ https://deb.debian.org/debian/dists/bookworm/main/binary-arm64/Packages.xz xz -dk "$WORK/Packages.xz" fi echo "== 2) Kernel- und busybox-Pakete suchen ==" python3 - "$WORK/Packages" <<'PYEOF' > "$WORK/pkg_urls.txt" import sys, re stanzas = open(sys.argv[1]).read().split('\n\n') best_k = best_b = None for st in stanzas: pkg = re.search(r'^Package: (.+)$', st, re.M) ver = re.search(r'^Version: (.+)$', st, re.M) fn = re.search(r'^Filename: (.+)$', st, re.M) if not (pkg and ver and fn): continue name = pkg.group(1) # versionierte Kernel-Images (echte Binaries, keine Metapakete) if re.match(r'^linux-image-[\d.]+-\d+-cloud-arm64$', name) or \ re.match(r'^linux-image-[\d.]+-\d+-arm64$', name): key = (0 if 'cloud' in name else 1, ver.group(1)) if best_k is None or key > best_k[0]: best_k = (key, fn.group(1)) if name == 'busybox-static': if best_b is None or ver.group(1) > best_b[0]: best_b = (ver.group(1), fn.group(1)) if best_k: print(best_k[1]) if best_b: print(best_b[1]) PYEOF cat "$WORK/pkg_urls.txt" echo "== 3) Download + Entpacken ==" i=0 while read -r rel; do url="https://deb.debian.org/debian/$rel" case "$rel" in *busybox*) tgt="$WORK/busybox-static.deb" ;; *) tgt="$WORK/kernel.deb" ;; esac echo "lade $url" if [ ! -f "$tgt" ]; then wget -q -O "$tgt" "$url" fi dpkg-deb -x "$tgt" "$WORK/deb-kernel" done < "$WORK/pkg_urls.txt" KVER=$(ls "$WORK/deb-kernel/lib/modules" 2>/dev/null | head -1) echo "Kernel-Version: $KVER" echo "== 3b) depmod (die .deb enthaelt keine Module-Dep-Dateien) ==" depmod -b "$WORK/deb-kernel" "$KVER" 2>/dev/null || depmod -e -b "$WORK/deb-kernel" "$KVER" ls "$WORK/deb-kernel/lib/modules/$KVER/" | head echo "== 4) Kernel-Config-Pruefung ==" CFG=$(ls "$WORK/deb-kernel/boot/config-$KVER" 2>/dev/null | head -1) grep -E '^CONFIG_(EXT4_FS|VIRTIO_BLK|VIRTIO_PCI|VIRTIO_NET|SQUASHFS|SERIAL_AMBA_PL011|SERIAL_AMBA_PL011_CONSOLE)=' \ "$CFG" | tee "$LOGS/kernel-config.txt" INITRAMFS_NEEDED=0 for opt in EXT4_FS VIRTIO_BLK VIRTIO_PCI SERIAL_AMBA_PL011; do if ! grep -q "^CONFIG_${opt}=y" "$CFG"; then echo "WARNUNG: CONFIG_${opt} ist nicht =y -> Initramfs noetig" INITRAMFS_NEEDED=1 fi done echo "INITRAMFS_NEEDED=$INITRAMFS_NEEDED" if [ "$INITRAMFS_NEEDED" = "1" ]; then echo "== 4b) Mini-Initramfs ==" IR="$WORK/initramfs" rm -rf "$IR" mkdir -p "$IR/bin" "$IR/lib/modules" "$IR/proc" "$IR/sys" "$IR/dev" "$IR/newroot" BB="$WORK/deb-kernel/bin/busybox" [ -f "$BB" ] || BB=$(find "$WORK/deb-kernel" -name busybox -type f | head -1) cp "$BB" "$IR/bin/busybox" cp -r "$WORK/deb-kernel/lib/modules/$KVER" "$IR/lib/modules/" cat > "$IR/init" <<'INITEOF' #!/bin/busybox sh /bin/busybox --install -s /bin mount -t proc proc /proc mount -t sysfs sysfs /sys mount -t devtmpfs devtmpfs /dev modprobe virtio_pci modprobe virtio_blk modprobe virtio_net modprobe crc32c modprobe ext4 echo "initramfs: warte auf /dev/vda..." i=0 while [ ! -b /dev/vda ] && [ $i -lt 100 ]; do sleep 0.2; i=$((i+1)); done mount -o rw /dev/vda /newroot || exec sh exec switch_root /newroot /sbin/init INITEOF chmod +x "$IR/init" (cd "$IR" && find . | cpio -o -H newc --quiet | gzip > "$WORK/initramfs.img") echo "initramfs.img: $(du -sh "$WORK/initramfs.img" | cut -f1)" fi echo "== 5) RootFS aufbereiten (Autologin + offenes Root-PW) ==" R="$WORK/rootfs-generic" rm -rf "$R" cp -a "$WORK/rootfs" "$R" # root ohne Passwort (Puffer, falls Autologin-Override nicht greift) sed -i 's|^root:\*|root::|' "$R/etc/shadow" # Direkte Root-Shell auf ttyAMA0 (OSDx-PAM lehnt leere PW/Autologin ab) mkdir -p "$R/etc/systemd/system/serial-getty@ttyAMA0.service.d" cat > "$R/etc/systemd/system/serial-getty@ttyAMA0.service.d/autologin.conf" <<'OEOF' [Service] Type= ExecStart= ExecStart=-/bin/bash -l -i StandardInput=tty StandardOutput=tty StandardError=tty TTYPath=/dev/ttyAMA0 TTYReset=yes OEOF # Emulations-Stabilisierung: # 1) vyos-cfgd: Watchdog + StartLimitAction=reboot-force entschraerfen mkdir -p "$R/etc/systemd/system/vyos-cfgd.service.d" cat > "$R/etc/systemd/system/vyos-cfgd.service.d/emulation.conf" <<'OEOF' [Service] WatchdogSec=0 TimeoutSec=0 StartLimitBurst=0 OEOF # 2) QCA-WLAN-Monitor (braucht echte Hardware): maskieren ln -sf /dev/null "$R/etc/systemd/system/qca-osdx-mon.service" # 2b) modulelauncher Timeout entschraerfen mkdir -p "$R/etc/systemd/system/osdx-modulelauncher.service.d" printf '[Service]\nTimeoutSec=0\n' > "$R/etc/systemd/system/osdx-modulelauncher.service.d/emulation.conf" # 3) globale Reboot-Sperre (osdx-load-config ruft bei Config-Fehlern reboot auf) ln -sf /dev/null "$R/etc/systemd/system/systemd-reboot.service" # 4) Debian-Kernel-Module ins RootFS (sonst kein bridge/netzwerk im VM-Kernel) cp -r "$WORK/deb-kernel/lib/modules/$KVER" "$R/lib/modules/" # 5) Netz-Bringup fuer QEMU user-net (falls OSDx-Br0-Konfig scheitert) cat > "$R/etc/systemd/system/qemu-net.service" <<'OEOF' [Unit] Description=QEMU user-net bringup (emulation) After=multi-user.target Wants=network.target [Service] Type=oneshot ExecStart=/bin/sh -c 'ip link set eth0 up; IF=br0; ip link show $IF >/dev/null 2>&1 || IF=eth0; ip addr replace 10.0.2.15/24 dev $IF; ip route replace default via 10.0.2.2 2>/dev/null || true; ip link show br0 >/dev/null 2>&1 && ip link set br0 up' RemainAfterExit=yes [Install] WantedBy=multi-user.target OEOF ln -sf /etc/systemd/system/qemu-net.service \ "$R/etc/systemd/system/multi-user.target.wants/qemu-net.service" # Webinterface-GUI-Unit aktivieren ln -sf /lib/systemd/system/bevyosgui.service \ "$R/etc/systemd/system/multi-user.target.wants/bevyosgui.service" echo "== 6) ext4-Image bauen ==" rm -f "$WORK/rootfs.ext4" mkfs.ext4 -F -d "$R" -L bintecroot "$WORK/rootfs.ext4" 1500M ls -la "$WORK/" | grep -E 'ext4|initramfs|vmlinuz|Image' echo "== build-generic fertig =="