How to run MAC OS VM under KVM /qemu

From vpsget wiki
Revision as of 13:54, 19 August 2020 by Ndi (talk | contribs)
Jump to: navigation, search

//DRAFT We will show how to runMAC OS Virtual Machine under KVM /native qemu / This is only in educational purposes.

We are using Cenots 8 OS . BUt this should also work for Cnetos7 (even easier as you can easily download dmg2img rpm for centos7 /rhel7 but at this moment you may only build it from sources for centos 8) For ubuntu there will be some differences but the overall process is similar.

First of all you need to build your qemu from sources. Even if you have qemu/libvirt already installed our custom build should not conflict with it.

Check qemu module:

lsmod | grep kvm

if not listed add:

modprobe kvm

If you installing on environment that already using qemu/libvirt yo uneed to know where is qemu located in order to do not affect it:

whereis qemu
qemu: /usr/share/qemu

OK go to /opt and download qemu sources:

git clone git://git.qemu-project.org/qemu.git
cd qemu
git submodule init
git submodule update --recursive
git submodule status --recursive
git checkout stable-4.2  #or check what stable version exist at this time

Make sure you enabled APPLESMC in Makefile. Add if not exists the next records in Makefile :

# Makefile for QEMU. 
CONFIG_NE2000_ISA=y
CONFIG_HPET=y
CONFIG_APPLESMC=y

You may also check all APPLE related settings like with search:

grep "APPLE" -r .

Install gcc if not exists:

yum install gcc

..And dev tools if not installed:

yum groupinstall "Development Tools" 

Add depencies:

yum install glib2-devel  glibc-utils zlib zlib-devel pixman-devel


OK next configure to build qemu to custom binary

./configure --prefix=/usr/bin/qemundi 
 # no need: Not sure it need but I've created the target build dir: 
 # mkdir /usr/bin/qemundi
make

Next make install:

make install

OK your custom qemu build shoiuld be located at /usr/bin/qemundi/.. Check version:

/usr/bin/qemundi/bin/qemu-system-x86_64 --version
 QEMU emulator version 4.2.50 (v4.2.0-2711-g29e0855c5a-dirty)
 Copyright (c) 2003-2020 Fabrice Bellard and the QEMU Project developers

Next we will prepare MAC OS.

cd /opt
git clone https://github.com/kholia/OSX-KVM.git
cd OSX-KVM

Refer to the git README for actual steps https://github.com/kholia/OSX-KVM However we will show our way here.

fetch installer:

./fetch-macOS.py
#if you got error like /usr/bin/env no such file or directory most likely you have only python3 installed then try: 
# python3 fetch-macOS.py 
# or install python2

Select the MACOS version desired:

 #    ProductID    Version    Build   Post Date  Title
 1    061-26578    10.14.5  18F2059  2019-10-14  macOS Mojave
 2    061-26589    10.14.6   18G103  2019-10-14  macOS Mojave
 3    041-91758    10.13.6    17G66  2019-10-19  macOS High Sierra
 4    041-88800    10.14.4  18E2034  2019-10-23  macOS Mojave
 5    041-90855    10.13.5   17F66a  2019-10-23  Install macOS High Sierra Beta
 6    061-86291    10.15.3  19D2064  2020-03-23  macOS Catalina
 7    001-04366    10.15.4  19E2269  2020-05-04  macOS Catalina
 8    001-15219    10.15.5  19F2200  2020-06-15  macOS Catalina
 9    061-94403    10.15.6    19G73  2020-07-15  macOS Catalina
10    001-36735    10.15.6  19G2006  2020-08-06  macOS Catalina
11    001-36801    10.15.6  19G2021  2020-08-12  macOS Catalina 
Choose a product to download (1-11): 

Choose 11 for example and it will download neccesary binaries.

Next you need to convert dmg to img with dmg2img tool which currently have no rpm/binaries for centos 8 so we will git clone it from sources and build. BUT you may give a try to use qemu-img utility if your qemu version is higher than 4.11:

qemu-img convert BaseSystem.dmg -O raw BaseSystem.img

In case of no luck try to use dmg2img Install depencies:

yum install bzip2-devel openssl-devel


cd /opt
git clone https://github.com/Lekensteyn/dmg2img.git
cd dmg2img
make
make install
dmg2img -v
  dmg2img v1.6.5 (c) vu1tur (to@vu1tur.eu.org)

Go to OSX-KVM dir and convert dmg to img:

cd /opt/OSX-KVM
dmg2img BaseSystem.dmg BaseSystem.img

Create a virtual HDD image where macOS will be installed. If you change the name of the disk image from mac_hdd.img to something else, the boot scripts will need updating to point to the new image name.

qemu-img create -f qcow2 mac_hdd_ng.img 128G

Check if libvirtd service is run and usual qemu from repositiries is installed:

systemctl enable libvirtd
systemctl start libvirtd
systemctl status libvirtd

Setup quick networking by running the following commands.

#you may add these lined into your  /etc/rc.local to apply  this net after reboot.
sudo ip tuntap add dev tap0 mode tap
sudo ip link set tap0 up promisc on
sudo ip link set dev virbr0 up
sudo ip link set dev tap0 master virbr0

Note: If virbr0 network interface is not present on your system try enabling it by using the following commands,

virsh net-start default
virsh net-autostart default
#If virsh is not installed  - install it as well as qemu/libvirt from repositories. Our qemu build should not conflict with any existing as we build it into separate custom named folder.

Now you can install MACOS. You need to run the boot-macOS-Catalina.sh script to start the installation process. But first edit it a little.

#./boot-macOS-Catalina.sh

You need to change the qemu-system-x86_64 to our recently builded qemu . change it in boot-macOS-Catalina.sh

qemu-system-x86_64 ->  /usr/bin/qemundi/bin/qemu-system-x86_64

If you are running on some dedicated server without GUI you need to edit this script and add vnc option. Edit the boot-macOS-Catalina lines near to the end:

     -monitor stdio \
     -vga std \
     -vnc <your_public_server_ip>:<desired>,password \
     -k en-us

Remember to allow the port on firewall Also most likely you need to copy OVMF_VARS-1024x768.fd to backup folder under OSX-KVM folder (as it configured in boot-macOS-Catalina.sh):

cp OVMF_VARS-1024x768.fd backup/

Ensure that ignore_msrs is enabled:

echo 1 > /sys/module/kvm/parameters/ignore_msrs

OK run now:

 ./boot-macOS-Catalina.sh

You will got into qemu console. SO you may run also this script under screen and detach later.


  1. mkdir build
  2. cd build
  3. ../configure
  4. make