How a macOS guest boots, and the current desktop/GUI status. Display, GPU, and Setup-Assistant limitations are in Known issues.
Every VM boots the same way on Intel and AMD:
OpenCore.qcow2) + 4 MB OVMF CODE/VARS,
provisioned once by doctor.sh and reused by every VM. Firmware is external (an -drive), never
baked into the macOS qcow2 — the same image boots under a different loader on Intel vs AMD.Skylake-Client spoofing GenuineIntel with -hle,-rtm (TSX off), +invtsc, and
vmware-cpuid-freq=on. The TSC flags are load-bearing: without them macOS self-calibrates the TSC
and spins pathologically under nested KVM on first boot.config.plist sets ShowPicker=false so OpenCore boots the
default entry immediately, with no picker UI. A visible picker can’t be driven reliably headlessly —
OpenCanopy cancels its Timeout countdown on the stray input from USB device enumeration and then
waits forever.kvm.ignore_msrs=1 is set host-wide (macOS reads MSRs an AMD host lacks).The full Tahoe desktop does render over VNC — testbed-verified: boot → login window (the cocoon
user) → type cocoon → Finder + Dock + menu bar + desktop widgets, all repainting normally.
What’s left for a fully unattended boot-to-desktop is auto-skipping the first-run Setup Assistant
plus auto-login. The post-SA recipe is validated on a testbed VM: complete home +
com.apple.SetupAssistant DidSee*/LastSeen* markers + auto-login (autoLoginUser +
/etc/kcpassword written via perl pack) + keyboard-wizard suppress + pmset no-sleep.
The blocker: a fresh macOS 26 (Tahoe) clone boots to the system Setup Assistant
(_mbsetupuser / SetupAssistantSpringboard) and it resists every marker-based skip tried
(.AppleSetupDone, complete home from the User Template, .skipbuddy, DidSee*, auto-login, a
killsa daemon, removing /var/db/ConfigurationProfiles [SIP-blocked]). macOS 14+ broke the classic
.AppleSetupDone skip, and the keyboard does not register at the SA — so the only reliable automated
skip is a mouse/OCR click-through of the SA wizard (the install-stage OCR machinery), not yet
implemented. Until then, :26 is SSH/VNC-login-usable but the GUI lands at the Setup Assistant.