Skip to content
Kei Kamikawa edited this page Nov 2, 2022 · 10 revisions

The Virtualization framework can run Linux VMs on a Mac with Apple silicon, and on an Intel-based Mac. The Linux ISO image you download must support the CPU architecture of your Mac.

  • A Mac with Apple silicon
    • Download a Linux ISO image for ARM, which is usually indicated by aarch64 or arm64 in the image filename.
  • An Intel-based Mac
    • Download a Linux ISO image for Intel-compatible CPUs, which is usually indicated by x86_64 or amd64 in the image filename.

If you need to run Intel Linux binaries in ARM Linux on a Mac with Apple silicon, the Virtualization framework supports this capability using the Rosetta translation environment in macOS 13 and later. For more information, see Running Intel Binaries in Linux VMs with Rosetta.

Linux Kernel Requirements

You need PCI support in any case as the Virtio devices are on the PCI bus. It can be supported by enabling CONFIG_VIRTIO_PCI within the kernel (not as a module).

  • Serial console needs console=hvc0 kernel parameter and your Linux kernel is required to enable CONFIG_VIRTIO_CONSOLE and CONFIG_HVC_DRIVER.
    • It's not possible to capture early boot messages with it. It starts working around the time /dev is populated. (by using mdev, sdev, etc.)
    • This is for vz.LinuxBootLoader.
  • Must be enabled CONFIG_VIRTIO_BALLOON to use the memory balloon device.
  • Must be enabled CONFIG_VIRTIO_BLK to use the block device.
    • Only RAW disk images on APFS are supported. Other formats are not supported.
  • Must be enabled CONFIG_VIRTIO_NET to use the network device.
    • With NAT, based on the MAC address used for the device the IP address of the VM can be found in /var/db/dhcpd_leases.
  • Shared Directories

Request Stop

Request Stop in Virtualization.framework depends on the CPU you are using.

On Apple Silicon Macs, the shutdown is signaled through the PL061. In order to use it, the kernel needs to be compiled with that device (CONFIG_GPIO_PL061). From user space, a process like acpid can turn the event into an action. CONFIG_INPUT_EVDEV and CONFIG_KEYBOARD_GPIO must also be enabled for these processes to handle events.

If you want to handle with acpid in such as an init script, you can use the following scripts for a shutdown.

mkdir -p /etc/acpi/PWRF
echo '#!/bin/sh' > /etc/acpi/PWRF/00000080
echo 'poweroff' >> /etc/acpi/PWRF/00000080
chmod +x /etc/acpi/PWRF/00000080
acpid

On Intel Macs, the stop request is done through the ICH9. The PM1_STS’s Power Button Status (PWRBTN_STS) is set in response to the request.

Refs