mirror of
https://github.com/Motorhead1991/qemu.git
synced 2025-07-31 06:13:53 -06:00

Apple defines a new "vmapple" machine type as part of its proprietary macOS Virtualization.Framework vmm. This machine type is similar to the virt one, but with subtle differences in base devices, a few special vmapple device additions and a vastly different boot chain. This patch reimplements this machine type in QEMU. To use it, you have to have a readily installed version of macOS for VMApple, run on macOS with -accel hvf, pass the Virtualization.Framework boot rom (AVPBooter) in via -bios, pass the aux and root volume as pflash and pass aux and root volume as virtio drives. In addition, you also need to find the machine UUID and pass that as -M vmapple,uuid= parameter: $ qemu-system-aarch64 -accel hvf -M vmapple,uuid=0x1234 -m 4G \ -bios /System/Library/Frameworks/Virtualization.framework/Versions/A/Resources/AVPBooter.vmapple2.bin -drive file=aux,if=pflash,format=raw \ -drive file=root,if=pflash,format=raw \ -drive file=aux,if=none,id=aux,format=raw \ -device vmapple-virtio-blk-pci,variant=aux,drive=aux \ -drive file=root,if=none,id=root,format=raw \ -device vmapple-virtio-blk-pci,variant=root,drive=root With all these in place, you should be able to see macOS booting successfully. Known issues: - Currently only macOS 12 guests are supported. The boot process for 13+ will need further investigation and adjustment. Signed-off-by: Alexander Graf <graf@amazon.com> Co-authored-by: Phil Dennis-Jordan <phil@philjordan.eu> Signed-off-by: Phil Dennis-Jordan <phil@philjordan.eu> Reviewed-by: Akihiko Odaki <akihiko.odaki@daynix.com> Tested-by: Akihiko Odaki <akihiko.odaki@daynix.com> Message-ID: <20241223221645.29911-15-phil@philjordan.eu> Signed-off-by: Philippe Mathieu-Daudé <philmd@linaro.org>
65 lines
2.5 KiB
ReStructuredText
65 lines
2.5 KiB
ReStructuredText
.. SPDX-License-Identifier: GPL-2.0-or-later
|
|
|
|
VMApple machine emulation
|
|
========================================================================================
|
|
|
|
VMApple is the device model that the macOS built-in hypervisor called "Virtualization.framework"
|
|
exposes to Apple Silicon macOS guests. The "vmapple" machine model in QEMU implements the same
|
|
device model, but does not use any code from Virtualization.Framework.
|
|
|
|
Prerequisites
|
|
-------------
|
|
|
|
To run the vmapple machine model, you need to
|
|
|
|
* Run on Apple Silicon
|
|
* Run on macOS 12.0 or above
|
|
* Have an already installed copy of a Virtualization.Framework macOS 12 virtual
|
|
machine. Note that newer versions than 12.x are currently NOT supported on
|
|
the guest side. I will assume that you installed it using the
|
|
`macosvm <https://github.com/s-u/macosvm>`__ CLI.
|
|
|
|
First, we need to extract the UUID from the virtual machine that you installed. You can do this
|
|
by running the shell script in contrib/vmapple/uuid.sh on the macosvm.json file.
|
|
|
|
.. code-block:: bash
|
|
:caption: uuid.sh script to extract the UUID from a macosvm.json file
|
|
|
|
$ contrib/vmapple/uuid.sh "path/to/macosvm.json"
|
|
|
|
Now we also need to trim the aux partition. It contains metadata that we can just discard:
|
|
|
|
.. code-block:: bash
|
|
:caption: Command to trim the aux file
|
|
|
|
$ dd if="aux.img" of="aux.img.trimmed" bs=$(( 0x4000 )) skip=1
|
|
|
|
How to run
|
|
----------
|
|
|
|
Then, we can launch QEMU with the Virtualization.Framework pre-boot environment and the readily
|
|
installed target disk images. I recommend to port forward the VM's ssh and vnc ports to the host
|
|
to get better interactive access into the target system:
|
|
|
|
.. code-block:: bash
|
|
:caption: Example execution command line
|
|
|
|
$ UUID="$(contrib/vmapple/uuid.sh 'macosvm.json')"
|
|
$ AVPBOOTER="/System/Library/Frameworks/Virtualization.framework/Resources/AVPBooter.vmapple2.bin"
|
|
$ AUX="aux.img.trimmed"
|
|
$ DISK="disk.img"
|
|
$ qemu-system-aarch64 \
|
|
-serial mon:stdio \
|
|
-m 4G \
|
|
-accel hvf \
|
|
-M vmapple,uuid="$UUID" \
|
|
-bios "$AVPBOOTER" \
|
|
-drive file="$AUX",if=pflash,format=raw \
|
|
-drive file="$DISK",if=pflash,format=raw \
|
|
-drive file="$AUX",if=none,id=aux,format=raw \
|
|
-drive file="$DISK",if=none,id=root,format=raw \
|
|
-device vmapple-virtio-blk-pci,variant=aux,drive=aux \
|
|
-device vmapple-virtio-blk-pci,variant=root,drive=root \
|
|
-netdev user,id=net0,ipv6=off,hostfwd=tcp::2222-:22,hostfwd=tcp::5901-:5900 \
|
|
-device virtio-net-pci,netdev=net0
|
|
|