Running macOS Sonoma 14 on VMware
This guide shows you how to configure a usable instance of macOS Sonoma on the latest version of VMware, either Workstation or Player. If everything is configured properly, your emulated macOS instance should be fast enough for xCode, general web browsing (including playing Youtube videos), and other common tasks.
Hardware requirements
At least 16GB of RAM and a quad-core 13th generation Intel i7 CPU is recommended for the host. For best performance, you will need 32GB of RAM and eight-core CPU. Configure at least 160GB of hard disk space and half of the available resources for the emulated macOS, e.g. 2 cores and 8GB of RAM for a host that has 4 cores and 16GB of RAM. A dedicated graphics card such as NVIDIA or AMD Radeon will be good to have but not strictly required for the host. My setup works perfectly fine on Intel Iris Xe on an Acer Swift X laptop. If you are using an AMD CPU, you can still use this guide as a reference to get macOS 12 (and older) to run on VMware; you however won’t be able to get macOS 13 or later to work – read more below.
Host OS optimizations
To maximize efficiency, use Linux, preferably Ubuntu 22, or Debian 12 (if you have the time and skills), as the host. If you use Windows 11, which consumes a lot of CPU resources for many unnecessary background services, your emulated macOS will not perform optimally. Configure Ubuntu to have at least 16GB of swap space. A swap partition is preferred but a swap file should work just as well. This is critical for smooth performance of the guest OS. VMware for Linux will warn you if the swap space is insufficient.
Disable the Totem video encoder; otherwise Ubuntu will at times consume 100% CPU resources trying to generate video thumbnails:
sudo apt-get remove totem-gstreamer totem-common
Create an ext4 partitions on the main disk drive, dedicated to store the VMware images. Ext4 is the native filesystem of Linux and hence we will not need any third party tool such as ntfs-3g, which would add more processing overheads. If you have to use NTFS, mount the partition with big_writes parameter. Do not use FAT32 (due to the 4GB file size limit) or exFAT, which is prone to corruption.
Basic macOS installation
First, remember to patch VMware to allow macOS guests on non-macOS host, for example by using DrDonk unlocker. Configure the virtual machine to use VMware workstation 8 compatibility and hardware version 20:
config.version = "8" virtualHW.version = "20"
Inside the VMX file, also update SMBIOS settings:
smbios.reflectHost = "TRUE" hw.model = "MacBookPro14,3" board-id = "Mac-551B86E5744E2388" smc.version = "0"
Select vmxnet3 for the Ethernet card and USB 3.0 for the USB ports, since Apple has removed USB 2.0 support in recent version of macOS. Configure at least 160GB of emulated hard disk space. Make further tweaks to the VMX file as below for better video rendering:
svga.vramSize = "268435456" vmotion.checkpointFBSize = "134217728" vmotion.checkpointSVGAPrimarySize = "268435456" vmotion.svga.mobMaxSize = "268435456" vmotion.svga.graphicsMemoryKB = "262144"
Download the appropriate ISO installer image for macOS Sonoma (for example from archive.org), and use the ISO to install macOS on VMware. Once installation is done, use the ISO provided in the same unlocker package to install VMware Tools and reboot the host. Disable any power savings or screen saver settings within Sonoma, otherwise the system may hang once these power savings settings are activated. To be safe, disable Software Updates, or maybe set it to manual, and only perform updates after you have taken a snapshot of your working machine.
If your machine doesn’t boot, spoof the CPUID so that the emulated macOS will see a CPU that it supports:
cpuid.0.eax = "0000:0000:0000:0000:0000:0000:0000:1011" cpuid.0.ebx = "0111:0101:0110:1110:0110:0101:0100:0111" cpuid.0.ecx = "0110:1100:0110:0101:0111:0100:0110:1110" cpuid.0.edx = "0100:1001:0110:0101:0110:1110:0110:1001" cpuid.1.eax = "0000:0000:0000:0001:0000:0110:0111:0001" cpuid.1.ebx = "0000:0010:0000:0001:0000:1000:0000:0000" cpuid.1.ecx = "1000:0010:1001:1000:0010:0010:0000:0011" cpuid.1.edx = "0000:1111:1010:1011:1111:1011:1111:1111" featureCompat.enable = "FALSE"
On an AMD CPU, this modification will only work on macOS 12 and older. As all versions of macOS do not support Intel CPUs 11th generations or newer, the above modification spoofs the CPU leaf to report a CPU that is supported by macOS. Starting from macOS 13 Ventura, the kernel will try to read CPUID leaf 4 which cannot be overridden in the VMX file. The kernel will have to be patched, by means of OpenCore or EFI modifications to get things to work.
After that, adjust the screen resolution of the guest – remember to select the Scaled (High DPI) options if your machine has a high DPI display, e.g. a 14-inch laptop LCD with 1920×1080 display:
With this, your emulated macOS Sonoma should be basically working. Web browsing should be working and YouTube video playback should work. Refer to the sections below for further performance tweaks.
User interface optimizations
If macOS works but does not recognize the Apple key (mapped to Windows key), e.g. Apple-A to select all or Apple-C to copy, this is because this key has been taken over by a feature in Ubuntu known as Superkey. To disable this, you must disable Wayland (which is the default in Ubuntu 22) – and switch to xOrg, then reboot:
sudo nano /etc/gdm3/custom.conf [daemon] # Uncomment the line below to force the login screen to use Xorg WaylandEnable=false
After that, review the screen resolution and display scaling settings in Ubuntu, then open macOS settings and adjust the resolution if needed. If you are on a high DPI settings, select the corresponding high DPI resolution, else the display will look too small. Inside Settings > Accessibility > Typing, disable Screen Keyboard, otherwise the touch keypad will popup randomly when using physical keyboard a laptop with touch screen.
If the system is slow when minimizing windows, under Preferences > Accessibility > Display, enable Reduce Motion. Inside Preferences > Dock and menu bar (or Window & Dock), select Minimize using scale effect (and not Genie Effects). Under Double click a window title bar, select Do Nothing as the maximizing animation will cause slowness. Also enable Minimize window into application’s icon; otherwise the window will minimize into dedicated area on the right of the dock and could take as long as 10 minutes. If the docker disappears suddenly, go to Settings > Dock/desktop and toggle Automatically hide dock.
To make the interface even more responsive, use TinkerTool and disable as many animations as possible. If your Mac is still slow after all these steps, read this for other troubleshooting hints,
To further improve responsiveness, remember to avoid drag and drop as much as possible. For example, use Move to Bin instead of dragging and dropping files to the trash.
Touch screen usage
The touch screen works inside macOS but supports single tap only as macOS has no touch screen so it doesn’t support gesture like scrolling. Touch works great inside iOS simulator, which requires at least 16GB of RAM on macOS, as iOS simulator will need 8GB to work smoothly. If the touchpad cannot be used and the mouse pointer is disabled, check to see if it is accidentally disabled in bios or via function key (e.g. Fn-F10). If the pointer disappears after using the touch screen, reboot macOS or reconnect your USB mouse.
Connecting iPhone via USB
If you can’t mount your iPhone inside macOS because it keeps disconnecting with driver error message, you cannot work around by setting VMware to emulate a USB 2.0 controller (instead of 3.1). This is because macOS Ventura and later versions have removed USB 2.0 support and your emulated keyboard/mouse will stop responding.
The first thing to try is to disable USB MUX service:
sudo systemctl mask usbmuxd sudo systemctl stop usbmuxd
To re-enable later:
sudo systemctl unmask usbmuxd sudo systemctl start usbmuxd
If this doesn’t work, try to also kill GVFS service:
sudo killall gvfs-afc-volume-monitor
if it still doesn’t work, try adding usb.quirks.device0 = “0xvid:0xpid skip-refresh” to the VMX file. Also read this and this for more information.
Optimizing network performance
If upload speed is slow via 3rd party apps such as SourceTree, Google Drive or OneDrive, but running speedtest.net from Safari still reports a fast connection, it is most likely because of incompatibilities betwen TCP Segmentation Offload (TSO) and Large Receive Offload (LRO) settings with the vmxnet2 and vmxnet3 drivers. The issue appears to be due to the fact that LRO seems to be off by default. To check this, open Terminal and run:
sudo sysctl -a | grep net.inet.tcp.lro
to check the LRO status. To turn it on run:
sudo sysctl -w net.inet.tcp.lro=1
Similarly, TSO seems to be on by default. Check with:
sudo sysctl -a | grep net.inet.tcp.tso
To turn it off run:
sudo sysctl -w net.inet.tcp.tso=0
which will take effect almost immediately and improve the connection speed.
To have any sysctl settings persist between restarts you should create /etc/sysctl.conf and add a row of text like net.inet.tcp.tso=0. With both LRO off and TSO off, connection speed via third party apps should be fast. It seems Safari uses Apple’s own API to send network traffic and is not affected by the LRO/TSO settings. For further reading, read this and this.
Miscellaneous tweaks
To show more command line history lines edit ~/.bash_profile and set the following, then restart terminal.
# history size export HISTFILESIZE=1000000 export HISTSIZE=1000000
To note, by default the history command on macOS only shows the last 10 commands regardless of settings. To show more commands, type something like history 20 to show all commands since line 20.
You might also want to consider installing Homebrew as the package manager. After that, install w3m, a text browser which is much better than lynx with no cookie prompt and works well even for modern web pages. The w3m browser still does not have Javascript support, something that is frankly quite hard to achieve from a terminal browser.
Conclusion
With the above tweaks and optimizations, I am able to comfortably use the instance for daily macOS and iOS app development, configured for 16GB of RAM and 256GB hard disk:
The setup is nowhere as fast as a real MacBook or Mac Mini but should be good enough for developers who require both macOS and Windows functionality on a single machine, providing the best of both worlds without the need for separate devices.
See also
Getting xCode to run on unsupported versions of macOS