Use case

Appliance VMs on Apple Silicon Macs

MacVisor boots appliance images, such as Home Assistant OS, OpenWrt and pfSense-based firewalls, as they are: make the VM with cloud-init off and set the appliance up through its own web UI or console. It can start at login, take a Zigbee or Z-Wave radio through USB passthrough, and route between a WAN and a LAN on its own network. The image must be built for ARM64.

  • Apple Silicon (M1 or later)
  • macOS 27 on the Mac
  • ARM64 appliance images

30 days free, no key or payment details. Apple Silicon with macOS 27.

A stylised list of appliance VMs, Home Assistant OS, OpenWrt and armsense, beside a Mac mini with tags for no cloud-init, USB radios and Start at Login.

An appliance is a complete system that sets itself up: a smart-home hub, a router or a firewall, managed through its own web UI or console. MacVisor runs them beside your other VMs on one Apple Silicon Mac, and keeps them running when nobody is watching.

Make an appliance VM

Appliance images don't use cloud-init, so make the VM with it off. In the app, press ⌘N, choose Linux, or FreeBSD for a FreeBSD-based image, then Image File or URL…, and turn off Set up with cloud-init. From Terminal:

mvz create ~/Downloads/<appliance-image> hub --no-cloud-init                 # a Linux-based appliance
mvz create ~/Downloads/<appliance-image> fw --no-cloud-init --os freebsd     # a FreeBSD-based one
mvz start hub --headless
mvz ip hub --wait                                                           # the address the Mac sees it use

MacVisor takes raw, qcow2 and ASIF images, and .xz files of them. Decompress any other download first. The image must be built for ARM64: MacVisor uses Apple's Virtualization framework and doesn't emulate x86.

The file becomes a template the first time, and the template remembers it makes appliances. A new VM gets 4 vCPUs, 4 GiB of memory and a sparse 64 GiB disk unless you pass --cpus, --memory or --disk.

What MacVisor does for an appliance

MacVisor boots the image as it is. It attaches no cloud-init seed, makes no account, authorises no SSH keys and installs no agent. So mvz shell and mvz exec refuse an appliance, and you sign in at its console or web UI instead.

  • The console. Linux VMs have a serial console on by default, and FreeBSD VMs always do. Use the window's Display | Console switch, or mvz console <vm> in Terminal.
  • FreeBSD-based images boot through MacVisor's own FreeBSD boot volume, so nothing in the image changes. They have no display after FreeBSD's loader, and the window shows the console.
  • Addresses. mvz ip, the Overview's Appliance card and <vm>.mvz show what the appliance reports through a QEMU guest agent, or else the addresses the Mac has seen it use.
  • A QEMU guest agent, which images such as Home Assistant OS ship, gives MacVisor the guest's addresses and a clean shutdown. A new Linux appliance gets the port it talks on, and every FreeBSD VM has a serial port for it. See QEMU guest agent.
  • Shutting down. Shut Down and mvz stop work for every appliance, through its power button or its QEMU guest agent. For one that ignores both, set a shutdown command, such as one that logs in over SSH.

See Appliances: images without cloud-init for the full list.

Networks for appliances

A new VM joins the Default MacVisor Network, which reaches the internet through the Mac and is reachable only from this Mac. An appliance often needs more:

You wantUse
A hub that phones and devices on your LAN reachA bridged adapter: mvz set <vm> --network bridged:en0
A router's WANThe Default MacVisor Network, or another shared network
A router's LAN, for lab VMs behind itA VLAN interface, made in the app with New VLAN Interface…, then mvz nics add <vm> --network bridged:<vlan-interface>. Our OpenWrt and armsense tests used this
A tagged segment of your real networkA VLAN interface, made in the app with New VLAN Interface…, then bridged

A VM has up to four adapters, the primary one included. Never bridge a router's LAN to a network that has its own DHCP server, or the appliance's DHCP server answers there too. The Mac reaches a host-only network only in the subnet macOS picked, which mvz networks shows, and 27.2 can't pin it to 192.168.1.0/24. For a LAN in a subnet you choose, bridge it to a VLAN interface and give the Mac an address there, as in our OpenWrt test. Any custom network can also have a firewall the Mac enforces. See Custom networks and the network lab page.

Keep it running

mvz autostart hub on              # start at every login, without a window
mvz ha hub on                     # start it again after a crash
mvz ha hub on --watchdog          # also restart a guest that stopped responding

Start at Login has MacVisor's background service start the VM whether or not the app opens. A VM comes back after a power cut only if the Mac does too: restart after power failure, FileVault off, automatic login, and no sleep when idle. See Always-on host.

VM Watchdog needs heartbeats from inside the guest. Most appliances can't run the MacVisor Agent, so a QEMU guest agent's answers count instead. Where none answers, use a health check: a command on the Mac, such as curl against the appliance's web UI, that restarts the VM or tells you when it keeps failing.

USB devices

A Zigbee or Z-Wave radio, a serial adapter or a USB drive passes through to the VM, which uses its own driver for it:

mvz usb list hub
mvz usb attach hub 10c4:ea60      # attach now, and whenever the VM runs

macOS may ask once whether to allow the accessory, on the Mac's screen. A suspend or a live snapshot unplugs the device for a few seconds and plugs it in again, so shut an appliance with a radio down rather than suspending it. See USB devices.

Appliance guides

ApplianceBased onMake it withTested on MacVisor
Home Assistant OSLinux--no-cloud-initBoots to its login. Bridged networking and a USB radio not yet
OpenWrtLinux--no-cloud-initBoots, LAN on a VLAN interface, WAN, LuCI and the QEMU guest agent work
armsense (technology demo, test use only)FreeBSD, from pfSense CE source--no-cloud-init --os freebsdBoots, WAN on the default network, LAN on a VLAN interface, console menu works

VyOS and OPNsense-based images boot the same way when you have an ARM64 build. Check that the project offers one before you start: many firewall distributions publish x86-64 images only.

Snapshots and backups

Take a disk-only snapshot before an appliance updates itself, and revert if the update goes wrong:

mvz snapshots take hub --disk-only --name "Before update"
mvz set hub --backup-to /Volumes/T7/Backups       # daily, keeps the newest 7

Without the MacVisor Agent, nothing flushes the guest's writes before a snapshot or a backup, so keep the appliance's own configuration backups too. See Snapshots and Backups.

When MacVisor isn't the right choice

  • The appliance ships only for x86-64. It won't boot on Apple Silicon. Use an x86 machine with a hypervisor such as Proxmox VE.
  • You don't have a Mac that's on all the time. A small dedicated device, such as a Raspberry Pi for Home Assistant or a router you buy, uses less power and has fewer moving parts.
  • You need GPU or PCI passthrough, such as a network card handed to a firewall. MacVisor passes USB devices only.

To try it, download MacVisor and use the free 30-day trial. Every feature on this page is in every license, including the one-time Pro license.

FAQ

Common questions

More in the documentation and known limitations.

Can I run Home Assistant OS on a Mac?

Yes, on an Apple Silicon Mac, as a VM. Download the Home Assistant OS image for 64-bit ARM (generic aarch64) from Home Assistant's installation page and make a MacVisor VM from it with cloud-init off. We tested it: it boots to the Home Assistant login on the serial console. x86-64 images won't boot.

Can I run a router or firewall VM on an Apple Silicon Mac?

Yes, from an ARM64 image. OpenWrt publishes EFI images for 64-bit ARM virtual machines, and armsense is an ARM64 firewall built from pfSense CE source. VyOS and OPNsense-based images boot the same way when you have an ARM64 build. MacVisor doesn't emulate x86, so x86-64 router images won't boot.

Does an appliance VM need cloud-init?

No. Make it with cloud-init off, with mvz create and --no-cloud-init, or by turning off Set up with cloud-init in New VM. MacVisor then boots the image as it is, with no seed, account, SSH keys or agent. Add --os freebsd for a FreeBSD-based image.

Can an appliance VM use my Zigbee or Z-Wave USB stick?

Yes. MacVisor passes a USB device from the Mac through to the VM and attaches it again at every start. macOS may ask once whether to allow the accessory. Devices with isochronous endpoints, such as webcams and audio devices, aren't supported.

Will appliance VMs come back after the Mac restarts?

Yes, with Start at Login on for the VM and the Mac set up for unattended boots: restart after power failure, FileVault off and automatic login. High availability also starts a VM again after a crash.

How does MacVisor shut an appliance down?

A Linux appliance gets the virtual power button, then its QEMU guest agent if it ignores the button. A FreeBSD-based one goes through a QEMU guest agent if one answers, else the power button. For an appliance that ignores both, set a shutdown command, such as one that logs in over SSH.

Run your Mac like a virtualization host.

macOS, Windows 11, Linux and FreeBSD VMs that keep running with the app closed, with snapshots, networks, backups and the mvz command line.