 CHR using Apple Virtualization & 🐧 QEMU for Linux - Ready-to-use!

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