Captain Bob, 2026-11-06: a terminal with QEMU amd64 for people to play with; "Mint Zuse for demo console" (#111); "Make the most recent of builds that's green the demo"; a Try-it XWiki page with the console embedded. demo/ -- see its README: mint-zuse.sh a Zuse of the demo's own, as a stick: blank pair, system=v3 genesis, a second boot to confirm, make zusestick. Never anyone's real Zuse build-iso.sh the amd64 ISO, packed as make qemu packs it make-snapshot.sh boot once to [zuse@Hera] ok>, save the machine start-session.sh one visitor: the saved machine resumed, ended on hang-up, close or time-out console.py joins the visitor's terminal only once the machine runs; keys typed while it loads are discarded qemu-args.sh the machine, shared by save and resume starshipos-demo.service, apache-demo.conf, xwiki-try-it.xwiki Every session is a copy: no network, read-only image, the Zuse stick's writes discarded, QEMU's seccomp sandbox, an unprivileged user, a fenced systemd unit, 30 minutes at most. Tested here, from the sources master accepted (run 153): the Zuse minted (logs/20261106-192626, -192739); the saved machine at POST 538/538 and [zuse@Hera] ok>; a session through ttyd's websocket ready in 0.2 s, 3 4 + . -> 7 ok, 7 SQUARE . -> 49 ok; QEMU gone at once on hang-up, close and time-out. Found and fixed on the way: a machine saved stopped resumes stopped; a prompt matched as a regex; QEMU left behind by a hang-up; keys lost while the machine loads. Not tested here: Apache, several sessions at once (#116). Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01GE3SDvQn5EoxdGufk84zz2
56 lines
2.9 KiB
Bash
Executable File
56 lines
2.9 KiB
Bash
Executable File
#!/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 <out-dir>
|
|
#
|
|
# 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.
|
|
#
|
|
# <out-dir> 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 <out-dir>}")
|
|
[ ! -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 <what to wait for> <what means it failed>: 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"
|