macOS is a proprietary graphical operating systems developed by Apple Inc. since 2001. It is the primary OS for Apple’s Mac computers. It is the second most widely used desktop OS, after Microsoft Windows. In this article, we’ll look at how you can run or install macOS on QEMU, accelerated by KVM.

For this setup, we’ll use the macOS-Simple-KVM project code available in Github to run macOS on KVM / QEMU. For you to be able to run macOS on QEMU / KVM, you need a Linux system with qemu, python3, pip and the KVM modules enabled.

Step 1: Environment preparation

Let’s begin by ensuring we have the dependencies installed and service required to run macOS on KVM working.

Ubuntu / Debian based Linux:

sudo apt update
sudo apt -y install qemu-kvm libvirt-daemon qemu-system qemu-utils python3 python3-pip bridge-utils virtinst libvirt-daemon-system virt-manager

Ensure the vhost_net module is loaded and enabled.

$ sudo modprobe vhost_net 
$ lsmod | grep vhost
vhost_net              24576  0
tun                    49152  1 vhost_net
vhost                  49152  1 vhost_net
tap                    28672  1 vhost_net

$ echo vhost_net | sudo teaa -a /etc/modules 

Fedora Linux:

sudo dnf -y install git bridge-utils libvirt virt-install qemu-kvm qemu qemu-img python3 python3-pip virt-manager

Start KVM:

sudo systemctl start libvirtd
sudo systemctl enable libvirtd
sudo dnf -y install virt-manager

After installation, verify that Kernel modules are loaded

$ lsmod | grep kvm
kvm_intel 233472 0
kvm 737280 1 kvm_intel

I recommend you configure virt-manager as a non-root user so you can use it for other purposes without sudo.

Arch Linux / Manjaro:

sudo pacman -S qemu virt-manager virt-viewer dnsmasq vde2 bridge-utils openbsd-netcat python python-pip ebtables iptables

Once the installation is done, start and enable libvirtd service to start at boot:

sudo systemctl enable libvirtd.service
sudo systemctl start  libvirtd.service

Step 2: Download installation media for macOS

Make sure you have git installed.

--- Ubuntu / Debian ---
$ sudo apt -y install git

--- Fedora ---
$ sudo dnf -y install git

Then clone the project code on github.

git clone https://github.com/foxlet/macOS-Simple-KVM.git

Change to the downloaded directory.

cd macOS-Simple-KVM

Run the installer script to download installation media for macOS (internet required).

./jumpstart.sh --catalina

The default installation uses Catalina, but you can choose which version to get by adding either –high-sierra, –mojave, or –catalina.

Sample installation output:

........
dmg2img v1.6.7 (c) vu1tur ([email protected])

/var/home/jkmutai/Downloads/macos/macOS-Simple-KVM/tools/FetchMacOS/BaseSystem/BaseSystem.dmg --> /var/home/jkmutai/Downloads/macos/macOS-Simple-KVM/BaseSystem.img


decompressing:
opening partition 0 ...             100.00%  ok
opening partition 1 ...             100.00%  ok
opening partition 2 ...             100.00%  ok
opening partition 3 ...             100.00%  ok
opening partition 4 ...             100.00%  ok
opening partition 5 ...             100.00%  ok
opening partition 6 ...             100.00%  ok
opening partition 7 ...             100.00%  ok

Archive successfully decompressed as /var/home/jkmutai/Downloads/macos/macOS-Simple-KVM/BaseSystem.img

The directory will contents like this:

$ ls -l
total 2.1G
-rw-------. 1 jkmutai jkmutai 2.0G Mar 20 17:15 BaseSystem.img
-rwx------. 1 jkmutai jkmutai 1.1K Mar 20 17:10 basic.sh
drwx------. 2 jkmutai jkmutai 4.0K Mar 20 17:10 docs
-rw-------. 1 jkmutai jkmutai  13M Mar 20 17:10 ESP.qcow2
drwx------. 2 jkmutai jkmutai 4.0K Mar 20 17:10 firmware
-rwx------. 1 jkmutai jkmutai 1.5K Mar 20 17:10 headless.sh
-rwx------. 1 jkmutai jkmutai  874 Mar 20 17:10 jumpstart.sh
-rwx------. 1 jkmutai jkmutai  732 Mar 20 17:10 make.sh
-rw-------. 1 jkmutai jkmutai 3.0K Mar 20 17:10 README.md
drwx------. 4 jkmutai jkmutai 4.0K Mar 20 17:10 tools
-rwx------. 1 jkmutai jkmutai  946 Mar 20 17:10 virtio.sh

Step 3: Start machine and install macOS

We need to create an empty hard disk for macOS system using qemu-img.

$ qemu-img create -f qcow2 macOS.qcow2 50G
Formatting 'macOS.qcow2', fmt=qcow2 size=53687091200 cluster_size=65536 lazy_refcounts=off refcount_bits=16

Modify the basic.sh file and add below lines to the end.

-drive id=SystemDisk,if=none,file=macOS.qcow2 \
-device ide-hd,bus=sata.4,drive=SystemDisk \

We can now run the command:

./basic.sh 

Click on macOS icon to install macOS Base System.

install macos on qemu kvm 01

The installer will start in a few seconds.

install macos on qemu kvm 02

Select “Disk Utility” in the next screen.

install macos on qemu kvm 03

Format the disk you had created for installing macOS base system.

install macos on qemu kvm 04

The disk should show size and partition type after formating.

install macos on qemu kvm 05

Close Disk utility and choose “Reinstall macOS“.

install macos on qemu kvm 06

Confirm OS installation by hitting the “Continue” button.

install macos on qemu kvm 07

Select the disk partitioned previously.

install macos on qemu kvm 08

Be patient as the installation starts – it may take a long time depending on the internet speed.

install macos on qemu kvm 09

Step 4: Import the setup into Virt-Manager

Instead of QEMU, you’d like to import the setup into Virt-Manager for further configuration, just run:

sudo ./make.sh --add

After running the command above, add macOS.qcow2 as storage in the properties of the newly added entry for VM.

To fine-tune the system and improve performance, read the projects docs for more information. Here are the direct links.

We will be uploading more content on macOS and its administration. Check more guides to check out.

Run Ansible Playbook with Vagrant up

How To Optimize Linux System Performance with tuned-adm

Best Linux Books for Beginners & Experts

Install / Run Fedora CoreOS (FCOS) on KVM / OpenStack

Your support is our everlasting motivation,
that cup of coffee is what keeps us going!


As we continue to grow, we would wish to reach and impact more people who visit and take advantage of the guides we have on our blog. This is a big task for us and we are so far extremely grateful for the kind people who have shown amazing support for our work over the time we have been online.

Thank You for your support as we work to give you the best of guides and articles. Click below to buy us a coffee.

15 COMMENTS

  1. thanks for the time and effort in the project. when i get to install mac os step , the block for choosing the installation media drive it says.. “this drive is locked”. where have i gone wrong? thanks again

  2. Hello, thank you for the great tutorial. I’ve used it many times but I haven’t had any luck adding the setup into Virtual Manager. Is there any way you can elaborate a bit more on the procedure? After creating the make.sh and going into Virt-Man I do see the entry KVM MacOS and get lost at that point. When I click Play it doesn’t go to the MacOs I just installed. It goes straight into the INSTALL macos again. I’m trying to get my idevices recognized on MacOS and there’s no way to get USB passthrough unless I get this setup into the Virt-Man to enable the USB redirect. Appreciate the help. Thank you kindly.

  3. when i run the command ./basic.sh it says
    qemu-system-x86_64: -drive: requires an argument
    ./basic.sh: line 29: -device: command not found

  4. For anyone confused on how to get from running ./basic.sh to the graphical installer, you need to open a vnc viewer and connect to localhost on port 5900

  5. When I type ./basic.sh it says this: Could not access KVM kernel module: Permission denied
    failed to initialize KVM: Permission denied please help

  6. Hello and thanks for sharing this tutorial. I’d like to say that I made MacOS X Catalina work pretty easily over Elementary OS 5.1.7 Hera. Actually, the main downside is that I experience a notable lag in general when using the system. I’m not a dev, but it seems that is related to graphics. Do you have any idea about that or it’s just the way Mac Os work over a virtual machine? Thanks!

    • You need to passthrough a GPU to get acceleration to work. There is a link at the bottom of the article for it, or I’m sure Simple-KVM’s github documentation covers it. If not, reddit and other threads will most likely be able to help you too on their VT threads.

      I’m gonna setup my dads machine as a VM (Arch distro > Simple-KVM MacOs Catalina). So I’ll be doing a GPU passthrough then, but I got a native GPU (Geforce 710 1GB) to avoid driver issues in Mac OS. Until then I’m of little help, but feel free to ask. I’ve set up multiple hackintoshes and one ran without any issues feeling like a true Mac

  7. After booting the OS by adding new disk as SAS from Virtual Machine manager. It is stuck at apple logo and a progress bar showing estimating time remaining from the past 2 hours.

  8. Thanks for this write-up. It worked like a champ for me. Now…..how do I share my host wireless printer to my new MacOS VM?

LEAVE A REPLY

Please enter your comment!
Please enter your name here