macOS VPS Installation Guide — Proxmox VE (Intel and AMD) | Sonoma, Sequoia and Tahoe
DISCLAIMER: Per Apple's End User License Agreement (EULA), macOS may only be run on Apple-branded hardware. This guide has been published for educational and academic purposes. The responsibility for use lies entirely with the user.
This guide explains step by step how to install a macOS virtual machine on Proxmox VE. It is a complete resource for installing macOS Sonoma (14), Sequoia (15) and Tahoe (26) versions on Intel and AMD-based servers with the LongQT-sea/OpenCore-ISO project, hiding VM detection with VMHide, configuring SMBIOS and applying performance optimization.
If you do not want to deal with the installation, you can use ready-made macOS VPS: MacOS VPS
Requirements
- Proxmox AND 8.x (8.4+ recommended)
- Intel VT-x or AMD-V supported processor
- At least 4 Core CPUs
- At least 8 GB RAM (to be reserved for VM)
- At least 100 GB free disk space
- Internet access (macOS Recovery installation downloads ~15 GB from Apple servers)
- NAT configuration that can provide internet to the network or VM working with DHCP
What is LongQT-sea/OpenCore-ISO?
It is a pre-configured OpenCore EFI project used to run macOS in a virtual machine. It offers a clean ISO-based approach with pre-configured kext and config.plist, running on Intel and AMD processors. It makes it possible to install macOS Sonoma, Sequoia and Tahoe directly on Proxmox without unnecessary steps such as manual EFI editing, OCLP, TPM.
Source: GitHub — LongQT-sea/OpenCore-ISO
A. File Preparation (Proxmox Shell)
1. Download OpenCore ISO
wget https://github.com/LongQT-sea/OpenCore-ISO/releases/download/v0.7/LongQT-OpenCore-v0.7.iso \
-O /var/lib/vz/template/iso/LongQT-OpenCore-v0.7.iso
2. Download macOS Recovery (OSX-KVM method)
SECURITY: The macOS Recovery image is downloaded directly from Apple's CDN servers (swcdn.apple.com). No third party sources are used, the file is the original image signed by Apple.
apt install -y dmg2img git python3
git clone --depth 1 https://github.com/kholia/OSX-KVM.git /tmp/OSX-KVM
cd /tmp/OSX-KVM
python3 fetch-macOS-v2.py
When the script runs, the version list appears:
1. High Sierra (10.13)
2. Mojave (10.14)
3. Catalina (10.15)
4. Big Sur (11.7)
5. Monterey (12.6)
6. Ventura (13)
7. Sonoma (14) - RECOMMENDED
8. Sequoia (15)
9. Tahoe (26)
- For Sonoma type
7 - Type
8for Sequoia - For Tahoe type
9
dmg2img -i /tmp/OSX-KVM/BaseSystem.dmg -o /var/lib/vz/template/iso/BaseSystem.img
B. Creating a VM (Proxmox Web UI)
- VM ID: 900 (or a blank ID)
- Name: macOS-VM
- ISO Image:
LongQT-OpenCore-v0.7.iso - Guest OS Type: Linux > version 6.x - 2.6 Kernel
- Graphic Card: VMware compatible
- Machine: q35
- BIOS: OVMF (UEFI)
- EFI Disk: Enabled
- Pre-Enroll Keys: OFF
- SCSI Controller: VirtIO SCSI
- QEMU Guest Agent: Enabled
- TPM: OFF
- Hard Disk: VirtIO Block, 100GB, Cache: Write back (unsafe)
- CPU Cores: 4 (give number of cores as 2 4 or 8), Sockets: 1, Type: kvm64 (will be overridden with args)
- RAM: 8192 MB, Ballooning: OFF
- Network: VirtIO, Bridge: vmbr0
C. Mounting BaseSystem.img
BaseSystem.img is a raw disk image created with dmg2img.
PROBLEM: If mounted as media=cdrom, OpenCore does not detect it as a bootable source.
SOLUTION: Import BaseSystem.img as real disk. Select command according to storage backend:
If you are using local-lvm:
qm importdisk 900 /var/lib/vz/template/iso/BaseSystem.img local-lvm
qm set 900 --ide2 local-lvm:vm-900-disk-2,cache=unsafe
if you are using local-zfs:
qm importdisk 900 /var/lib/vz/template/iso/BaseSystem.img local-zfs
qm set 900 --ide2 local-zfs:vm-900-disk-2,cache=unsafe
NOTE: To see which storage is available:
pvesm statusYou must use the same storage name in both commands (importdiskandqm setmust be the same).900is used as the VM ID in all commands in this guide. If you created a different ID, replace the900value in the commands with your own VM ID.
Adjust boot order (OpenCore ISO and BaseSystem disk appear in boot):
qm set 900 --boot order='ide0;virtio0;ide2;net0'
NOTE: OpenCore ISO (ide0) MUST REMAIN as media=cdrom.
D. CPU Configuration (Intel and AMD)
Basic CPU and USB Setting
For both Intel and AMD the following args line is used:
qm set 900 --tablet 0
qm set 900 --args "-cpu Skylake-Client-v4,vendor=GenuineIntel,+invtsc,+hypervisor,kvm=on,vmware-cpuid-freq=on -device qemu-xhci,id=xhci -device usb-kbd,bus=xhci.0 -device usb-tablet,bus=xhci.0 -global nec-usb-xhci.msi=off -global ICH9-LPC.acpi-pci-hotplug-with-bridge-support=off"
NOTE: We turn off Proxmox's internal tablet setting (
--tablet 0) because we define USB input devices ourselves via QEMU args.
CPU flag descriptions:
vendor=GenuineIntel— Reports CPUID as Intel. Required on AMD, recommended for consistency on Intel.+invtsc— Invariant TSC is critical for timing synchronization (without this the kernel hangs)+hypervisor— Reports running in VMkvm=on— KVM acceleration activevmware-cpuid-freq=on— required for macOS to read CPU frequency correctly
USB and stability flag descriptions:
-device qemu-xhci,id=xhci— USB 3.0 controller required for macOS Tahoe and Sonoma 14.4+-device usb-kbd,bus=xhci.0— Keyboard input via XHCI-device usb-tablet,bus=xhci.0— Absolute positioning for proper mouse operation in VNC-global nec-usb-xhci.msi=off— Fixes the MSI interrupt issue of macOS XHCI driver, without which the mouse would crash-global ICH9-LPC.acpi-pci-hotplug-with-bridge-support=off— Prevents ACPI hotplug conflict on Q35 chipset
Special Notice to AMD
Proxmox automatically adds the enforce,+kvm_pv_eoi,+kvm_pv_unhalt flags from the cpu: line. These flags Prevent macOS booting on AMD.
Solution: Make cpu: kvm64 in the config file:
cpu: kvm64
args: -cpu Skylake-Client-v4,vendor=GenuineIntel,+invtsc,+hypervisor,kvm=on,vmware-cpuid-freq=on -device qemu-xhci,id=xhci -device usb-kbd,bus=xhci.0 -device usb-tablet,bus=xhci.0 -global nec-usb-xhci.msi=off -global ICH9-LPC.acpi-pci-hotplug-with-bridge-support=off
In this way, Proxmox simply defines kvm64 and overrides Skylake-Client-v4 in args at the QEMU level.
TSC Problem with Multi Core (Intel and AMD)
To avoid problems with multi-core support, assign 2, 4 and 8 cores for the VM, and if you still experience boot problems, change the GRUB setting on the Proxmox Main machine:
- Open the
/etc/default/grubfile - Find the line
GRUB_CMDLINE_LINUX_DEFAULT(usually it says"quiet") - Change the line as follows:
GRUB_CMDLINE_LINUX_DEFAULT="quiet tsc=reliable"
- Save and update GRUB, then restart Proxmox host:
update-grub && reboot
E. Resolution Setting Optional (1920x1080)
Increasing the resolution will reduce graphics performance, so it is offered as an option.
Method 1 — OVMF UEFI Setup: During VM boot, ESC/F2 > Device Manager > OVMF Platform Configuration > 1920x1080
Method 2 — QEMU args (easier):
Add -global OVMF.Resolution=1920x1080 to the end of the args line:
args: -cpu Skylake-Client-v4,vendor=GenuineIntel,+invtsc,+hypervisor,kvm=on,vmware-cpuid-freq=on -device qemu-xhci,id=xhci -device usb-kbd,bus=xhci.0 -device usb-tablet,bus=xhci.0 -global nec-usb-xhci.msi=off -global ICH9-LPC.acpi-pci-hotplug-with-bridge-support=off -global OVMF.Resolution=1920x1080
Set VGA memory to 256MB:
qm set 900 --vga vmware,memory=256
F. macOS Installation Steps
INTERNET REQUIRED: macOS Recovery installation downloads the full OS from Apple servers. The VM needs to access the internet. If the VM is connected to Proxmox with
bridge=vmbr0and there is DHCP in the host network, it will automatically get an IP, otherwise you need to install a simple dhcp server on Proxmox. Since the LongQT OpenCore EFI contains the VirtIO network kext, the network also worked during the Recovery phase. 10-20 GB is downloaded depending on the installation size, it may take a long time on slow connections.
- Start the VM, select macOS Base System from the OpenCore boot menu
- Disk Utility > VirtIO disk sec (APPLE Inc. Virtio written) > Erase sec and write macos to the disk name (APFS + GUID Partition Map)
- Close Disk Utility > Reinstall macOS sec (Sonoma, Sequoia, or Tahoe)
- During installation, the VM is restarted several times - it starts automatically each time
- When the installation is completed, follow the setup wizard
- SKIP iCloud login (until SMBIOS is set)
G. Post-Install (Copy OpenCore to Disk)
With Finder:
- Open the LongQT-OpenCore CD on your desktop
- Run Mount_EFI.command > select macOS disk
- LongQT-OpenCore > EFI_RELEASE > Copy the EFI folder to the mounted EFI volume
If you want to do it with Terminal, use these commands:
First, type SSH in the search field in Settings, add the user you created in the remote login section and activate the remote login switch.
sudo diskutil mount disk0s1
cp -R /Volumes/LongQT-OpenCore/EFI_RELEASE/EFI /Volumes/EFI/
Install Python 3:
With Finder: Open the LongQT-OpenCore CD > Double-click the Install_Python3.command file > The terminal opens and installs automatically.
If you want to do it via terminal:
/Volumes/LongQT-OpenCore/Install_Python3.command
If it gives permission error:
chmod +x /Volumes/LongQT-OpenCore/Install_Python3.command
/Volumes/LongQT-OpenCore/Install_Python3.command
Remove ISOs:
- Shut down VM
- Detach > Remove OpenCore ISO and BaseSystem disk from Proxmox Hardware
- Update boot order:
qm set 900 --boot order='virtio0;net0' - Start VM
H. VMHide — Hiding VM Detection
VMHide is a Lilu plug-in used to trick services (specifically iCloud, Apple ID) that detect macOS running in a virtual machine.
Source: VMHide GitHub
Installation:
- Update Lilu.kext (at least v1.7.0 required). It should already be present in OpenCore EFI.
- Download VMHide.kext via Terminal:
cd ~/Downloads
curl -L -o VMHide-2.0.0.zip https://github.com/Carnations-Botanica/VMHide/releases/download/2.0.0/VMHide-2.0.0-RELEASE.zip
unzip VMHide-2.0.0.zip
- Mount EFI:
sudo diskutil mount disk0s1
- Copy VMHide.kext to EFI:
cp -R ~/Downloads/VMHide.kext /Volumes/EFI/EFI/OC/Kexts/
- Add VMHide.kext entry to
config.plistfile:
plutil -insert Kernel.Add -json '{"MaxKernel":"","MinKernel":"","BundlePath":"VMHide.kext","Comment":"VMHide.kext","Enabled":true,"ExecutablePath":"Contents/MacOS/VMHide","PlistPath":"Contents/Info.plist","Arch":"Any"}' -append /Volumes/EFI/EFI/OC/config.plist
Verification — VMH should appear in the list:
plutil -extract Kernel.Add json -o - /Volumes/EFI/EFI/OC/config.plist | grep -o '"VMHide.kext"'
- Add
vmhState=enabledto boot args. First see the current boot-args value:
plutil -extract NVRAM.Add.7C436110-AB2A-4BBB-A880-FE41995C9F82.boot-args raw -o - /Volumes/EFI/EFI/OC/config.plist
The output of the previous command is the current boot-args value (for example keepsyms=1). Add vmhState=enabled with a space at the end of this value:
plutil -replace NVRAM.Add.7C436110-AB2A-4BBB-A880-FE41995C9F82.boot-args -string "keepsyms=1 vmhState=enabled" /Volumes/EFI/EFI/OC/config.plist
ATTENTION: The
keepsyms=1part above is an example. If there is a different value in your output, write it and addvmhState=enabledto the end.
VMHide States:
enabled— Hides VMM status (recommended)disabled— VMHide disabledstrict— Freezes VMM 0 on all operations
I. SMBIOS Configuration (for iCloud / iMessage)
A unique SMBIOS must be defined on each macOS VM. If multiple machines with the same SMBIOS are connected to Apple servers, the account may be locked.
Step 1 — Download and run GenSMBIOS (macOS Terminal):
cd ~/Downloads
curl -L -o GenSMBIOS.zip https://github.com/corpnewt/GenSMBIOS/archive/refs/heads/master.zip
unzip GenSMBIOS.zip
cd GenSMBIOS-master
chmod +x GenSMBIOS.command && ./GenSMBIOS.command
Step 2 — Install MacSerial:
When the menu opens, type 1 > Enter. MacSerial will be downloaded.
Step 3 — config.plist sec:
Type 2 > Enter. Paste the following line as path:
/Volumes/EFI/EFI/OC/config.plist
NOTE: Before EFI mount:
sudo diskutil mount disk0s1
Step 4 — Generate SMBIOS:
Type 3 > Enter. Type iMacPro1,1 as the model > Enter.
The script generates unique Serial, Board Serial, SmUUID and ROM and automatically writes it to config.plist.
Step 5 — Verify serial number:
Go to Apple Check Coverage and type the generated Serial Number. The result should be "not valid" or "unable to check". This indicates that the serial number does not belong to a real Mac and can be used with confidence.
If a valid device appears (belonging to someone else's Mac), go back to GenSMBIOS and generate a new SMBIOS with 3.
Step 6 — Restart VM:
If the SMBIOS is saved properly, you can now log in with iCloud and Apple ID.
J. Configuring for VPS (macOS Terminal)
# SSH ac
sudo systemsetup -setremotelogin on
# Otomatik guncelleme kapat
sudo softwareupdate --schedule off
sudo defaults write /Library/Preferences/com.apple.SoftwareUpdate AutomaticDownload -bool false
sudo defaults write /Library/Preferences/com.apple.SoftwareUpdate AutomaticCheckEnabled -bool false
sudo defaults write /Library/Preferences/com.apple.SoftwareUpdate CriticalUpdateInstall -bool false
# Uyku modlarini kapat
sudo pmset -a sleep 0
sudo pmset -a displaysleep 0
sudo pmset -a disksleep 0
# Ekran koruyucu kapat
defaults -currentHost write com.apple.screensaver idleTime 0
# Firewall ACIK birak
sudo defaults write /Library/Preferences/com.apple.alf globalstate -int 1
- Screen Sharing (VNC): System Settings > General > Sharing > Screen Sharing ON
- Firewall: Leave it ON, not off — SSH and VNC are already passed as signed applications
K. GPU / Performance Optimization (Recommended for VMware VGA)
Since there is no real GPU in the virtual machine, macOS animations and visual effects consume unnecessary resources. The following commands disable animations, switch to software rendering, and lighten the system:
# Seffaklik ve hareket efektlerini kapat
defaults write com.apple.universalaccess reduceTransparency -bool true
defaults write com.apple.universalaccess reduceMotion -bool true
# Dock animasyonlarini kapat
defaults write com.apple.dock launchanim -bool false
defaults write com.apple.dock autohide-delay -float 0
defaults write com.apple.dock autohide-time-modifier -float 0
defaults write com.apple.dock expose-animation-duration -float 0.1
defaults write com.apple.dock no-glass -bool true
defaults write com.apple.dock no-bouncing -bool true
defaults write com.apple.dock magnification -bool false
defaults write com.apple.dock show-recents -bool false
defaults write com.apple.dock mineffect -string "scale"
defaults write com.apple.dock springboard-show-duration -float 0
defaults write com.apple.dock springboard-hide-duration -float 0
defaults write com.apple.dock springboard-page-duration -float 0
defaults write com.apple.dock workspaces-swoosh-animation-off -bool true
defaults write com.apple.dock minimize-to-application -bool true
defaults write com.apple.dock slow-motion-allowed -bool false
defaults write com.apple.dock missioncontrol-animation-duration -float 0.1
defaults write com.apple.dock workspaces-edge-delay -float 0
defaults write com.apple.dock springboard-blur-radius -int 0
# Genel pencere ve sistem animasyonlarini kapat
defaults write NSGlobalDomain NSAutomaticWindowAnimationsEnabled -bool false
defaults write NSGlobalDomain NSWindowResizeTime -float 0.001
defaults write -g NSMenuAnimationDuration -float 0
defaults write -g NSPopUpMenuAnimationDuration -float 0
defaults write -g NSComboBoxAnimationDuration -float 0
defaults write -g NSToolbarAnimationDuration -float 0
defaults write -g NSToolbarFullScreenAnimationDuration -float 0
defaults write -g NSSheetAnimationEnabled -bool false
defaults write -g NSWindowAnimationsEnabled -bool false
defaults write -g NSViewAnimationsEnabled -bool false
defaults write -g NSScrollAnimationEnabled -bool false
defaults write -g NSUseAnimatedFocusRing -bool false
defaults write -g NSScrollViewRubberbanding -bool false
defaults write -g NSOverlayScrollerHideDelay -float 0
defaults write -g QLPanelAnimationDuration -float 0
defaults write -g NSWindowSupportsAutomaticFullScreen -bool false
defaults write -g NSFullScreenAnimationDuration -float 0
defaults write NSGlobalDomain com.apple.springing.enabled -bool false
# Finder animasyonlarini kapat
defaults write com.apple.finder DisableAllAnimations -bool true
defaults write com.apple.finder AnimateInfoPanes -bool false
defaults write com.apple.finder AnimateSnapToGrid -bool false
# GPU / Rendering — Software renderer'a gec
sudo defaults write /Library/Preferences/com.apple.windowserver UseMetal -bool false
sudo defaults write /Library/Preferences/com.apple.windowserver UseOpenGL -bool false
sudo defaults write /Library/Preferences/com.apple.windowserver HardwareAccelerated -bool false
sudo defaults write /Library/Preferences/com.apple.windowserver EnableShadows -bool false
sudo defaults write /Library/Preferences/com.apple.CoreDisplay useMetal -bool false
sudo defaults write /Library/Preferences/com.apple.CoreDisplay useIOP -bool false
defaults write com.apple.CoreAnimation useSoftwareRenderer -bool true
defaults write com.apple.opengl ForceSoftwareRenderer -bool true
defaults write com.apple.CoreImage CISoftwareRenderer -bool true
defaults write com.apple.screencapture disable-shadow -bool true
defaults write com.apple.GPU gpuSwitchingPolicy -int 0
# Spotlight indexlemeyi kapat
sudo mdutil -a -i off
# Crash reporter, auto update, Time Machine kapat
defaults write com.apple.CrashReporter DialogType -string "none"
defaults write com.apple.SoftwareUpdate AutomaticCheckEnabled -bool false
defaults write com.apple.TimeMachine DoNotOfferNewDisksForBackup -bool true
# Siri kapat
defaults write com.apple.assistant.support "Assistant Enabled" -bool false
# Diger optimizasyonlar
defaults write com.apple.spotlight AnimationDuration -float 0
defaults write -g CGFontRenderingFontSmoothingDisabled -bool true
defaults write com.apple.frameworks.diskimages skip-verify -bool true
defaults write com.apple.frameworks.diskimages skip-verify-locked -bool true
defaults write com.apple.frameworks.diskimages skip-verify-remote -bool true
defaults write com.apple.mail DisableReplyAnimations -bool true
defaults write com.apple.mail DisableSendAnimations -bool true
defaults write -g NSDocumentSaveNewDocumentsToCloud -bool false
defaults write com.apple.finder WarnOnEmptyTrash -bool false
defaults write com.apple.desktopservices DSDontWriteNetworkStores -bool true
defaults write -g userMenuExtraStyle -int 1
# Degisiklikleri uygula
killall Dock && killall Finder && killall SystemUIServer
L. Final Running VM Config File
Successfully working /etc/pve/qemu-server/900.conf for reference:
NOTE:
local-lvmis used in the example below. If your server haslocal-zfs, writelocal-zfsinstead oflocal-lvmin the disk lines.
agent: 1
args: -cpu Skylake-Client-v4,vendor=GenuineIntel,+invtsc,+hypervisor,kvm=on,vmware-cpuid-freq=on -device qemu-xhci,id=xhci -device usb-kbd,bus=xhci.0 -device usb-tablet,bus=xhci.0 -global nec-usb-xhci.msi=off -global ICH9-LPC.acpi-pci-hotplug-with-bridge-support=off -global OVMF.Resolution=1920x1080
balloon: 0
tablet: 0
bios: ovmf
boot: order=virtio0;net0
cores: 4
cpu: kvm64
efidisk0: local-lvm:vm-900-disk-0,efitype=4m,size=4M
machine: q35
memory: 8192
name: macOS-VM
net0: virtio=XX:XX:XX:XX:XX:XX,bridge=vmbr0,firewall=1
numa: 0
ostype: l26
scsihw: virtio-scsi-pci
sockets: 1
vga: vmware,memory=256
virtio0: local-lvm:vm-900-disk-1,cache=unsafe,iothread=1,size=100G
M. Problems Encountered and Their Solutions
1. Only Reset NVRAM and Toggle SIP appear in the OpenCore menu
Cause: BaseSystem.img is mounted as media=cdrom. Solution: Import as real disk with qm importdisk.
2. Falling into PXE boot (BdsDxe: failed to load Boot)
Cause: The OpenCore ISO is missing or not mounted as ide0 during boot. The VM could not find any bootable resources and crashed to the network (PXE). Solution: Verify that the OpenCore ISO is mounted as ide0 as media=cdrom. Set boot order:
qm set 900 --boot order='ide0;virtio0;ide2;net0'
Check the configuration: OpenCore ISO should appear in the line qm config 900 — ide0.
3. Kernel installation stuck (#[EB.LD.LKC|R.2] hang)
Cause: CPU flags are missing (+invtsc, vmware-cpuid-freq=on). Solution: Use the full flag set.
4. Proxmox CPU flag conflict (AMD)
Cause: Proxmox's automatically added kvm_pv_eoi/kvm_pv_unhalt flags prevent macOS booting. Solution: Make cpu: kvm64, define the actual CPU model in the line args:.
5. white desktop
Cause: VMware VGA cannot render dynamic wallpapers. Solution: Select a static image from System Settings > Wallpaper.
6. 1280x720 resolution does not change
Solution: From OVMF Setup or add -global OVMF.Resolution=1920x1080 to args. VGA memory must be 256MB.
7. Falling into PXE boot after removing ISO
Cause: EFI copy failed. Solution: Temporarily re-add OpenCore ISO, verify EFI copying.

