Guest OS

Linux VMs on Apple Silicon Macs

MacVisor makes an ARM64 Linux VM on any Apple Silicon Mac with one command, mvz create ubuntu dev, from a signed catalogue of nine distributions. On its first boot, cloud-init adds your account and SSH keys, the MacVisor Agent, Rosetta for x86-64 programs and automatic port forwarding, so the VM is ready for ssh dev.mvz and VS Code Remote-SSH.

  • Apple Silicon (M1 or later)
  • macOS 27 on the Mac
  • ARM64 guests
  • Nested virtualization on M3 or later

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

A stylised MacVisor window listing Linux VMs made from Ubuntu, Debian, Fedora and other cloud images, with a terminal open to one of them.

Make a Linux VM in one command

In the app, choose New VM → Linux → Cloud Image, pick a distribution, and create. From Terminal:

mvz create ubuntu dev          # downloads Ubuntu 26.04 LTS the first time, then makes the VM
mvz shell dev --start          # starts it without a window and opens a shell

mvz images lists the catalogue. A new VM gets 4 vCPUs, 4 GiB of memory and a sparse 64 GiB disk unless you pass --cpus, --memory or --disk.

The catalogue is signed and ships inside MacVisor. Every image downloads from the vendor's own site over HTTPS and is checked against the vendor's checksum before use. See How downloads are verified.

Nine distributions in the catalogue

All images are ARM64. Use the id or an alias with mvz create.

DistributionVersionsCommandRuntimes
Ubuntu26.04 LTS, 24.04 LTSmvz create ubuntu devAll four
Debian13 (trixie), 12 (bookworm)mvz create debian devAll four
Fedora44, 43mvz create fedora devAll four, Podman preinstalled
Rocky Linux10, 9mvz create rocky devAll four
AlmaLinux10, 9mvz create alma devAll four
Oracle Linux10, 9mvz create oracle devNo k3s; no Docker Engine on 10
CentOS Stream10mvz create centos devAll four, Podman preinstalled
openSUSE Leap16.1mvz create opensuse devAll four
Alpine Linux3.24.3mvz create alpine devcontainerd and Docker

The four runtimes are containerd with nerdctl, Docker Engine, Podman and k3s. The full table, with sources and build policy, is in Linux images.

Templates and linked clones

The first VM from an image makes a template: MacVisor converts the download to an ASIF disk and keeps it in your storage location's Templates folder. Every VM after that is a linked clone of the template, so it starts without a download and stores only its own changes. mvz images pull debian-13 downloads an image ahead of time, and fetches a newer build later. Existing VMs keep the build they were made from.

What the first boot sets up

cloud-init runs once, on the first boot:

  • Your account, with your Mac user name and UID, so files in shared folders belong to you on both sides. It has no password and uses sudo without one.
  • Your SSH keys, every public key in ~/.ssh and your SSH agent. With none, MacVisor offers to make ~/.ssh/id_ed25519.
  • The MacVisor Agent, for clipboard, file transfer, shared folders, clean shutdown and port forwarding.
  • Rosetta, when it's installed on the Mac, so x86-64 Linux programs run in the guest.
  • Automatic port forwarding. A port the guest listens on appears on the Mac's localhost at the same number, except ports below 1024 other than 80 and 443, and ports Mac services usually hold, such as 5432 and 6379. --no-forward turns it off.

mvz wait dev returns when that setup has finished. Your own #cloud-config goes in --user-data <file> and runs after MacVisor's. See What cloud-init sets up.

Work in the VM from your Mac

mvz shell dev                  # a shell over the MacVisor Agent, no network setup
mvz ssh-config --install       # once; then:
ssh dev.mvz                    # plain ssh, scp and VS Code Remote-SSH by name
curl http://dev.mvz:8080       # reach the guest directly by name

--home shares your home folder read-only at the same path in the guest. Share a project folder read-write with mvz shares dev add ~/src/app, or in VM Settings → Shared Folders. Shares mount at the Mac's own path, so mvz shell opens in the folder you're in on the Mac when that folder is shared. See Shared folders.

Containers and Kubernetes, when you want them

A VM gets no container runtime unless you choose one. That keeps a plain dev box plain.

mvz create ubuntu web --runtime docker
mvz start web --headless && mvz wait web
docker --context macvisor-web ps

mvz create ubuntu k8s --runtime k3s --memory 8
mvz kubeconfig k8s --save --start

--runtime takes containerd, docker, podman, k3s or none. A Docker or Podman VM's API is forwarded to the Mac while it runs, and mvz create makes the macvisor-<vm> docker context when docker is installed. Only one running k3s VM can hold 127.0.0.1:6443. Not every distribution runs every runtime: see Runtimes by distribution.

Ubuntu Desktop

For an Ubuntu image, the New VM form offers Install Ubuntu Desktop. The first boot then installs GNOME (about 1 GB, 10 to 20 minutes longer) and signs your account in to it. The VM gets 6 GiB of memory, and its resolution follows the window. It's in the app only, and only for Ubuntu. See Ubuntu Desktop.

Other distributions and your own images

  • An ISO. Choose Linux → Installer ISO, or run mvz create ~/Downloads/distro-arm64.iso mylinux --os linux, and install in the VM's window. Kali Linux installs this way. Keep the default 512-byte sectors: Debian's and Kali's installers fail on 4 KB ones. Then install the guest tools.
  • Your own image. mvz images add ~/Downloads/custom.qcow2 turns a qcow2, raw or .xz image into a template. Images made for cloud-init are set up like catalogue ones.
  • A registry image. mvz create ghcr.io/cirruslabs/ubuntu:latest u1 pulls Tart's Ubuntu image and makes a VM from it. See Registry images.
  • An appliance, such as a router or firewall image, boots as it is with --no-cloud-init. See Appliances.

Networks

Cloud-image VMs join the Default MacVisor Network, where they reach each other and the internet through the Mac. Inside the guest, host.mvz.internal is the Mac. For a lab, make custom networks with DHCP reservations, a firewall per network, host-only isolation or bridging to your LAN, and put a VM on one with --network <name>. The network lab page walks through it.

Limits

  • ARM64 guests only. MacVisor doesn't emulate x86, so x86 images don't boot. Rosetta covers x86-64 programs inside an ARM64 guest.
  • Nested virtualization needs an M3 or later. On M1 and M2, the guest can't run KVM.
  • No GPU acceleration for Linux guests. A desktop draws with the Mac's CPU.
  • Linux disks only grow. mvz set dev --disk 128 grows one, and the filesystem follows at the next boot.

When MacVisor isn't the right choice

If you only need containers, a container tool such as OrbStack or Docker Desktop is lighter than a full VM. If you need an x86 Linux system, use an emulator such as UTM, which runs QEMU, or an x86 machine. If you want a free, open-source command-line tool for Linux VMs, Lima and Multipass do that well. MacVisor fits when you want Linux VMs alongside macOS and Windows VMs, managed as infrastructure: a background service, snapshots, backups, networks with a firewall, and the mvz CLI with JSON output. See MacVisor compared.

Every single-Mac feature is in every license. Try MacVisor free for 30 days, then keep it with a one-time Pro license (pricing).

FAQ

Common questions

More in the documentation and known limitations.

How do I run a Linux VM on an Apple Silicon Mac?

Install MacVisor and run mvz create ubuntu dev, or choose Linux, then Cloud Image, in the New VM form. MacVisor downloads the ARM64 cloud image once, verifies it, and sets the VM up with your account and SSH keys on its first boot. Then mvz shell dev opens a shell in it.

Which Linux distributions does MacVisor support?

The catalogue has Ubuntu 26.04 and 24.04, Debian 13 and 12, Fedora 44 and 43, Rocky Linux 10 and 9, AlmaLinux 10 and 9, Oracle Linux 10 and 9, CentOS Stream 10, openSUSE Leap 16.1 and Alpine 3.24. Any other ARM64 distribution installs from its ISO, and you can add your own qcow2 or raw images.

Can I run x86-64 Linux on an M-series Mac with MacVisor?

Not as a whole system. MacVisor uses Apple's Virtualization framework and doesn't emulate x86, so the guest must be ARM64. Inside an ARM64 Linux guest, Rosetta runs x86-64 Linux programs when Rosetta is installed on the Mac.

Does a Linux VM need a password?

No. The account has your Mac user name and no password, and you sign in with your SSH keys through mvz shell, ssh <vm>.mvz or Open in Terminal. Ubuntu Desktop VMs are the exception, with a password for the lock screen and admin prompts.

Does MacVisor include Docker or Kubernetes?

Only if you ask. Pass --runtime docker, podman, containerd or k3s to mvz create, or pick one under Containers in the New VM form, and cloud-init installs it on the first boot. A Docker or Podman VM's API is forwarded to the Mac as the docker context macvisor-<vm>.

Can a Linux VM run KVM inside it?

Yes, on an M3 or later Mac. Nested virtualization is on by default there, so the guest can run KVM. M1 and M2 Macs don't support it.

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.