|
| 1 | +#!/usr/bin/env bash |
| 2 | +# M9.R.42 — install driver running the M9.R.42 ISO. |
| 3 | +# |
| 4 | +# Boots the M9.R.42 ISO under QEMU OVMF; autorun service drives the |
| 5 | +# installer through Phase 2 (disk apply); REPRO_DISK_DIAG= |
| 6 | +# /tmp/installer.disk-diag.log lands in the diag-persist tarball |
| 7 | +# because the M9.R.42.1 stage-de-rootfs.sh change included it in the |
| 8 | +# tar list. |
| 9 | +# |
| 10 | +# Outputs: |
| 11 | +# /tmp/m9r42_install.qcow2 — installed disk image |
| 12 | +# /tmp/m9r42_install.log — serial transcript |
| 13 | +# /tmp/m9r42_diag/ — extracted launcher diag tarball |
| 14 | +# installer.disk-diag.log — M9.R.42.1 kernel-state snapshots |
| 15 | +# AROUND each sgdisk + partprobe |
| 16 | +set -uo pipefail |
| 17 | +ISO="${ISO:-/opt/repro/reprobuild/recipes/reproos-iso/build/reproos.iso}" |
| 18 | +DISK="${DISK:-/tmp/m9r42_install.qcow2}" |
| 19 | +DIAG_DISK="${DIAG_DISK:-/tmp/m9r42_diag.qcow2}" |
| 20 | +INSTALL_LOG="${INSTALL_LOG:-/tmp/m9r42_install.log}" |
| 21 | +INSTALL_TIMEOUT="${INSTALL_TIMEOUT:-900}" |
| 22 | +DIAG_OUT="${DIAG_OUT:-/tmp/m9r42_diag}" |
| 23 | + |
| 24 | +[ -f "$ISO" ] || { echo "ISO $ISO does not exist" >&2; exit 2; } |
| 25 | + |
| 26 | +OVMF_FW="$(find /nix/store -maxdepth 5 -path '*OVMF*/FV/OVMF_CODE.fd' 2>/dev/null | head -1)" |
| 27 | +[ -n "$OVMF_FW" ] || { echo "No OVMF firmware in /nix/store" >&2; exit 2; } |
| 28 | +OVMF_DIR="$(dirname "$OVMF_FW")" |
| 29 | +OVMF_CODE="$OVMF_DIR/OVMF_CODE.fd" |
| 30 | + |
| 31 | +INSTALL_VARS=/tmp/m9r42_install_ovmf_vars.fd |
| 32 | +cp "$OVMF_DIR/OVMF_VARS.fd" "$INSTALL_VARS" |
| 33 | +chmod u+w "$INSTALL_VARS" |
| 34 | + |
| 35 | +date |
| 36 | + |
| 37 | +rm -f "$DISK" "$DIAG_DISK" |
| 38 | +nix-shell -p qemu --run "qemu-img create -f qcow2 $DISK 32G" >/dev/null |
| 39 | +truncate -s 64M "$DIAG_DISK" |
| 40 | + |
| 41 | +ISO_GRUB_HAS_AUTORUN="$(strings "$ISO" 2>/dev/null | grep -c 'repro.installer.autorun=1' || true)" |
| 42 | +if [ "${ISO_GRUB_HAS_AUTORUN:-0}" -lt 1 ]; then |
| 43 | + echo "[m9r42-install] WARNING: '$ISO' does NOT carry repro.installer.autorun=1" |
| 44 | +fi |
| 45 | + |
| 46 | +echo "=== M9.R.42 instrumented install (timeout ${INSTALL_TIMEOUT}s) ===" | tee "$INSTALL_LOG" |
| 47 | +nix-shell -p qemu OVMF --run " |
| 48 | + tail -f /dev/null | qemu-system-x86_64 -machine q35 -m 4096 -smp 4 \ |
| 49 | + -drive if=pflash,format=raw,readonly=on,file=$OVMF_CODE \ |
| 50 | + -drive if=pflash,format=raw,file=$INSTALL_VARS \ |
| 51 | + -cdrom $ISO \ |
| 52 | + -drive file=$DISK,if=virtio,format=qcow2 \ |
| 53 | + -drive file=$DIAG_DISK,if=virtio,format=raw \ |
| 54 | + -nographic -serial mon:stdio -display none |
| 55 | +" >> "$INSTALL_LOG" 2>&1 & |
| 56 | +QPID=$! |
| 57 | + |
| 58 | +T=0 |
| 59 | +while kill -0 $QPID 2>/dev/null && [ $T -lt $INSTALL_TIMEOUT ]; do |
| 60 | + sleep 10 |
| 61 | + T=$((T+10)) |
| 62 | +done |
| 63 | +if kill -0 $QPID 2>/dev/null; then |
| 64 | + echo "[m9r42-install] ${INSTALL_TIMEOUT}s timeout, killing QEMU" | tee -a "$INSTALL_LOG" |
| 65 | + kill -9 $QPID 2>/dev/null |
| 66 | +fi |
| 67 | +wait $QPID 2>/dev/null |
| 68 | + |
| 69 | +echo "" |
| 70 | +echo "=== M9.R.42 install log (last 200 lines, ANSI stripped) ===" |
| 71 | +sed 's/\x1B\[[0-9;]*[mK]//g' "$INSTALL_LOG" | tail -200 |
| 72 | + |
| 73 | +echo "" |
| 74 | +echo "=== M9.R.42 post-mortem diag extraction ===" |
| 75 | +rm -rf "$DIAG_OUT" |
| 76 | +mkdir -p "$DIAG_OUT" |
| 77 | +HEADER="$(dd if="$DIAG_DISK" bs=512 count=1 status=none 2>/dev/null | tr -d '\0' | head -1)" |
| 78 | +echo "diag-header=$HEADER" |
| 79 | +DIAG_SIZE="$(echo "$HEADER" | sed -nE 's/^M9R39DIAGv1 SIZE=([0-9]+).*$/\1/p')" |
| 80 | +if [ -z "$DIAG_SIZE" ] || [ "$DIAG_SIZE" = "0" ]; then |
| 81 | + echo "[m9r42-install] no M9R39DIAGv1 header on /dev/vdb; launcher diag-persist did not fire" |
| 82 | + date |
| 83 | + exit 0 |
| 84 | +fi |
| 85 | +dd if="$DIAG_DISK" bs=512 skip=1 count=$(( (DIAG_SIZE + 511) / 512 )) \ |
| 86 | + status=none 2>/dev/null \ |
| 87 | + | head -c "$DIAG_SIZE" \ |
| 88 | + > "$DIAG_OUT/installer.diag.tar.gz" |
| 89 | +tar -xzf "$DIAG_OUT/installer.diag.tar.gz" -C "$DIAG_OUT" 2>&1 |
| 90 | + |
| 91 | +echo "" |
| 92 | +echo "=== installer.rc ===" |
| 93 | +cat "$DIAG_OUT/installer.rc" 2>&1 || echo MISSING |
| 94 | +echo "" |
| 95 | +echo "=== installer.log (last 80) ===" |
| 96 | +tail -80 "$DIAG_OUT/installer.log" 2>&1 |
| 97 | +echo "" |
| 98 | +echo "=== installer.disk-diag.log (M9.R.42.1 kernel-state snapshots) ===" |
| 99 | +if [ -f "$DIAG_OUT/installer.disk-diag.log" ]; then |
| 100 | + cat "$DIAG_OUT/installer.disk-diag.log" |
| 101 | +else |
| 102 | + echo "MISSING — REPRO_DISK_DIAG didn't reach the apply driver" |
| 103 | +fi |
| 104 | +echo "" |
| 105 | +date |
0 commit comments