Stage-2 init started only warden-flared and warden-modbus from the payload, so every daemon-backed screen (Automation, MikroTik, Mining, RS485, Starlink, Services) sat in its "not running" state on the rig while the bench panel showed the daemons up with nothing attached. It now starts every warden-* daemon it finds in the panel's own S-number order (ai, automation, modbus, mikrotik, asic, starlink, stratum, flared), each with no arguments as start-stop-daemon runs them on the panel. flare-edge tools/rig-pull-daemons.sh copies a panel's static binaries in. Doing that exposed a latent alias: init pointed warden-modbus's /dev/ttyS4 at /dev/ttyS0 whenever ttyS0 existed, and with --ctl that port IS the control channel, so Modbus polls arrived inside the wake reply and the bridge hung. run.sh now always attaches an RS485 pci-serial (a null chardev without --rs485), and init aliases ttyS4 to ttyS1 when warden.ctl is on the cmdline, ttyS0 otherwise. Verified on a boot with all eight daemons: status json reports automation.engine, mikrotik.backend, mining.available and rs485.available true with the Modbus scan sweeping the empty UART; six daemon-backed pages matched screenshots of the bench panel structurally (0/256 cells differ). Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_013aHKWzT5EF86RFKRMtAv9n
1.4 KiB
Guest Payloads
Drop static musl armv7 binaries in this directory (contents are
gitignored; binaries are never committed); qemu/mkimage.sh copies everything
in this directory (except this README) into /usr/bin/ of both rootfs slots.
Static musl is the same target the device uses for its Rust daemons, so the
exact production binaries run unmodified in the VM.
Typical payload, built in a flare-edge checkout:
# flared (static musl armv7)
tools/build-flared.sh --local
# warden-modbus and friends: see tools/build-firmware.sh for the recipes
Then:
cp <flare-edge>/target/armv7-unknown-linux-musleabihf/release/warden-flared qemu/payload/
Or take them from a panel that already runs them: every daemon is a static
musl binary, so flare-edge tools/rig-pull-daemons.sh --host <panel> copies
/usr/bin/warden-* straight into this directory (recording the panel's
release and each md5 in PULLED.txt), minus warden-ui, which the rig
needs as the fbdev+evdev build.
Stage-2 init starts every warden-* daemon it finds here, in the panel's
own S-number order (ai, automation, modbus, mikrotik, asic, starlink,
stratum, flared), then warden-ui (the UI also needs --display on|headless + the virt.fragment kernel for /dev/fb0). Logs land in
/tmp/<name>.log inside the guest, readable over the control bridge with
ctl @cat /tmp/<name>.log. An empty payload is valid: the image boots
busybox-only.