#!/bin/bash # mint-zuse.sh -- a Zuse of the demo's own, as a stick (issue #111, ruled by Captain Bob, # 2026-11-06: "Mint Zuse for demo console"). # # demo/mint-zuse.sh # # A fresh pair, never anyone's real Zuse: whatever a visitor does as this Zuse stays in a # throwaway machine, and the drive's writes are discarded (qemu-args.sh). Minted the way # disk/zuse-scratch was (disk/README.md): a blank 1 GiB Artemis disk and a blank 64 MiB identity # drive, booted with system=v3 on amd64 -- "Zuse: genesis minted onto attached thumbdrive" -- # then booted again -- "Zuse: identity confirmed from attached thumbdrive" -- then laid out as a # StarshipOS stick (make zusestick), which is what the v4 demo machine attaches. # # gets artemis.img and zuse-thumb-ident.img (the pair) and zusestick.img (the stick). # Two QEMU boots, one at a time, in the foreground; their serial logs go to logs/ as any boot's. set -euo pipefail cd "$(dirname "$0")/.." out=$(realpath -m "${1:?usage: demo/mint-zuse.sh }") [ ! -e "$out/zuse-thumb-ident.img" ] || { echo "demo: $out already has a pair -- refusing to mint over it" >&2; exit 1; } mkdir -p "$out" truncate -s 1G "$out/artemis.img" truncate -s 64M "$out/zuse-thumb-ident.img" boot() { # boot : one system=v3 boot with the pair attached local want=$1 bad=$2 mk log qmp t0 mk=$(mktemp) make --no-print-directory -f kernel/Makefile ARCH=amd64 clean qemu QEMU_DISPLAY=none \ KERNEL_ARGS=system=v3 ARTDISK="$out/artemis.img" ZUSEDISK="$out/zuse-thumb-ident.img" > "$mk" 2>&1 & local pid=$! t0=$(date +%s) until log=$(sed -n 's/^ Serial log: //p' "$mk") && [ -n "$log" ] && grep -aq -- "$want" "$log" 2>/dev/null; do if [ -n "${log:-}" ] && grep -aq -- "$bad" "$log" 2>/dev/null; then echo "demo: '$bad'" >&2; kill $pid; exit 1; fi kill -0 $pid 2>/dev/null || { echo "demo: the boot ended without '$want'" >&2; tail -20 "$mk" >&2; exit 1; } [ $(( $(date +%s) - t0 )) -lt 900 ] || { echo "demo: no '$want' in 900s" >&2; kill $pid; exit 1; } sleep 2 done echo "demo: $want ($log, $(( $(date +%s) - t0 ))s)" qmp=$(sed -n 's/^ QMP socket: //p' "$mk") python3 - "$qmp" <<'PY' import json, socket, sys s = socket.socket(socket.AF_UNIX); s.connect(sys.argv[1]); f = s.makefile("rw") f.readline() for c in ({"execute": "qmp_capabilities"}, {"execute": "quit"}): f.write(json.dumps(c) + "\n"); f.flush(); f.readline() PY wait $pid || true rm -f "$mk" } boot "Zuse: genesis minted onto attached thumbdrive" "fence marker write FAILED" boot "Zuse: identity confirmed from attached thumbdrive" "not recognized" make --no-print-directory -f kernel/Makefile ARCH=amd64 zusestick ZUSE_PAIR="$out" cp build/amd64/kernel/zusestick.img "$out/zusestick.img" git checkout -q -- capsules/BLOCK_MAP.md v3/include/version.h 2>/dev/null || true # the build regenerates these echo "demo: Zuse minted -- $out/zusestick.img"