Files
bintec-w2044ax-firmware-qemu/build-generic.sh
T

176 lines
6.3 KiB
Bash
Executable File

#!/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 =="