176 lines
6.3 KiB
Bash
Executable File
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 =="
|