Skip to content

Firmware and lab

Source: edge/firmware. All images carry the same files, staged by scripts/stage-files.sh: agent + ea link, procd service and its rc.d link, sysupgrade keep list (/etc/jumo/identity.json), fleet enroll code, control plane URL. Packages: kmod-wireguard wireguard-tools kmod-vxlan vxlan miniupnpc (+ iperf3 tcpdump-mini in dev). No LuCI.

Building

Script For How long
scripts/build-images.sh dev\|test --enroll-code CODE All test devices (x86, Cudy TR1200, Yuncore AX835) → build/images/<env>/ with SHA256SUMS and FLASHING.md ~6 min
scripts/build-jumo-image.sh --target T --profile P --goarch A ... One device, official ImageBuilder in Docker (x86_64; Rosetta on a Mac, native in CI) ~2.5 min
scripts/repack-vm-image.sh --enroll-code CODE arm64 VM image, repacks the official squashfs natively ~4 s

--control-plane defaults to the Mac on the LAN for dev; use https://dev.api.jumorouter.com for routers away from the bench.

Local Docker note: if pulls hang, the macOS keychain credential helper is waiting; pull with a config that has "credsStore": "".

Flashing

  • First flash: see FLASHING.md next to the images (Cudy needs its intermediate firmware; x86 is written to disk; check the Yuncore board name).
  • Reflash a router already on OpenWrt: scripts/flash.sh <ip> <image>. It streams the image over SSH, lets the router's board check validate it, then flashes without keeping settings. Never force (-F).

Lab on a Mac

scripts/lab.sh start [vm...] boots five OpenWrt arm64 VMs (QEMU + HVF):

VM Role SSH
inet Fake internet (45.90.10.0/24, 45.90.20.0/24, 2001:db8::/32), NAT to the real one 2225
isp-home ISP box: NAT44, IPv6 firewall, miniupnpd (UPnP IGD v2, NAT-PMP/PCP) 2226
home Jumo home router behind isp-home 2222
travel Jumo travel router on the "hotel" uplink 2223
laptop On travel's LAN port 2224

Configure with scripts/lab/inet.sh, isp-home.sh, isp-home-upnp.sh, travel.sh (piped over scripts/vm-ssh.sh <port> 'sh -s'), then pair home and travel in the admin. Results: WireGuard PoC. No sudo is needed; deny the macOS firewall prompt for QEMU (localhost only).