#!/bin/sh # C2 — test-driver-manager-initfs.sh # # Boot a QEMU virtio-blkd-only redbear-mini with driver-manager as the initfs # spawner. Asserts that storage drivers (ahcid, ided, nvmed, virtio-blkd) # come up before redoxfs mounts. # # Usage: # ./local/scripts/test-driver-manager-initfs.sh [--build-dir PATH] # # Environment variables: # BUILD_DIR: path to build output (default: build/x86_64/redbear-mini) # TIMEOUT: QEMU boot timeout in seconds (default: 240) set -eu REPO_ROOT="$(cd "$(dirname "$0")/../.." && pwd)" BUILD_DIR="${BUILD_DIR:-$REPO_ROOT/build/x86_64/redbear-mini}" TIMEOUT="${TIMEOUT:-240}" QEMU="${QEMU:-qemu-system-x86_64}" EXPECT_PY="$REPO_ROOT/local/scripts/qemu-login-expect.py" if ! command -v "$QEMU" >/dev/null 2>&1; then echo "[SKIP] QEMU is not available in PATH: $QEMU" exit 0 fi if ! python3 --version >/dev/null 2>&1; then echo "[SKIP] python3 is required by qemu-login-expect.py" exit 0 fi if [ ! -f "$BUILD_DIR/live.iso" ]; then echo "[FAIL] no live.iso at $BUILD_DIR — run ./local/scripts/build-redbear.sh redbear-mini first" exit 1 fi LOG_FILE="$(mktemp /tmp/rb-dm-initfs-XXXXXX.log)" trap 'rm -f "$LOG_FILE"' EXIT echo "[BOOT] launching QEMU on $BUILD_DIR/live.iso (initfs driver-manager storage path)" QEMU_CMD="$QEMU -cdrom $BUILD_DIR/live.iso -m 1024 -nographic -serial mon:stdio \ -netdev user,id=n0 -device e1000,netdev=n0 \ -drive file=/tmp/rb-initfs.qcow2,if=virtio,format=qcow2 \ -boot once=d" python3 "$EXPECT_PY" \ --timeout "$TIMEOUT" \ --log "$LOG_FILE" \ --step "expect:driver-manager-initfs:" \ --step "expect:bound 0000:00:1f.2 -> ahcid" \ --step "expect:bound 0000:00:1e.0 -> ided" \ --step "expect:bound 0000:00:1f.3 -> nvmed" \ --step "expect:bound 0000:00:04.0 -> virtio-blkd" \ --step "expect:redoxfs: mount" \ --pass_marker "BOOT_TIMELINE" \ --fail_marker "[missing_match" \ --fail_marker "kernel panic" \ -- $QEMU_CMD RC=$? if [ "$RC" -eq 0 ]; then echo "[ PASS ] C2 initfs storage-driver check completed" else echo "[ FAIL ] C2 initfs storage-driver check failed (rc=$RC); see $LOG_FILE" fi exit $RC