Bintec W20XXax-Firmware in QEMU (Docker): Extraktion, generischer Kernel-Boot, Doku
This commit is contained in:
Executable
+175
@@ -0,0 +1,175 @@
|
||||
#!/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 =="
|
||||
Reference in New Issue
Block a user