Beta

How well it runs can still depend on your host and its GPU. Metal, macOS are trademarks of Apple Inc. Reims vGPU is an independent project and is not affiliated with, sponsored by, or endorsed by Apple Inc.

A macOS VM on an Apple silicon Mac

On an Apple silicon Mac, a VM runs arm64 macOS on QEMU's vmapple machine, under Hypervisor.framework, with its GPU on Metal. macOS installs from Apple's IPSW, the same restore image a Mac uses, through Virtualization.framework, which is the only thing that restores one. There's no OpenCore and nothing to set up in the guest.

You need reims-ctl installed with its installer, which signs it with the virtualization entitlement an IPSW install needs. reims-ctl doctor says whether it has it.

Create it from an IPSW

$ reims-ctl create mac --ipsw latest

latest asks Apple for the newest macOS this Mac supports and downloads it into ~/.local/share/reims-ctl/ipsw, where the next VM finds it. An interrupted download picks up where it stopped. The install itself took 3 min 17 s on an M3 Max:

zsh — M3 Max, macOS 27
$ reims-ctl create mac --ipsw latest
mac: asking Apple for the newest macOS this Mac supports
mac: using the IPSW downloaded before, ~/.local/share/reims-ctl/ipsw/UniversalMac_27.0.1_26A434_Restore.ipsw
mac: loading the IPSW
mac: creating the auxiliary storage
mac: installing macOS
mac: installing macOS: 0%
mac: installing macOS: 9%
mac: installing macOS: 16%
…
mac: installing macOS: 90%
mac: done
created mac in ~/.local/share/reims-ctl/vms/mac
Real output, with the IPSW already downloaded; … marks progress lines left out.

On a Mac running macOS 27, latest is macOS 27. The project has tested arm64 macOS 13, 14, 15 and 26 guests; for one of those, give --ipsw its IPSW file instead:

$ reims-ctl create tahoe --ipsw ~/Downloads/UniversalMac.ipsw

The new VM gets a 64G disk, half the Mac's cores (2 to 8) and half its memory (4 to 16 GiB), and one 1920×1080 display. Each of these is an option of create, or a setting you can change later:

$ reims-ctl create mac --ipsw latest --cpus 6 --memory 12G --disk-size 128G --borderless --resolution host

Or run reims-ctl, press n, fill in the form and press Ctrl-S: the same create, with each field explained as you reach it.

Or bring a VM you already have

A VM that macosvm or tart made is a Virtualization.framework VM, which vmapple boots as it is. --bundle imports its directory as an APFS clone, which takes no extra space until either copy changes:

$ reims-ctl create mac --bundle ~/VMs/macos13
$ reims-ctl create mac --bundle ~/VMs/macos13 --bundle-mode in-place  # use its files where they are

The VM keeps its machine identifier. If the bundle doesn't hold the identifier's ECID, give it with --ecid.

Start it

$ reims-ctl start mac
zsh — M3 Max, macOS 27
$ reims-ctl start macos-26
macos-26: running, pid 49388

A window opens for each display. A fresh install starts in Setup Assistant; a VM you imported starts where it left off. Click into the window to give the guest your keyboard and mouse, and press ⌃⌥⌘ to take them back. Running a VM covers the window, settings and everything after.

reims-ctl create … --start starts the VM as soon as it's made.

What a VM looks like

zsh — M3 Max, macOS 27
$ reims-ctl show macos-26
macos-26
  state         running (pid 49388)
  kind          arm64 macOS guest (vmapple, HVF)
  directory     ~/.local/share/reims-ctl/vms/macos-26
  cpus          4
  memory        8G
  disk          disk.img (raw)
  displays      1 x 1920x1080
  ecid          11400282047089759542
  audio         on
  network       user, mac 52:54:00:b7:2b:36
  logs          on (info)
  stop timeout  90 s

disk.img and aux.img are the files Virtualization.framework makes; the ECID is the machine identifier vmapple boots with.

Without reims-ctl

reims-ctl command mac prints the QEMU command a VM runs as a shell script, to run or change yourself. Working on the project itself, make vm VM=path/to/macosvm-vm boots a macosvm VM on the checkout's own QEMU build; the QEMU notes cover it.