Skip to content

Create a Local VM on macOS

On macOS you can run a meltcloud Nest or Machine as a local VM. This is handy for trials, PoCs and learning before you move to bare metal.

Tool Comparison

Three options are available, each with different tradeoffs:

tartUTM (Apple Virtualization)UTM (QEMU)
InterfaceCLIGUIGUI
Apple Silicon
Intel Mac
Nested virtualization✓ (M3+, macOS 15+)✓ (M3+, macOS 15+)
Inter-VM networking✓ (Softnet)✗ (VMs are isolated)✓ (vmnet-shared)

Inter-VM networking is required when running a Nest and Machines on the same host (Nest ↔ Machine, Machine ↔ Machine). Nested virtualization is required for Elastic Pools / KubeVirt.

Recommendation

For most setups we recommend tart: it supports both inter-VM networking and nested virtualization on Apple Silicon M3+.

VM Settings

Pick the column matching what you want to run:

SettingNestMachine
Architecturehost arch (arm64 or amd64)host arch (arm64 or amd64)
vCPU8+2+
RAM16 GB+ 4 GB+
Disk≥ 200 GB≥ 20 GB
Nested virtualizationnot requiredoptional, required for Elastic Pools
Boot mediaNest installer .isoEnrollment Image .iso

Option A: tart

Install tart with Homebrew:

shell
brew install cirruslabs/cli/tart

Create and start the VM:

shell
# create a Linux VM with a 215 GB disk (~200 GiB, tart uses decimal GB)
tart create --linux --disk-size 215 melt-nest

# set memory (in MB); CPU defaults to 4 which is fine
tart set melt-nest --memory 16384

# boot from the Nest installer ISO
# uses default Shared networking; do NOT use --net-softnet (blocks Nest floating IPs)
tart run melt-nest --disk "/path/to/nest-installer-arm64.iso:ro"
shell
# create a Linux VM (40 GB is plenty for a worker)
tart create --linux --disk-size 40 melt-machine

# set memory (in MB)
tart set melt-machine --memory 8192

# boot the Enrollment Image
# --net-softnet + --net-softnet-allow: enables inter-VM traffic so the Machine can reach the Nest
tart run melt-machine \
  --disk "/path/to/enrollment-image-arm64.iso:ro" \
  --net-softnet --net-softnet-allow=0.0.0.0/0
shell
# create a Linux VM (40 GB is plenty for a worker)
tart create --linux --disk-size 40 melt-machine

# set memory (in MB)
tart set melt-machine --memory 8192

# boot the Enrollment Image
# --net-softnet + --net-softnet-allow: enables inter-VM traffic so the Machine can reach the Nest
# --nested: enables nested virtualization for Elastic Pools (requires M3+ Mac on macOS 15+)
tart run melt-machine \
  --disk "/path/to/enrollment-image-arm64.iso:ro" \
  --net-softnet --net-softnet-allow=0.0.0.0/0 \
  --nested

VM window not appearing?

tart may not bring the VM window to the foreground. See Troubleshoot: tart VM window doesn't appear.

Option B: UTM with Apple Virtualization

WARNING

UTM with the Apple Virtualization backend isolates VMs from each other. Use this option only for single-VM setups (e.g., a Machine enrolling against SaaS meltcloud). For setups where Machines need to reach a local Nest, use tart instead.

  1. Install UTM from mac.getutm.app, the Mac App Store, or Homebrew:

    shell
    brew install --cask utm
  2. Click the + button in the toolbar, then choose Virtualize (native speed on Apple Silicon; do not pick Emulate).

    UTM: choose Virtualize

  3. Under Operating System, choose Linux.

    UTM: choose Linux

  4. Hardware: set Memory (e.g. 16384 MiB for a Nest) and CPU Cores (leave Default, or set per the table above).

    UTM: hardware settings

  5. Boot: leave Use Apple Virtualization checked, select Boot from ISO image, and Browse to your .iso (Nest installer or Enrollment Image).

    UTM: boot from ISO image

  6. Storage: set the drive size (see VM Settings above).

    UTM: storage size

  7. Shared Directory: skip this step.

  8. Summary: give the VM a name (e.g. nest) and Save.

    UTM: summary

  9. Start the VM. It boots from the .iso.

Nested virtualization (Elastic Pools)

For Machines that will host Elastic Pools, nested virtualization is required. UTM enables it automatically on M3 or newer Macs running macOS 15+.

Option C: UTM with QEMU

WARNING

UTM with the QEMU backend supports both Apple Silicon and Intel Macs and inter-VM networking (via vmnet-shared), but does not support nested virtualization (Elastic Pools won't work).

  1. Install UTM from mac.getutm.app, the Mac App Store, or Homebrew:

    shell
    brew install --cask utm
  2. Click the + button in the toolbar, then choose Virtualize (do not pick Emulate).

    UTM: choose Virtualize

  3. Under Operating System, choose Linux.

    UTM: choose Linux

  4. Hardware: set Memory (e.g. 16384 MiB for a Nest) and CPU Cores (leave Default, or set per the table above).

    UTM: hardware settings

  5. Boot: uncheck "Use Apple Virtualization", select Boot from ISO image, and Browse to your .iso (Nest installer or Enrollment Image).

    Intel Macs

    On Intel Macs, use the amd64 Nest installer or Enrollment Image. "Use Apple Virtualization" is not available on Intel, so UTM always uses the QEMU backend.

    UTM (QEMU): uncheck Use Apple Virtualization

  6. Storage: set the drive size (see VM Settings above).

    UTM: storage size

  7. Shared Directory: skip this step.

  8. Summary: give the VM a name (e.g. nest) and Save.

    UTM: summary

  9. Start the VM. It boots from the .iso.

WARNING

After the Nest or Machine installation completes, you must remove the ISO from the VM. QEMU does not respect boot order changes, so the VM will keep rebooting into the installer. See VM keeps rebooting into the installer (UTM with QEMU).

Next Steps

  • Nest: follow the on-screen TUI installer.
  • Machine: after it boots from the Enrollment Image it enrolls automatically and appears under Machines. Continue with Assign to a Machine Pool.

Troubleshoot

tart VM window doesn't appear

tart may not bring the VM window to the foreground on some macOS versions. We also stumbled upon this, there are even GitHub issues (#928, #1131) for it.

No internet or host can't reach the VM (UTM)

Open the VM's Settings → Network and confirm Network Mode is Shared Network.

Apple Virtualization backend:

UTM (Apple Virtualization): Shared Network

QEMU backend:

UTM (QEMU): Shared Network

VMs can't reach each other (UTM with Apple Virtualization)

This is a known limitation. UTM's Apple Virtualization backend isolates VMs from each other on the Shared Network. VMs cannot communicate with each other, even when running on the same host.

If you need inter-VM networking (e.g., Machines reaching a local Nest), use tart with Softnet (see Option A) or UTM with the QEMU backend (see Option C), which uses vmnet-shared and supports inter-VM traffic.

VM keeps rebooting into the installer (UTM with QEMU)

QEMU does not respect boot order changes made by the installer. After the Nest or Machine installation completes, the VM will keep rebooting into the installer ISO instead of booting from disk.

To fix this, stop the VM and remove the ISO drive: open the VM's Settings, right-click the USB Drive entry under Drives, and click Delete.

UTM (QEMU): remove ISO drive

Disk path must match the Enrollment Image (Machines)

Apple's Virtualization framework presents the disk as a virtio device, usually /dev/vda. The install disk path you chose when creating the Enrollment Image must match, or enrollment fails. If it does, create another Enrollment Image with the correct disk path. The Enrollment Logs show the exact error.

If the VM has trouble booting or enrolling, check the Enrollment Images: Troubleshooting section.