Two ARM boards, one KVM, and a watchdog that failed

Claim. The KVM tooling was used to bring up two ODROID-M1S boards (RK3566, 8 GB, eMMC) with a rescue card, and it caught a failure that no network check could have named: on this board the hardware watchdog reset leaves the board dark until its power is cycled by hand.

Method. One Comet on one board at a time, HDMI plus USB keyboard. Each board got Armbian on its eMMC and a rescue card in the SD slot that hands over to the eMMC system when it is complete. A self-test script reboots the board, removes the kernel or the device tree on purpose, and checks that the rescue system comes up and repairs it. The watchdog experiment crashed the kernel with kernel.panic=0, so that only the hardware watchdog could reset it, and recorded the screen.

Sample size. Two boards (orderly, matron), one experiment on each, one Comet recording (matron).

Result.

TestOutcomeRecord
Plain reboot hands over to the eMMC systempassed, back in 28 sselftest-orderly-full.txt
One-shot flag boots the rescue systempassed, rescue up at 35 sselftest-orderly-full.txt
Device tree moved asiderescue system came up at 35 s and restored the file (115510 bytes)selftest-orderly-full.txt
Kernel moved asiderescue system came up at 36 s and restored the kernel (35916288 bytes)selftest-orderly-full.txt
Kernel panic with kernel.panic=10board back after 54 s, panic text received on haywireselftest-orderly-full.txt
Kernel hang with kernel.panic=0, hardware watchdog (44 s timeout) armedno picture from 56 s into the recording to its end at 199.7 s: 8 frames with a picture, then 19 refused snapshotsmatron-watchdog-audit.jsonl, matron-watchdog-transcript.txt

The screen text shows the system started the watchdog with the 44 s timeout before the crash; the transcript has the frame. When the panic path resets the board, it boots. When the watchdog resets it, the recording shows a dark screen that does not recover. The watchdog is switched off in the baseline.

What the tooling changed. A timeout on the network side looks the same in every case: a stale name, a changed host key, an operating system with its network down, a dark board and a panic all read as "no answer". The diagnose command reads the video signal, whether the target still sees the KVM's keyboard, and the screen text together with ping, TCP and one ssh attempt, then names the cause and the next step. Run on matron while it was still dark, it answered "dark", with no signal and no keyboard seen as its evidence (diagnose-matron-dark.txt). The rules are tested against the scenarios on this page.

A recording mistake, fixed. The audit log of a session kept the text typed on the board's console, including a login password, because typed text was logged verbatim. Typed text is now redacted by default when the screen shows a password prompt or cannot be read, and audit-scan finds any that was kept. The scan of the matron recording above found none.

Limits.

Original record: read the Markdown source.