Mavericks on the 2014 Mac mini

A few weeks ago, I bought a 2014 Mac mini with the intention of running OS X 10.9 “Mavericks” on it. The Mavericks installer USB, however, failed to boot, just showing the prohibitory symbol. This was a bit disappointing after I had already disassembled, cleaned, repasted, and reassembled the machine… It turns out that this Mac mini is officially only supported by OS X 10.10 “Yosemite” and newer, even though Mavericks fully supports its Haswell architecture.

Unable to find any specific instructions, I spent a few evenings getting Mavericks to run on the Mac mini. The result is a lovely cool and quiet Mavericks machine. All the hardware seems to be supported: the iGPU, SATA, USB, Ethernet, Wi-Fi, and Bluetooth all work, though my Mac mini does not have a PCIe SSD to test. FileVault full-disk encryption is not supported due to the installation method I used[1].

Here’s a screenshot of OS X 10.9.5 on the 2014 Mac mini in all of its skeuomorphic glory:

Mavericks

The rest of this post explains how to install Mavericks on the 2014 Mac mini. If you just want to patch an existing installation or adapt the required patches into an OpenCore configuration, skip ahead to the installation section.

Preparing the installer USB

You will need a USB drive to install Mavericks from. Ensure this drive has a GUID partition table, otherwise it will not be bootable. Turn it into a Mavericks installer USB by running the following commands[1], adapting /Volumes/USB to the mount point of your drive’s partition.

hdiutil attach -nobrowse "/Applications/Install OS X Mavericks.app/Contents/SharedSupport/InstallESD.dmg"

sudo asr restore \
  --source "/Volumes/OS X Install ESD/BaseSystem.dmg" \
  --target /Volumes/USB \
  --erase \
  --noprompt

rm "/Volumes/OS X Base System/System/Installation/Packages"
cp -R "/Volumes/OS X Install ESD/Packages" "/Volumes/OS X Base System/System/Installation/"

hdiutil detach "/Volumes/OS X Install ESD"

The installer USB contains two platform support checks that fail on the 2014 Mac mini. The first check is based on the PlatformSupport.plist and prevents the installer USB from booting on unsupported machines. Add the board and model of the 2014 Mac mini to this file:

/usr/libexec/PlistBuddy \
    -c "Add :SupportedBoardIds: string Mac-35C5E08120C7EEAF" \
    -c "Add :SupportedModelProperties: string Macmini7,1" \
    "/Volumes/OS X Base System/System/Library/CoreServices/PlatformSupport.plist"

The second platform support check is inside the OSInstall.mpkg. It is used by the Install OS X application to disallow installing, and even opening utilities such as the terminal, on unsupported machines. Add the 2014 Mac mini board to this platform support check as well[2]:

cd "/Volumes/OS X Base System/System/Installation/Packages"

pkgutil --expand OSInstall.mpkg OSInstall.mpkg.expanded
rm OSInstall.mpkg

sed -i '' \
    's/\(var platformSupportValues=\)\[\(.*\)\];/\1[\2,"Mac-35C5E08120C7EEAF"];/' \
    OSInstall.mpkg.expanded/Distribution

pkgutil --flatten OSInstall.mpkg.expanded OSInstall.mpkg
rm -rf OSInstall.mpkg.expanded

You now have a Mavericks installer USB that works on the 2014 Mac mini.

Installation

Install Mavericks normally and open a terminal at the end of the installation. If you accidentally restart the machine, just boot from the installer USB again and open a terminal then.

I’ve installed Mavericks on the traditional Macintosh HD partition. If you have installed it elsewhere, make sure you adapt /Volumes/Macintosh HD in the commands below.

The main issue that prevents Mavericks from running on the 2014 Mac mini is the Haswell iGPU driver. The AppleIntelFramebufferAzul.kext in Mavericks does not contain a framebuffer configuration for this Mac mini and this ultimately prevents the GUI from initialising. To fix this, patch in the working framebuffer configuration which I’ve adapted from OS X 10.10.5:

perl -0777 -pi \
    -e 's/\x03\x00\x22\x0d\x00\x03\x03\x03\x00\x00\x00\x02\x00\x00\x30\x01\x00\x00\x00\x00\x00\x00\x00\x60\x99\x14\x00\x00\x99\x14\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x05\x09\x00\x00\x04\x00\x00\x87\x00\x00\x00\x02\x04\x0a\x00\x00\x04\x00\x00\x87\x00\x00\x00\x03\x06\x08\x00\x00\x04\x00\x00\x11\x00\x00\x00\xff\x00\x00\x00\x01\x00\x00\x00\x40\x00\x00\x00\x02\x00\x00\x00\x01\x01\x00/\x0d\x00\x2e\x0a\x00\x03\x02\x02\x00\x00\x00\x06\x00\x00\x20\x02\x00\x00\x20\x02\x00\x00\x00\x60\x99\x14\x00\x00\x99\x14\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x05\x09\x00\x00\x04\x00\x00\x07\x01\x00\x00\x02\x04\x0a\x00\x00\x04\x00\x00\x07\x01\x00\x00\xff\x00\x00\x00\x01\x00\x00\x00\x40\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x8e\x04\x00\x00\x00\x05\x05/;' \
    "/Volumes/Macintosh HD/System/Library/Extensions/AppleIntelFramebufferAzul.kext/Contents/MacOS/AppleIntelFramebufferAzul"

I also recommend adding this Mac-35C5E08120C7EEAF.plist adapted from OS X 10.10.5 to the X86PlatformPlugin.kext for improved power management[3]. Mavericks will boot without it and I did not notice a difference in Intel Power Gadget or sleep behaviour during my limited testing. However, it does prevent the X86PlatformShim::start - Failed to send stepper error from appearing in the logs. Run this command to add the plist:

cp \
    Mac-35C5E08120C7EEAF.plist \
    "/Volumes/Macintosh HD/System/Library/Extensions/IOPlatformPluginFamily.kext/Contents/PlugIns/X86PlatformPlugin.kext/Contents/Resources/"

After these patches, update the kernel extension caches in order to prevent Mavericks from trying to boot with the original unaltered kernel extensions:

touch "/Volumes/Macintosh HD/System/Library/Extensions"
kextcache -update-volume "/Volumes/Macintosh HD"

Finally, the Mavericks platform support check needs to be bypassed. Unlike the installer USB for which we could modify the PlatformSupport.plist, a Mavericks installation will refuse to boot even with a modified platform support plist. Set the -no_compat_check kernel parameter in the NVRAM to bypass the platform check altogether:

nvram boot-args="-no_compat_check"

You can now restart your Mac mini into a fresh Mavericks installation. Happy retro computing!

  1. This method of creating an installer USB allows modifying files which would be protected by signatures on a medium created using the createinstallmedia script. Another benefit is that it avoids expired certificate issues. It will however install OS X without a Recovery HD partition, which prevents use of FileVault FDE. ↩2

  2. Fun fact: the OSInstall.mpkg patch used here is similar to that used to get the Mac OS X 10.6 “Snow Leopard” installation DVDs for the 2011 iMac and MacBook Pro to work with the 2011 Mac mini. This Mac mini, specifically the model with AMD graphics, is a great Snow Leopard machine. Apple seems to have had a habit of releasing some Mac minis just out of support from their most loved operating systems, despite the hardware being compatible.

  3. I adapted this Mac-35C5E08120C7EEAF.plist from OS X 10.10.5, except for the sleep policy, which I took from the other Mac minis’ plists in OS X 10.9.5 given that all Mac minis have the same sleep policy. The frequency vectors in this file are for the 28W TDP models of the 2014 Mac mini.