OS X El Capitan 10.11: Chameleon, iMessage, NVRAM
Published on January 28, 2016

I’d like to talk about iMessage, El Capitan and Yosemite.
Note: Apple neither supports nor licenses OS X on third-party hardware. This describes what I did on my own machine in 2016; the tools and values have long changed. Follow it at your own risk.
I’ve been using Mac OS X on a Maximus V Gene motherboard with an i7-3770K processor for quite some time now. With the introduction of Yosemite I needed to figure out a way to make iMessage work, as Apple introduced changes around the same time that validate the MLB and ROM values reported by the system and the NVRAM.
Here’s my basic setup: Chameleon boot loader (previously the regular flavor, now ENOCH), drop in the Chameleon.plist, insert SMBIOS.plist, FakeSMC and the IntelE1000 Ethernet kext, and my system is working. To enable iMessage I had to install the FileNVRAM.kext and FileNVRAM.dylib files (1.1.4 package) onto the USB stick containing the Chameleon boot loader. With this setup, I was able to boot Yosemite fine and get a working NVRAM. However, keep in mind that you have to create the /Extra folder on the hard drive of your OS X install and make it writable by anyone. Then FileNVRAM.kext is able to create the nvram.1d34-12d4d1234-1d341234.plist file ( 😉 ) which contains the data you have written. Whenever I needed to boot the system with -v -f or when doing software updates, I had to use a second Chameleon stick that did not include the FileNVRAM kext and dylib files. (If booting with -v -f and FileNVRAM installed, the system would crash while caching the kexts.) I would then boot the system, run Kext Utility or a similar permissions-checking and kext-caching application, and reboot with the FileNVRAM USB stick. This was my full working arrangement. Tedious, but it worked excellently. I never had a problem with iMessage, FaceTime, iPhone calls, the App Store, iTunes or iCloud. So far so good, but it was time to move to El Capitan.
In El Capitan I encountered the problem that kexts cannot be passed through the Chameleon boot loader but have to be installed directly into /System/Library/Extensions and have to be cached by a running system (usually by just booting the same SSD from a real Mac). This put me in a predicament with FileNVRAM.kext, which had to be loaded through Chameleon as it wouldn’t boot otherwise. So by trial and error I examined a problem with FileNVRAM.kext on 10.11.3 which resulted in it not being loaded, no matter where you put it. The reason? The Info.plist of FileNVRAM.kext contains the following:
<key>OSBundleLibraries</key>
<dict>
<key>com.apple.iokit.IOStorageFamily</key>
<string>1.0b1</string>
<key>com.apple.kpi.bsd</key>
<string>8.0b1</string>
<key>com.apple.kpi.iokit</key>
<string>7.0</string>
<key>com.apple.kpi.libkern</key>
<string>8.0d0</string>
<key>com.apple.kpi.mach</key>
<string>8.0d0</string>
<key>com.apple.kpi.unsupported</key>
<string>8.0b1</string>
</dict>
Not sure if you spotted the error yourself, but the IOStorageFamily version is too low for El Capitan. This OS X ships with 2.1 instead and the kext simply refuses to load. If you change this value in the Info.plist file, the kext becomes loadable. This is more of a dirty patch than a correct solution. So here is what happens next: I got my El Capitan working again with the same approach as above, but without any FileNVRAM module or kext anywhere, neither in Chameleon nor in OS X. With the system booted up, I would install FileNVRAM.kext into /System/Library/Extensions, into /Extra/Extensions on the Chameleon stick and into the /Extra/Extensions folder on the hard drive. Same with the module: /Extra/Extensions on both the hard drive and the Chameleon stick. Now I would have to run Kext Utility again to precache FileNVRAM.kext into the system and reboot. Sometimes it wouldn’t boot up, sometimes it would “break” the system (fixable by dropping FileNVRAM from all locations, touching /System/Library/Extensions and running kextcache -u / from single-user mode or an external system), but most of the time it just works. NVRAM is capable of saving and creating the /Extra/nvram.xxxxxx.plist file and returning the required MLB/ROM values after being saved, even after a reboot. Thus I have managed to get FileNVRAM.kext working in El Capitan with this trick.
My hope is that someone is capable of updating FileNVRAM.kext for El Capitan and its latest Xcode. The kext itself is still working, but the dependencies are off and are causing the issues.
Image credits: Apple Inc.