Installing macOS Catalina 10.15 on Proxmox 6.1 or 6.2 using OpenCore

This tutorial for installing macOS Catalina using OpenCore has been adapted for Proxmox from Kholia’s OSX-KVM project and Leoyzen’s OpenCore configuration for KVM. You can get the full sourcecode on my GitHub here.

If you’d like to use Clover instead, use my older tutorial, but OpenCore works better!


I’ll assume you already have Proxmox 6.1 or 6.2 installed. You also need a real Mac available in order to fetch the OSK key.

Your Proxmox host computer’s CPU must support SSE 4.2, so for Intel your CPU must be at least as new as Nehalem, which was the first CPU generation to bear the “Core” i5/i7 branding. Older CPUs will cause the finder to repeatedly crash after installation completes (with an Illegal Instruction exception in the graphics code).

Modern AMD CPUs also support SSE 4.2 and will work with this guide.

First step: Create an installation ISO

The easiest installer to build is a recovery image, which will download Catalina during installation. Download and run in a terminal to download the Catalina recovery image from the Apple software distribution server (this can be run on Linux, Proxmox, or on a Mac):

This results in a ~500MB “BaseSystem.dmg” file in the current directory. Convert that dmg into an “iso” like so if you’re building this on macOS:

hdiutil convert BaseSystem.dmg -format RdWr -o Catalina-installer.iso
mv Catalina-installer.iso.img Catalina-installer.iso

Or like so if you’re building this on Linux:

# Install the dmg2img package and...
dmg2img BaseSystem.dmg Catalina-installer.iso

# Or use qemu-img from the qemu-utils package to do it instead:
qemu-img convert BaseSystem.dmg -O raw Catalina-installer.iso

The result is actually a raw disk image, not a true ISO, but Proxmox has better tools for picking and re-using ISO images than disk images. Upload the “ISO” to your Proxmox server’s ISO store (typically /var/lib/vz/template/iso).

If you won’t have an Internet connection available to Catalina during installation, or your network can’t provide an IP address by DHCP you’ll need to build an offline installer instead. Building the offline installer requires you to have a Mac, here are the instructions.

Prepare an OpenCore image

We’ll be using OpenCore as a bootloader for Catalina. This has several improvements over my old Clover-based tutorial, like fixes to screen resolution problems, better CPU feature support, and better FileVault compatibility, and is recommended for all future builds.

Download the latest OpenCore.iso.gz release from my repository, unpack it, and upload it to Proxmox’s ISO store at /var/lib/vz/template/iso. Although it has a .iso file extension, this is actually a hard disk image.

Fetch the OSK authentication key

macOS checks that it is running on real Mac hardware, and refuses to boot on third-party hardware. You can get around this by reading an authentication key out of your real Mac hardware (the OSK key). Save the first block of C code from this page as smc_read.c. In a command prompt, change into the same directory as that file and run:

xcode-select --install # If you don't already have gcc
gcc -o smc_read smc_read.c -framework IOKit

It’ll print out the 64 character OSK for you. Make a note of it.

Every Mac uses the same OSK, so don’t be surprised that it doesn’t look like a random string!

Create the VM

From the Proxmox web UI, create a new virtual machine as shown below.

In the Options page for the VM, ensure that “use tablet for pointer” is set to “Yes”.

In the Hardware page for the VM, add a second DVD drive at IDE0, set it to use your Catalina-installer.iso.

Don’t try to start the VM just yet. First, SSH into your Proxmox server so we can make some edits to the configuration files.

Edit /etc/pve/qemu-server/YOUR-VM-ID-HERE.conf (with nano or vim). Add this line, being sure to substitute the OSK you extracted earlier into the right place:

args: -device isa-applesmc,osk="THE-OSK-YOU-EXTRACTED-GOES-HERE" -smbios type=2 -device usb-kbd,bus=ehci.0,port=2

(A USB keyboard is added here because macOS doesn’t support QEMU’s default PS/2 keyboard.) Ensure the args are all on a single line!

We also need to add a -cpu argument. If your host CPU is Intel, add this to the end of the “args” line:

-cpu host,kvm=on,vendor=GenuineIntel,+kvm_pv_unhalt,+kvm_pv_eoi,+hypervisor,+invtsc

This will pass through all of the features that your CPU supports. OpenCore’s config will pretend to macOS that the CPU’s model name is Penryn for compatibility.

If your host CPU is AMD, or the above argument doesn’t work for you, use this more-compatible alternative:

-cpu Penryn,kvm=on,vendor=GenuineIntel,+kvm_pv_unhalt,+kvm_pv_eoi,+hypervisor,+invtsc,+pcid,+ssse3,+sse4.2,+popcnt,+avx,+avx2,+aes,+fma,+fma4,+bmi1,+bmi2,+xsave,+xsaveopt,check

This pretends that your CPU is Penryn, which will keep macOS happy even if your host CPU is AMD, and adds a bunch of newer required and optional CPU features on top. Features that your host CPU doesn’t support will be ignored (a warning will be printed to the console during launch with qm start 1xx), but note that macOS won’t work without SSE4.2 support.

Now find the lines that define the two “ISOs” (ide0 and ide2), and remove the “,media=cdrom” part from them. Add “,cache=unsafe” in its place. This will treat these as hard disks rather than DVD drives.

Save your changes, return to the Options tab, and change the boot order to put IDE2 (the OpenCore image) first. Your final VM configuration file should resemble this:

args: -device isa-applesmc,osk="..." -smbios type=2 -device usb-kbd,bus=ehci.0,port=2 -cpu host,kvm=on,vendor=GenuineIntel,+kvm_pv_unhalt,+kvm_pv_eoi,+hypervisor,+invtsc
balloon: 0
bios: ovmf
bootdisk: ide2
cores: 4
cpu: Penryn
efidisk0: vms:vm-100-disk-1,size=1M
ide0: isos:iso/Catalina-installer.iso,cache=unsafe,size=2094688K
ide2: isos:iso/OpenCore.iso,cache=unsafe,size=150M
machine: q35
memory: 4096
name: catalina
net0: vmxnet3=...,bridge=vmbr0,firewall=1
numa: 0
ostype: other
sata0: vms:vm-100-disk-0,cache=unsafe,discard=on,size=64G,ssd=1
scsihw: virtio-scsi-pci
smbios1: uuid=...
sockets: 1
vga: vmware

Configure Proxmox

On Proxmox, run “echo 1 > /sys/module/kvm/parameters/ignore_msrs” to avoid a bootloop during macOS boot. To make this change persist across Proxmox reboots, run:

echo "options kvm ignore_msrs=Y" >> /etc/modprobe.d/kvm.conf && update-initramfs -k all -u

Unlike Clover, OpenCore doesn’t require Proxmox’s OVMF package to be patched, so if you had previously installed my pve-edk2-firmware package, and you don’t have any Clover VMs left, you can revert to the vanilla Proxmox package by running “apt-mark unhold pve-edk2-firmware; apt install pve-edk2-firmware”. If you still have Clover VMs that need it, you can continue to use my patched package, it’ll work too.

Install Catalina

Now start up your VM, it should boot to the OpenCore boot picker:

OpenCore “OpenCanopy” boot menu

Press enter to boot the “macOS Base System” entry and the installer should appear.

Our virtual hard drive needs to be erased/formatted before we can install to it, so select the Disk Utility option. Follow the steps below to format the disk:

Now we’re ready to begin installation!

After the first stage of installation, the VM will reboot. Pick the “macOS Installer” entry to continue installation:

The VM will finish installation and reboot itself a second time. Now the installation is complete, so choose the name of your main disk to boot (mine’s called Main):

Answer the initial install questions, and you’ll be logged on! (Note that you’ll want to hold off on logging into your iCloud account until you’ve configured your SMBIOS to your liking)

It works!

Make the OpenCore install permanent

We’re currently booting using OpenCore from the attached OpenCore ISO. Let’s install that to the hard drive instead. Pop open Terminal and run “diskutil list” to see what drives we have available.

Use “sudo dd if=<source> of=<dest>” to copy the “EFI” partition from the OpenCore CD and overwrite the EFI partition on the hard disk. The OpenCore CD is the small disk (~150MB) that only has an EFI partition on it, and the main hard disk is the one with the large Apple_APFS “Container” partition on it.

In my case these EFI partitions ended up being called disk1s1 and disk2s1 respectively, so I ran “sudo dd if=/dev/disk1s1 of=/dev/disk2s1” (note that if you get these names wrong, you will overwrite the wrong disk and you’ll have to start the installation over again!).

Now shut down the VM, and remove both the OpenCore and the Catalina installer drives from the Hardware tab. On the Options tab, edit the boot order to place your SATA disk as the first disk. Boot up. If everything went well, you should see the OpenCore boot menu, and you can select your “Main” disk to boot Catalina:

Sleep management

I found that I was unable to wake Catalina from sleep using my mouse or keyboard. If you encounter the same problem, you can either disable system sleep in Catalina’s Energy Saver settings to avoid the issue, or you can manually wake the VM up from sleep from Proxmox by running:

qm monitor YOUR-VM-ID-HERE 

Editing your OpenCore/EFI settings

The Configuration.pdf that explains the OpenCore config.plist file can be found along with the OpenCore release on my GitHub.

To mount your EFI partition in macOS so you can edit config.plist, first check the “identifier” of your EFI partition in the terminal:

~$ diskutil list
/dev/disk0 (external, physical):
   #:                   TYPE NAME              SIZE       IDENTIFIER
   0:  GUID_partition_scheme                  *512.1 GB   disk0
   1:                    EFI EFI               209.7 MB   disk0s1
   2:             Apple_APFS Container disk1   511.9 GB   disk0s2

Then you can mount it like so:

sudo mkdir /Volumes/EFI
sudo mount -t msdos /dev/disk0s1 /Volumes/EFI

Now you can edit /Volumes/EFI/OC/config.plist with your favourite text editor to make your changes. (TextEdit is not a great choice because it likes to insert curly quotes into the file and otherwise break things, there are some dedicated plist editors available such as XCode).

If you’re unable to boot macOS, you can edit the config.plist using the “UEFI Shell” option in the OpenCore boot menu instead.

Enter “FS0:” and press enter to open up the first available filesystem, then run “edit EFI\OC\config.plist” (if the file isn’t found, try switching to another filesystem like fs1:). When you’re done editing, press control+Q to exit, “Y” to save, then run “exit” to return to the OpenCore menu. You need to reboot for your changes to take effect.

Automatic boot

In config.plist, set Misc/Boot/Timeout to a non-zero value to allow the default boot option be chosen automatically after that delay in seconds. I’ve disabled this by default because it causes the installer ISO to re-enter its main menu instead of continuing the second stage of installation.

Verbose boot

To boot macOS in Verbose mode to diagnose boot problems, edit config.plist to change the “bootargs” in the NVRam section from “keepsyms=1” to “keepsyms=1 -v”.

Changing screen resolution

To change macOS’ screen resolution, you need to edit the UEFI/Output/Resolution setting in config.plist, the default is 1920×1080@32.

You should be able to change this to any of the modes that the system OVMF menu offers (hit F2 at the start of guest boot and choose “Device Manager/OVMF Platform Configuration” to see which resolutions are available).

Video performance

Because there is no guest video acceleration available for macOS, video performance is poor.

In Google Chrome in the guest you will need to toggle off the setting to “use hardware acceleration when available” to improve issues with elements not being drawn or flickering (especially video). Safari may be a better choice.

macOS’s built in “Screen Sharing” feature offers dramatically better framerates and latency than Proxmox’s browser-based VNC console, so if you have a real Mac to act as a viewing console, you can enable that in the VM’s “Sharing” settings and connect to the VM using the Screen Sharing app from your Mac instead:

Apparently Screen Sharing is also compatible with VNC clients like RealVNC, so you should be able to connect to it from Linux or Windows consoles using RealVNC.

The real magic bullet for video performance is to pass through a compatible video card using PCIe passthrough (though note that Catalina does not support most NVidia cards). This offers near-native performance. You can read more about how I’m using PCIe passthrough on my own installation here.

USB passthrough

Since I want to use this as my primary computer, I want to use a USB keyboard and mouse plugged directly into Proxmox, rather than sending my input through the web VNC console.

Proxmox has good documentation for USB passthrough. Basically, run “qm monitor YOUR-VM-ID-HERE”, then “info usbhost” to get a list of the USB devices connected to Proxmox:

qm> info usbhost
Bus 3, Addr 12, Port 6, Speed 480 Mb/s
Class 00: USB device 8564:1000, Mass Storage Device
Bus 3, Addr 11, Port 5.4, Speed 12 Mb/s
Class 00: USB device 04d9:0141, USB Keyboard
Bus 3, Addr 10, Port 5.1.2, Speed 12 Mb/s
Class 00: USB device 046d:c52b, USB Receiver
Bus 3, Addr 9, Port 14.4, Speed 12 Mb/s
Class 00: USB device 046d:c227, G15 GamePanel LCD
Bus 3, Addr 8, Port 14.1, Speed 1.5 Mb/s
Class 00: USB device 046d:c226, G15 Gaming Keyboard

In this case I can add my keyboard and mouse to USB passthrough by quitting qm, then running:

qm set YOUR-VM-ID-HERE -usb1 host=04d9:0141
qm set YOUR-VM-ID-HERE -usb2 host=046d:c52b

This saves the devices to the VM configuration for you. You need to reboot to have the new settings apply. Note that the emulated USB3 device doesn’t work with macOS, so don’t set “usb3=1”.

You can also pass through USB devices by passing through an entire USB controller using Proxmox’s PCIe passthrough feature, which gives much better compatibility.


FileVault login prompt

FileVault now works with OpenCore, so you can encrypt your boot disk by using the option in macOS’ system security preferences. But be certain to keep a copy of your recovery key and keep your backups up to date.

Using an odd number of CPU cores

macOS doesn’t like it if your CPU has a weird number of cores, like 3 or 6. You can fix this on the Hardware tab. Edit the Processors settings, and tick the Advanced box. Round up the number of cores you want (e.g. 3) to a nice power of two (4, 8, 16, etc) and use that for the “Cores” setting, but set the “VCPUs” setting to the number of cores you actually want to be used (3), like so:

This will cause macOS to see that system supports a maximum of 4 cores, but that one core is absent since it hasn’t been hotplugged yet, so macOS will only use 3 cores.

Another approach is to use an odd number of sockets in order to make the core count a power of two. e.g. to pass 6 cores, set Sockets to 3, and Cores to 2 (or 4 to pass both threads per core).

Proxmox doesn’t let us set the number of threads per core in the VM config, so if you want to pass every thread of a hyperthreaded 6-core CPU, and have them reported to the guest as hyperthreads, add -smp 12,sockets=3,cores=2,threads=2 to your “args”, or for a 56-core hyperthreaded CPU, -smp 112,sockets=7,cores=8,threads=2.

Nested emulation

If your host CPU is Intel, and you used “-cpu host” in your VM config file (explained above), you can use Nested Virtualisation in macOS. This allows you to run VirtualBox VMs, the Android emulator, or Docker inside your macOS guest. You just need to tweak your Proxmox system config to enable this as explained in the Wiki:

macOS’s Hypervisor framework doesn’t support nested virtualisation on AMD host CPUs, but apparently VirtualBox uses their own virtual machine driver which does work (I haven’t tried this myself). I imagine this will stop working in the next version of macOS, since they’re planning to add a bunch of restrictions on third-party kexts and might force VirtualBox to use Hypervisor.framework.

Getting iMessage and FaceTime to work

Unlike the App Store and iCloud, these Apple services actually pay attention to your Mac’s serial number.

Following this guide should get these working for you:

I had already generated a serial number for my Mac (when I check the Support Status for it, it says “We’re sorry, but this serial number isn’t valid. Please check your information and try again”) and added it to my OpenCore config, so all I had to do on top of that was use Hackintool to help me mark my Ethernet adapter en0 as built-in. FaceTime then worked immediately. I didn’t need to follow the rest of the guide.

Fixing “guest boots to UEFI shell”

If your guest ends up booting to the UEFI shell instead of showing the OpenCore boot menu, especially if you’ve just updated OpenCore to a new version, you’ll need to edit the guest’s UEFI boot entries to fix this.

At the very start of guest boot, hit F2 to enter guest UEFI settings.

First we’ll remove the old entries. Choose the Boot Maintenance option, then Boot Options -> Delete Boot Option. Use the spacebar to tick any old Clover or OpenCore entries (avoid ticking the EFI Internal Shell option, you want to keep that!). Select “Commit Changes and Exit”.

Now we’ll add the correct entry for OpenCore back in. Select Add Boot Option. Navigate through the device tree to EFI/BOOT/BOOTx64.efi and select it, name this new option “OpenCore” or similar. Again Commit Changes and Exit.

Go to the Change Boot Order and move OpenCore to the top. Commit Changes and Exit.

Now back out to the main menu and choose Reset, and you should successfully boot into OpenCore this time.

454 thoughts on “Installing macOS Catalina 10.15 on Proxmox 6.1 or 6.2 using OpenCore”

  1. Followed your excellent tutorial and got up to opening up disk utilities to erase and format however when trying to change the disk name the keyboard is unresponsive. Any suggestions? Thanks in advance.

    1. If the USB keyboard argument is definitely not missing from the end of your args, try switching away from the Console tab and switching back, sometimes the VNC’s input dies.

  2. Hello, thank you very much for your excellent work. With your guide I got a proxmox-Server running on a Ryzen Threadripper. I just started with Proxmox VE and I think that I still have to learn a lot. These are my most urgent Problems:
    1. Passthrough of a Pcie 4-port usb-card crashes always the server.
    2. Same Problem with rme-audio interface card.
    3. I don’t know if the passthrough of the built-in Network adapter (I211) us possible.
    I would like to have at same time Catalina running full screen as gpu passtrough (Works fine) and Win 10 running in a browser window, one server on same PC, but I don’t now how to do it and if its even possible.

    1. You’re going to have to double check your IOMMU groups and make sure other critical host hardware isn’t being grouped with the things you’re passing. e.g. if your USB controller is grouped with the host’s SATA controller then the host will be unable to read its disk any more when the VM starts and it’ll freeze.

    2. This could have nothing to do with the Operating System at all, but I did want to point this out. There is not a single Mac out there with PCIE 4.0. The reason is because Intel doesn’t support it. Make sure you are not trying to passthrough any PCIE 4.0 slots, that could be your problem.

      1. The guest only sees the emulated PCIe slot, so the technology available on the host shouldn’t be visible.

  3. Apple Remote Desktop comes with excess baggage and with only marginally better performance for basic use.

    Your recommendation for a straightforward (noob remember) VNC client okay for macOS?

    And I cannot thank you enough for your well done how-tos.

    1. The main performance advantage comes from the server side, MacOS’s screen sharing feature can know which region of the screen has been updated from the OS’s own redraw queues. QEMU’s VNC server has no idea what has changed and has to diff the whole screen on each frame to find out. On the client side a dedicated VNC client can do much better too, since the browser based client is stuck running everything through the JavaScript virtual machine.

      The net result is that switching both sides of the link away from Proxmox’s stock setup more than doubles the framerate on fast links, and does even better on slow links since it seems to be able to switch to more lossy compression for fast updating scenes.

      The last time I used a different VNC client was about 10 years ago, so I don’t have one to recommend.

  4. I’m having hell passing through the USB controller (NEC uPD720201). It shows up in PCI devices via hackintool but it’s not working. I’ve tried every combination of kexts I can find and hacked through various things but I can’t seem to get it. I feel I’m missing something fundamental on how this works.

    On the plus side, my ubuntu VM sees and uses the card no problem.

    You got any pointers? I’ve tried to install the mXHCD.kext both into clover EFI partition and into the Library/Extensions.

    1. From this post it sounds like macOS doesn’t have built-in support for this card:

      Their strategy is to change the vendor/product ID on the card to match one of the ones where third-party vendors provide macOS drivers, and then use the third-party drivers. However, the drivers linked there are too old to be usable on Catalina, from what I can see. Even the GenericUSBXHCI driver mentioned seems to only be supported up to 10.10:

      Which Clover EFI directory did you put mXHCD.kext into?

      I found this installer for mXHCD too, but haven’t tried it:

  5. Well I spoke to soon. I have injectall and the genericusbxhci. I’m getting some USB functions to work. Keyboard and mouse work. Hotplugging a thumb drive is sketch at best. The USB bluetooth is not recognized.

    I’m trying to go through the process of mapping the ports so I can remove the injectall – hackintool is not reporting any of them in green/active even as the mouse is working in one of those USB ports.

    Note – I’m using OpenCore per your HowTo so I’ve got my kexts in EFI/OC/Kexts

    1. Yeah that mXHCD breaks all the things. The unsupported works for KB and mouse but apparently only with injectall.

      I’m missing something..

      If you look at the very last post

      You can see someone reporting a similar chipset working with that kext. I have a feeling if I could figure out the mapping I might make some progress on stability/usability.

      Bluetooth dongle is visible but it won’t turn on (it’s macos native driver) and hackintool shows FW Loaded as unchecked. Weird stuff happening.

        1. Yeah it’s loading. The ports are working now, but I’m struggling with the IORegistryExplorer and creating my USBMap.kext.

          The dortania instructions have a tool that does the mapping – which doesn’t work with the GenericUSBXHCI’s naming (???). I think hackintool has similar issues which is why it’s not working. I’m going to have to figure out what vales from the IORegistryExplorer tool go into the plist. I need to spend some time with the instructions on how to build the map manually. I joined the r/Hackintosh discord but they might not be kvm friendly.

        2. I just bought a PCIe USB3 card with native MacOS support. $20 and solved the problem.

          I noticed from your walkthroughs that you didn’t the host setup to swap to the onboard video after boot, right? The machine with POST with the PCIe graphics card output and then it will go to a blinking cursor. The onboard video never fires up. I assume this is the BIOS telling the onboard to shut off when it detects the PCI. And then linux gets told to isolate the card and can’t/doesn’t know to switch video back to the on board. Is there a solution for this?

          I’d like to be able to plug into console on the proxmox host “just in case”. Like today when I couldn’t figure out why it didn’t show up on the network!

  6. Excellent tutorial, Nick, thanks a lot!

    I only have a “cosmetic” question:
    The boot volume has an “external drive” icon and also is identified as an external drive in “About This Mac > Storage”. Could you point me to a resource which describes how to change that into something that macOS identifies as an internal drive?

    Again, many thanks!

    1. I will be updating mostly to see if I can make a single image that can boot both. None of the new features really caught my eye though.

      1. Hi Nick,

        Did you have any luck getting a single OpenCore image for both Catalina (and below), and Big Sur?

        Also – I noticed in the Changelog – they seem to have added some things for earlier macOS versions as well? (10.6, 10.9).


            1. The results are variable as it is booting Catalina fine for me and Kholia, but I’ve had lots of reports from others that it doesn’t work.

  7. I used this to create a MacOS VM running Catalina on my proxmox 6.2 cluster. It works great, but one thing I noticed is that shutting the VM down via proxmox doesn’t work. My guess is that ACPI shutdown isn’t working properly for the VM. I noticed in this guy’s (albeit older) instructions using clover, he has a step for the q35 ACPI DS/DT blobs. Presumably to fix ACPI issues. That was specific to setting up Clover though. Do you happen to know if there’s anything similar for OpenCore? Or, have you noticed this issue yourself?

    1. This has always been the case for me across both Clover and OpenCore, it’s a little bit annoying. If you figure out a solution please let me know! I’m sure there just needs to be a small addition in some DSDT table or other.

      1. My patch to enable natively included with OSX Qemu Guest Agent got included in Proxmox VE. Just enable it in VM setting. It will make shutdown and IPs section to work, additionally it will allow make the `qm guest VMID ` to work fine.

    2. Yeah, ACPI shutdowns are not even supported by macOS at all. Even holding down the power button indefinetley on a real MacBook will still require a password to shutdown if the computer is locked. On my Razer Blade 15 I have to hold it down to do what is equivalent to a “stop” in proxmox, or go into the Apple menu and click shutdown. The only safe way to shut it down is through the Apple menu.

  8. Thank you for the awesome work!

    My installation hangs right after the second step. I boot the VM, format the drive, run the first part of the installer fine but on reboot after selecting macOS Installer the machine freezes. It hangs on the Apple logo and progress bar. The VM becomes unresponsive.

    Thank you!

    1. Double check your OSK is correct and that you didn’t accidentally download my OpenCore image for Big Sur (it can’t boot Catalina)

  9. Help! I’ve used both the Mojave and the Catalina installs on ProxMox. I can get both to install and boot correctly and used every other feature. But on both versions the News app (especially News+) is super slow… and I mean, unusably slow. I can’t figure it out. What am I missing?

    1. You have no video acceleration with the emulated video, so anything based around a Web browser will be super slow. You need a compatible passthrough GPU to get proper performance.

  10. Hi, I have been hackintoshing for a couple months now, and just decided to try a VM on my server. I was doing pretty well, got OpenCore to boot, got it to recognize the MacOS installer, then I get to the apple logo, then after a while a kernel panic. I went into a live installer of Linux to mount the EFI folder and go into the OpenCore config.plist and enable verboose. This here is my output:

    P.S. I did triple check that I followed all steps properly and had my friend triple check my work as well.

    1. There’s basically only two possible causes of a kernel panic at this point. Wrong OSK (double check your text editor didn’t mangle it by adding curly quotes or a copyright symbol) or your host CPU doesn’t support the required instruction sets.

      Those DMA errors you’re getting during boot are unusual, is your Catalina installer image stored on a read-only Proxmox storage maybe? If macOS is trying to write to it this might manifest as a DMA error to that device.

  11. im unable to passthrought my RX560 to macos.
    dont know why.. if I set virtual display to NONE. my monitor just simply goes black. noting happens.(connect using DP cable)
    but if I enable virtual display . that monitor will display the wallpaper of macOS. but just that . just wallpaper.
    after enabling verbose mode. the last line before it froze is “IOConsoleUsers: gIOScreenLockState 3”
    Mac model is macmini8,1

    1. When the virtual display is enabled the dedicated GPU will be a secondary monitor. You can drag windows left and right between the two monitors.

      You can designate a new primary monitor from the system Displays settings by dragging the menu bar in the monitor diagram to the other monitor.

      Try unplugging the monitor and plugging it back in, this sometimes cures the black screen.

      Another thing to try is to add agdpmod=pikera to your kernel args in your OpenCore config.plist

      1. after adding agdpmod=pikera to boot-args is still not working.
        BUT strangely. by follow the clover guide. i can install Mojave then passthrough my rx560 with 0 issue. it boot in to system flawlessly.

  12. Amazing as usual !
    Just to confirm
    Nvidia G710 , G730 Work native
    Radeon rx 580 Work native

    Wake up from sleep doesn’t work for me , so i disable sleep 😀

      1. How is the UI speed with GT710 versus the GT730? I’d like to have XCode move along faster than compared to running inside VMWare Workstation. But this is just a casual hobby and RX580 is out of my price range. Thanks!

        1. Hi Xilex , I’m using Xcode little bit .. but as I notice its working smoothly , Emulator working as expected ..

          GT710 & GT730 was identified as same device in my setup . So i don’t feel any different between them .. I bought my RX580 from taobao , same prices you will find it on aliexpress .. its not much high price .. believe me 😀

  13. Bless you. Thanks for all the hard work.

    For anyone new to the Hackintosh/ virtualizing Mac scene, the OSK is nothing special. I have heard tell of folks without access to an actual Mac simply Googling around to find the OSK, which is the same for all Macs. However, this might be illegal, so I would certainly never do such a thing…

  14. Hello sir, It’s me again (now posting on the correct thread).

    So I received my NVMes, a USB PCIe card, and an Airport with PCIe adapter. Last install was working ok, but I was runnin it on a test storage. This time I assembled everything and when trying to configure it, I get the “Your computer restarted because of a problem”, and I get a boot loop. Yes, I ran the echo commands, but still no success. 🙁

    And I don’t even know how to start debugging it.

    BTW: Still not passing through anything (only the NVMe, but even without it, I get bootloops).

    Here’s the conf file:
    args: -device isa-applesmc,osk=”our…Inc” -smbios type=2 -device usb-kbd,bus=ehci.0,port=2 -cpu Penryn,kvm=on,vendor=GenuineIntel,+kvm_pv_unhalt,+kvm_pv_eoi,+hypervisor,+invtsc,+pcid,+ssse3,+sse4.2,+popcnt,+avx,+avx2,+aes,+fma,+fma4,+bmi1,+bmi2,+xsave,+xsaveopt,check
    balloon: 0
    bios: ovmf
    bootdisk: ide2
    cores: 8
    cpu: Penryn
    efidisk0: local-lvm:vm-101-disk-1,size=4M
    ide0: Huginn:iso/Catalina.iso,cache=unsafe,size=12G
    ide2: local:iso/OpenCore.iso,cache=unsafe,size=150M
    machine: q35
    memory: 32000
    name: Alfheimr
    net0: vmxnet3=52:C8:18:A5:A2:28,bridge=vmbr0,firewall=1
    numa: 0
    ostype: other
    sata0: Huginn:101/vm-101-disk-0.qcow2,cache=unsafe,discard=on,size=32G,ssd=1
    scsihw: virtio-scsi-pci
    smbios1: uuid=0fb4455a-9519-45f7-8083-d9f1a02ce52e
    sockets: 1
    vga: vmware
    vmgenid: dd434038-61cb-4ec9-a86b-e8eb2c12fa9c

    1. It’s hard to guess what went wrong here because I’m not sure what you changed since it last worked. Your config looks fine, but make sure those are not curly quotes around your OSK.

      By the echo commands I’m assuming you mean you enabled Verbose mode? What’s the last output from it?

      1. OSK was wrong indeed. It turns out I was using “©” instead of “(c)”.
        It’s a very good protection system.

        Ok, so I managed to install the system correctly, but this time I’m installing it into an NVMe drive (same thing for the Windows VM, which I can’t get to boot without having to enter the EFI menu to choose the proper boot device).

        Anyway, OpenCore doesn’t seem to see my NVMe. It doesn’t show it as a boot option, and neither does “Select Boot Disk” in the setup. Disk Utility sees it fine, I even managed to install Catalina onto it. Now I’m in a deeper, badly charted territory and can’t seem to find much info online… 🙁

        1. I only have:

          “macOS Base System”
          “macOS Installer”

          The drive was called just “macOS”. Any ideas? Bad formatting/partitioning?

          (BTW, I have two partitions on the same drive in order to use as a fallback for future upgrades gone wrong – the other being “macOS Backup”).

          1. To boot from NVMe you’ll need to edit your OpenCore config.plist to set ScanPolicy to 0 I believe (that’s what I have to do on my system).

            1. Huummm… Any suggestion on how to do that? I can’t access the contents of the OpenCore ISO you posted, even renaming it to IMG.

              I also downloaded “” and “”. I suppose the contents of the first one are the same as your disk image, but then how would I go about making my own image based on these files now?

              1. You can edit it from inside your VM by using the UEFI shell, follow the directions in the “Editing your OpenCore/EFI settings” section under “If you’re unable to boot macOS”.

              2. Hello again. Sorry for the long time to post I had a few issues. Anyway, the idea of using the EFI shell was brilliant, although I had never used such before. It worked out great – but when I passed the wrong controller to the Windows machine, which was set to auto-start, things got a bit harry and I managed to fix it, but I broke something else along the way and ended up having to reconfigure both VMs.

                There are some minor quirks, but in general I’m not bothered at all. Pretty happy, actually! Can’t complain at all. Got myself something equivalent to an iMac Pro base model, for 1/3 of the price, and with about 200% capacity (cores, memory, NVMe and VGA) remaining for another VM. NEAT!

                Thank you so very much for the tutorial, and the good will to help people. You, sir, deserve a long life.

              3. Oh, forgot to ask: I have no interest in using iMessages and FaceTime, only iCloud and the App Store. Is it really safe to just login the way it is?

              4. I’ve signed in maybe 20 times to use the app store across 10 VMs and never had a problem. You can remove VMs from your Apple account if you discard them so you don’t build up an unrealistically large graveyard of dead VMs.

    1. Only if you pick a card that macOS supports, or is compatible with the AppleALC kext which I’ve included.

      I use my passthrough RX580 graphics card to send sound over DP or HDMI to my monitor, which decodes it and provides it on a headphone jack. Another alternative is a $5 USB sound dongle from Amazon.

        1. In general the USB soundcards seem to be supported on a generic basis without requiring any special drivers. I have used this one in the past:

          The downside with my specific model is that the output volume with high-efficiency earbuds is soul-destroyingly loud. I had to add an attenuator to make sure my hearing wasn’t nuked in a Therac-25-style incident. It probably pairs up really well with big, low-ohm headphones though!

      1. updated config.plist like this, still showing 8MB Display memory.








        keepsyms=1 -v nvda_drv_vrl=1 shikigva=4

          1. I installed, and Nvidia driver manager shows web driver is being used instead of macos built in. but my card is not recognized.

            my box is Lenovo y900, i7-7700K + Nvidia 1070, lasted promox. I passthrough GPU and keyboard, mouse. it works, but video is lagging with only 8MB of video memory and no audio.

            it works with windows 10 though. although it took me quite sometime to get the 1070 card work in windows 10 too.

            1. OK, gave up on the 1070 card. bought a 710 2GB card, work out of the box. video/audio all work fine. I guess i just won’t play wot in catalina.

              quick question: do I still need to install nvidia web driver? the built-in seems work fine.

  15. Hello, everyone,

    first of all: This is a very good tutorial!

    But unfortunately I have a problem right at the beginning. I have followed the tutorial so far and at the first start the selection of OpenCore comes up. But when I start the BaseSystem, the screen turns black, the apple appears and then nothing more happens…
    There is no loading bar.

    I used Proxmox 6.2 on a Threadripper 3 (3960x).

    Does anyone have a tip for me?

    See you later.


    Translated with (free version)

      1. Many thanks for the super fast answer!

        Yes, I have done so, here is my configuration:

        args: -device isa-applesmc,osk=”XXX” -smbios type=2 -device usb-kbd,bus=ehci.0,port=2 -cpu Penryn,kvm=on,vendor=GenuineIntel,+kvm_pv_unhalt,+kvm_pv_eoi,+hypervisor,+invtsc,+pcid,+ssse3,+sse4.2,+popcnt,+avx,+avx2,+aes,+fma,+fma4,+bmi1,+bmi2,+xsave,+xsaveopt,check
        balloon: 0
        bios: ovmf
        bootdisk: ide2
        cores: 4
        cpu: Penryn
        efidisk0: local-zfs:vm-113-disk-1,size=1M
        ide0: local:iso/Catalina-installer.iso,cache=unsafe,size=2084424K
        ide2: local:iso/OpenCore.iso,cache=unsafe
        machine: q35
        memory: 8192
        name: macOS
        net0: vmxnet3=26:01:E6:3D:B5:64,bridge=vmbr0,firewall=1
        numa: 0
        ostype: other
        sata0: local-zfs:vm-113-disk-0,cache=writeback,discard=on,size=64G,ssd=1
        scsihw: virtio-scsi-pci
        smbios1: uuid=681cd878-aaad-4c2c-a002-6c19c27382db
        sockets: 1
        vga: vmware
        vmgenid: 9b2953ef-63e1-44ed-8424-f2b94cb6772e

  16. Similar experience here. Seems like setting the CPU core count to 1 does help to make it start. Unfortunately even after install I cannot make it boot when I increase the core count.

  17. Hi Nick!

    First of all thanks for really detailed guide on how to setup macOS on the latest Proxmox release. I have managed to successfully install the system on my VM and now I’m looking forward to pass through my GPU. At that moment this is just “try if it will work” concept and if will not work, I will rethink if it’s worth buying compatible hardware or just use another OS instead. My spare GPU is good old GT430 which tends to be supported with Legacy Video patch, but it does not support UEFI, so OVMF therefore gets out of the game. I am trying to prepare legacy install OpenCore and I used EFI files from your forked KVM OpenCore repository. I created bootdisk and started VM – everything worked fine until the menu for disk selection showed up, but then the keyboard didn’t work to enter into the install. I believe I should add kext for input devices, but it’s my first time building custom bootloader for macOS.

    As you have much much more experience with those things, would you please comment on that – what do you think I should modify in order to make OpenCore legacy install successful?

    Thank you!

        1. update: installer booting fine with V5, no other changes, just OpenCore V5 iso.
          There is no DHCP on my net, so i’ve set static ip “ifconfig en0 inet ip.of.the.vm netmask” and can ping the other vms in the same subnet. The gateway is “far”, not in same subnet, so “route add default” fails with “Network is unreachable”. Linux VMs do work this way. Any ideas very appreciated. Thank You!

          1. Networking issue solved on a proxmox node w/o dhcp server on network, installed isc-dhcp-server and bound to vmbr1 (or your bridge, that is used for the catalina vm, default is vmbr0)
            how-to following asap i get all running and documented 🙂
            Thanks for your great tutorial. Still using your opencore v5 iso (migrated to sata1, also migrated catalina-installer to sata2, target harddisk sata0. all disks are raw on zfs). very cool playground :)))

            1. Tutorial / How to install w/o DHCP server, when only static ip settings possible….

              #on the proxmox node:

              apt install isc-dhcp-server

              vi /etc/default/isc-dhcp-server
              INTERFACESv4=”vmbr0″ #set here your bridge, whre your VM-NIC is bound to. vmbr0 is default, you might have another bridge number
              INTERFACESv6=”” #same here, but only, if your proxmox server is setup for ipv6 at all (depending on provider or personal preferences)

              vi /etc/dhcp/dhcpd.conf
              option domain-name “yoursearchdomain.tld”; #selfexplanatory
              default-lease-time 600;
              max-lease-time 7200;
              ddns-update-style none;
              subnet netmask { #you can setup your real net like, but it does not mater, since later we bind a specific ip-address to specific mac-address anyway
              default-lease-time 86400; #24h in seconds, change i you like
              max-lease-time 604800; #one week in second, change is you like, but more or eqal to default-lease-time
              host catalina {
              hardware ethernet 00:00:00:00:00:00; #mac-address of the virtual NIC of your vm, the vxnet one, to bind this dhcp lease to it. copy from proxmox gui
              option routers; #gateway/router
              option subnet-mask; #subnet, default in local nets is
              fixed-address; #ip, that you want to lease to your macos vm, in my case its the failover ip of my provider (ovh/hetzner/etc)
              option domain-name-servers,; #huh, whats that?

              systemctl enable isc-dhcp-server #enable the dhcp server, so it starts automatically after proxmox reboot

              systemctl restart isc-dhcp-server #start/restart the dhcp server now

              systemctl status isc-dhcp-server #check status, if its “running”, ignore the two red lines about multiple interfaces match
              ● isc-dhcp-server.service – LSB: DHCP server
              Loaded: loaded (/etc/init.d/isc-dhcp-server; generated)
              Active: active (running) since Wed 2020-09-09 02:10:48 CEST; 18s ago
              Docs: man:systemd-sysv-generator(8)
              Process: 19252 ExecStart=/etc/init.d/isc-dhcp-server start (code=exited, status=0/SUCCESS)
              Tasks: 1 (limit: 4915)
              Memory: 5.0M
              CGroup: /system.slice/isc-dhcp-server.service
              └─19271 /usr/sbin/dhcpd -4 -q -cf /etc/dhcp/dhcpd.conf vmbr0

              Sep 09 02:10:46 h02 dhcpd[19271]: Wrote 0 leases to leases file.
              Sep 09 02:10:46 h02 dhcpd[19271]: Multiple interfaces match the same subnet: enp0s1 vmbr0
              Sep 09 02:10:46 h02 dhcpd[19271]: Multiple interfaces match the same shared network: enp0s1 vmbr0
              Sep 09 02:10:46 h02 dhcpd[19271]: Server starting service.
              Sep 09 02:10:48 h02 isc-dhcp-server[19252]: Starting ISC DHCPv4 server: dhcpd.
              Sep 09 02:10:48 h02 systemd[1]: Started LSB: DHCP server.
              Sep 09 02:10:50 h02 dhcpd[19271]: DHCPDISCOVER from 00:00:00:00:00:00 via vmbr0
              Sep 09 02:10:50 h02 dhcpd[19271]: DHCPOFFER on to 00:00:00:00:00:00 via vmbr0
              Sep 09 02:10:51 h02 dhcpd[19271]: DHCPREQUEST for ( from 00:00:00:00:00:00 via vmbr0
              Sep 09 02:10:51 h02 dhcpd[19271]: DHCPACK on to 00:00:00:00:00:00 via vmbr0

              #reboot your macos vm, now it should have internet

              1. Ooh that’s a handy tutorial, do you mind if I turn this into a post here? With credit of course.

        2. I’m trying to track down the incompatibility here: Which CPU do you have, and did you use -cpu penryn or -cpu host? How much RAM did you assign to the VM? How many cores?

          1. the physical server has xeon e3-1275, used the “intel” args, cpu: penryn. everything as in your tutorial…

            args: -device isa-applesmc,osk="removed(c)removed" -smbios type=2 -device usb-kbd,bus=ehci.0,port=2 -cpu host,kvm=on,vendor=GenuineIntel,+kvm_pv_unhalt,+kvm_pv_eoi,+hypervisor,+invtsc
            balloon: 0
            bios: ovmf
            boot: cdn
            bootdisk: sata1
            cores: 4
            cpu: Penryn
            efidisk0: local-zfs:vm-100-disk-1,size=1M
            machine: q35
            memory: 4096
            name: catalina
            net0: vmxnet3=blabla,bridge=vmbr1
            numa: 0
            ostype: other
            sata0: local-zfs:vm-100-disk-0,cache=unsafe,discard=on,size=64G,ssd=1
            sata1: local-zfs:vm-100-disk-1,cache=unsafe //this is opencorev5 iso migrated to zfs as raw
            sata2: local-zfs:vm-100-disk-2,cache=unsafe //this is catalina-installer iso migrated to zfs as raw
            scsihw: virtio-scsi-pci
            smbios1: uuid=blabla
            sockets: 1
            vga: vmware
            vmgenid: blabla
  18. Hello,

    I ran into an issue installing Mojave with your previous guide. When booting into macOS via Clover, I’m presented with the following error:

    Error loading kernel cache (0xe)

    I didn’t see anyway to disable kernel cache in that version of Clover so I tried booting Mojave with OpenCore and consistently get the “Prohibited” sign.

    Do you have any ideas on either disabling kernel cache in Clover or running OpenCore in verbose/debug?

    Thanks in advance!

  19. I install use your latest opencore(v7) to install catalina, and it’s not working(startimage failed, abort), however I switched to v4, and it worked. just let you know.

  20. Hi,
    Thanks a lot for all the hard work!
    Considering this on a Intel Core i7-10710u laptop (Intel UHD Graphics 620), with iGPU passthrough, if at all possible… This means Proxmox will have no host UI.
    I’m then considering 2 usescases:
    – how do I power-off: can Proxmox automatically shutdown as VM is powered-off ? (I guess VM restart is fine).
    – typical wifi roaming with laptop (public space, transportation, hotels): how can I adjust wifi settings on Proxmox side while VM is running, and get advantage of then-refreshed network bridge on VM side? Requires VM restart? Requires Proxmox restart?
    Can this be done from running VM, without secondary device intervention?

    Thanks for any tip

    1. For host shutdown on a desktop, you can just hit the power button, and the host will do an orderly shutdown. If your laptop has a dedicated power button you may be able to do the same.

      Passing through WiFi to the guest through a virtual network adapter is something that I never managed to get, it seems really difficult. You could go the Hackintosh route and install an Apple-supported wireless card into your laptop, then pass it through with PCIe passthrough?

      1. Thanks for prompt reply.
        Target laptop has no replaceable wifi HW (built-in Intel Wi-Fi 6 AX201), so I’m looking at VM solution because Hackintosh would not work for Wifi.
        Curious as to why host bridge on wifi would not work same as for ethernet, as long as Linux side is doing all the native config?

        1. Does your target laptop have an M.2 slot? If it supports PCIe-keyed cards you can add one in there.

          AX201 is supported (kind of) by OpenIntelWireless:

          I forget the reason why WiFi was so hard to work with. Something about the WiFi adapter wanting to present its own IP address and not letting the Proxmox bridge decide it, or something like that. You can probably figure something out. I found lots of pages about it at the time from the Proxmox forum with other users struggling with it.

          You can access Proxmox from your guest using SSH to reconfigure the host WiFi as needed (you can add two network adapters to the guest if you need one that is for host-only networking and one that is for WiFi).

  21. There is one point I don’t understand concerning the OSK authentication key: I have been using bare metal Hackintoshs for a while with Clover and now OpenCore now, but I never had to deal with that key at all.
    So what is the difference between the Proxmox VM and a normal Hackintosh? A normal Mainboard doesn’t expose the OSK either, where does it come from in that scenario?

    1. The OSK can be provided by VirtualSMC, but instead we emulate it on the host using the SMC support built into QEMU so that we can run the guest closer to unmodified stock.

  22. I guess it *must* be provided in OC’s config.plist, given it’s that important, however, I wasn’t able to find this string in there. I will defer that question for a moment though as it is not so critical.
    I’m actually more curious if it is possible to find an OC configuration that is suitable for both scenarios, i.e. usage in the VM in proxmox as well as a direct boot into a native Hackintosh (Ryzentosh): When I had added my native SSD (incl. EFI) to the Proxmox VM, it would crash right at the first few OC boot lines.
    I assume there is nothing fundamentally different to prevent it from working, so I will play around a bit.

  23. i spent 3 hours on this before seeing the comment that OpenCore 6 might not work and to use another build instead, which i did and then everything worked 😂 i usually leave comments blocked.

  24. Hi Nick!
    Your tutorial is very in-depth, however when attempting to load off OpenCore (v5) I’m getting a the apple icon with a loading bar, however at approximately 50% through it restarts and reports a fail.
    With the downloading of the Base Image, there are significant different builds as time has passed since you made this tutorial, however I’ve tried about 3 of them and all have the same result. OpenCore v7 displays the Stop sign so that’s a no go.
    My specifications are ProxMox 6.2-4 with dual xeon e5-2620 processors.

    1. Double check your OSK, particularly that it isn’t surrounded by curly quotes, the (c) hasn’t been turned into a copyright symbol, and there are no invisible zero-width spaces which are used for word-wrapping (often seen when copying text from blogs that haven’t put it in a code block)

      1. Yeah, it all looks correct from what i can see. Below is the conf file. I tried both the -cpu host and -cpu Penryn arguments with no change.

        Let me know if there is anything else I can try.

        args: -device isa-applesmc,osk=”our…steal(c)apple…inc” -smbios type=2 -device usb-kbd,bus=ehci.0,port=2 -cpu Penryn,kvm=on,vendor=GenuineIntel,+kvm_pv_unhalt,+kvm_pv$
        balloon: 0
        bios: ovmf
        boot: cdn
        bootdisk: ide2
        cores: 1
        cpu: Penryn
        efidisk0: Data-1:vm-100-disk-1,size=4M
        ide0: local:iso/Catalina-Installer.iso,cache=unsafe,size=2084424K
        ide2: local:iso/OpenCore.iso,cache=unsafe
        machine: q35
        memory: 4096
        name: catalina
        net0: vmxnet3=7E:19:80:CF:C8:FB,bridge=vmbr0,firewall=1
        numa: 0
        ostype: other
        sata0: Data-1:vm-100-disk-0,cache=unsafe,discard=on,size=64G,ssd=1
        scsihw: virtio-scsi-pci
        smbios1: uuid=f3d7c3db-7bf7-4dec-b056-f6b1cafc9551
        sockets: 1
        vga: vmware
        vmgenid: b147a951-9ee0-48d2-a9f6-e7a5959f2d54

        1. Sorry – missed the first line

          args: -device isa-applesmc,osk=”our…steal(c)apple…inc” -smbios type=2 -device usb-kbd,bus=ehci.0,port=2 -cpu Penryn,kvm=on,vendor=GenuineIntel,+kvm_pv_unhalt,+kvm_pv_eoi,+hypervisor,+invtsc,+pcid,+ssse3,+sse4.2,+popcnt,+avx,+avx2,+aes,+fma,+fma4,+bmi1,+bmi2,+xsave,+xsaveopt,check

            1. I think I need to re-evaluate my life choices to this point.
              Didn’t realise it was case sensitive. I feel so stupid right now. Absolute life-saver.

  25. A quick question about upgrades: will they be possible or am I stuck with OSX Catalina?

    When Big Sure will be officially released would you mind updating your article with a few words about upgrade options?

    1. In the past upgrades have been smooth. Normally you just need to update OpenCore, and then you can upgrade from the app store like on a real Mac.

      I’ll add those details once Big Sur Retail comes out.

  26. Hey. Got Catalina running on Proxmox 6.2 and looks to be good for the most part. Is an Intel i5-2400 w/ 8GB of RAM. VM is given 2 cores and 6GB. Is using OpenCore v5 as v6 wasn’t working. Was able to get USB passthrough working, but the main thing is once I get an iPad plugged in the whole VM freezes up and then I have to end up stopping and starting again. Keyboard and storage devices show fine and cause no trouble. Was wondering if you had any ideas.


    1. I haven’t tested a USB iDevice myself, but I suspect the problem is that when your device is connected to macOS, it attempts to re-enumerate as a different device ID, and this causes it to be disconnected from the emulated USB port. You can avoid this kind of issue if you can PCIe-passthrough an entire USB controller instead.

Leave a Reply

Your email address will not be published. Required fields are marked *

This site uses Akismet to reduce spam. Learn how your comment data is processed.