CHR with QEMU Tests using GitHub CI
mikropkl which builds the UTM images now has a GitHub Action "workflow" that tests via QEMU path. I turned this support into a "standard feature" of the UTM images. QEMU test use options, largely, same as UTM image uses (and QEMU setting can, for the most part, be added to UTM, if needed). Both do use same package, since the "UTM Packages" are just ZIP files to Linux.
This means there are finally some "sanity tests" tests. I do test the images before any get marked at "Released" in GitHub. I published 7.22 and 7.23beta3 with new QEMU support. See mikropkl README.md for details
QEMU on macOS "Silicon" (aarch64)
This is on GitHub using QEMU directly (via brew install qemu) but using a "real" Mac (as GitHub Action Runner).
Note One critical problem is Mac-on-GitHub do not support Hypervisor.framework, it been disabled. This is need for UTM or QEMU, or Apple Virtualization. So test below are using QEMU tcg emulation. But all images do boot and work.
The qemu.sh script is same as in "UTM bundles" - but does detect the hypervisor support, so the "real" Mac test, the included qemu.sh did correctly "downgrade".
From Test: QEMU Direct Boot ยท tikoci/mikropkl@f0bdd3a ยท GitHub
Example test (1 of 5)
It actually a long to show all test. But here is what one looks like. All images purposed are changed, showing just apple.aarch64 (for 7.23beta2) here:
Boot chr.aarch64.apple.7.23beta2
Config: arch=aarch64 mem=1024M cpus=2 disks=1
Runner: aarch64, KVM=0 โ expected accel=tcg
Port: 9180, Timeout: 60s
Starting chr.aarch64.apple.7.23beta2 (port 9180, accel=tcg,tb-size=256)...
QEMU PID=15445 โ log: /tmp/qemu-chr.aarch64.apple.7.23beta2.log
Serial: socat - UNIX-CONNECT:/tmp/qemu-chr.aarch64.apple.7.23beta2-serial.sock
Monitor: socat - UNIX-CONNECT:/tmp/qemu-chr.aarch64.apple.7.23beta2-monitor.sock
Serial capture PID=15449 โ /tmp/qemu-chr.aarch64.apple.7.23beta2-serial.log
โ Binary: qemu-system-aarch64
โ Accelerator: tcg
โ UEFI pflash present
โ Port forwarding: host 9180 โ guest 80
Attempt 1/12: not ready (qemu_pid=15445 state=R< cpu= 99.8%) โ waiting 5s
Attempt 2/12: not ready (qemu_pid=15445 state=S< cpu= 20.1%) โ waiting 5s
Attempt 3/12: not ready (qemu_pid=15445 state=S< cpu= 12.0%) โ waiting 5s
โ RouterOS HTTP up after 30s
โ GET /system/resource
โ GET /interface
โ GET /ip/address
โ GET /ip/route
โ GET /ipv6/address
โ GET /ipv6/route
/system/resource:
{
"architecture-name": "arm64",
"board-name": "CHR QEMU QEMU Virtual Machine",
"build-time": "2026-03-13 09:52:01",
"cpu": "ARM64",
"cpu-count": "2",
"cpu-load": "7",
"free-hdd-space": "72286208",
"free-memory": "819560448",
"platform": "MikroTik",
"total-hdd-space": "86183936",
"total-memory": "1073741824",
"uptime": "24s",
"version": "7.23beta2 (development)",
"write-sect-since-reboot": "1048",
โ Skipping check-installation on aarch64 (see CLAUDE.md)
2026/03/20 03:25:29 socat[15449] W exiting on signal 15
โ chr.aarch64.apple.7.23beta2: ALL CHECKS PASSED
Boot chr.aarch64.qemu.7.23beta2
Boot chr.x86_64.apple.7.23beta2
Boot chr.x86_64.qemu.7.23beta2
Boot rose.chr.aarch64.qemu.7.23beta2
Boot rose.chr.x86_64.qemu.7.23beta2
MacOS results for all images
Note Test for X86 on ARM are skipped, the emulation is too slow. As noted, tsg mode is used, which from previous tests is actually extremely slow at X86 virtualization on ARM (it's a known thing actually, not CHR's fault here & esoteric case mainly as an "extreme test") - so the X86 on ARM is always skipped. X86 test always run all builds, including ARM64 ones (see further below).
This is the summary from "mac-15":
โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ
Boot timing โ aarch64/Darwin runner (3 passed, 0 failed, 3 skipped)
โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ
โ chr.aarch64.apple.7.23beta2: 30s (tcg)
โ chr.aarch64.qemu.7.23beta2: 30s (tcg)
โ chr.x86_64.apple.7.23beta2: skipped (x86_64 on aarch64)
โ chr.x86_64.qemu.7.23beta2: skipped (x86_64 on aarch64)
โ rose.chr.aarch64.qemu.7.23beta2: 30s (tcg)
โ rose.chr.x86_64.qemu.7.23beta2: skipped (x86_64 on aarch64)
โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ
"UTM Package" on ARM64/aarch64 with Ubuntu
From GitHub Action: Test: QEMU Direct Boot ยท tikoci/mikropkl@f0bdd3a ยท GitHub
Summary
โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ
Boot timing โ aarch64/Linux runner (3 passed, 0 failed, 3 skipped)
โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ
โ chr.aarch64.apple.7.22: 29s (tcg)
โ chr.aarch64.qemu.7.22: 29s (tcg)
โ chr.x86_64.apple.7.22: skipped (x86_64 on aarch64)
โ chr.x86_64.qemu.7.22: skipped (x86_64 on aarch64)
โ rose.chr.aarch64.qemu.7.22: 22s (tcg)
โ rose.chr.x86_64.qemu.7.22: skipped (x86_64 on aarch64)
โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ
"UTM Package" on Intel/x86_64 with Ubuntu
From GitHub Action: Test: QEMU Direct Boot ยท tikoci/mikropkl@f0bdd3a ยท GitHub
Summary
โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ
Boot timing โ x86_64/Linux runner (6 passed, 0 failed, 0 skipped)
โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ
โ chr.aarch64.apple.7.23beta2: 29s (tcg)
โ chr.aarch64.qemu.7.23beta2: 30s (tcg)
โ chr.x86_64.apple.7.23beta2: 13s (kvm)
โ chr.x86_64.qemu.7.23beta2: 13s (kvm)
โ rose.chr.aarch64.qemu.7.23beta2: 29s (tcg)
โ rose.chr.x86_64.qemu.7.23beta2: 13s (kvm)
โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ
7.22 GitHub Test (Overview Page)
The same test, except skipping Mac (e.g. emulated QEMU is not particular valid since most "actually real" Mac's support the Hypervisor.framework. From Test: QEMU Direct Boot ยท tikoci/mikropkl@f0bdd3a ยท GitHub
QEMU Support Doc
For deeper overview of how the qemu.sh used but test works on downloaded imaged, see mikropkl/Files/QEMU.md at main ยท tikoci/mikropkl ยท GitHub
Stay tuned for more updates