这里没有我原创的东西,用到的任何驱动任何方法任何脚本任何命令,都是别人的成果,向作者们致敬,心怀感激。
这里讨论的配置是:XPS15-9550 i7-6700HQ HD530 8G-DDR4 1080P THNSN5256GPU7-NVMe-256G DW1830(无线网卡ac+蓝牙4.1LE) Realtek ALC298 (codec:10EC0298,layout-id:13)
之前在论坛10.11版发过一篇教程,写得算是详细了,但是苦于论坛编辑器各种坑,内容总是不能完整 (GitHub完整观摩地址)。所以这次写10.12.1的,就不打算长篇大论手把手什么的了,假设各位童鞋都是有经验的,关键的地方点到为止即可。
这次DSDT不再采取手动修改代码+打补丁的方式了,采用了RehabMan教程提到的Clover热补丁技术。理论上同机型的情况下有一定的通用性,从实际安装成功的例子来看,确实如此。在此基础上,我们的工作量就大大地减少了,你只需要下载10.12.1的系统dmg,制作成安装盘,把我提供的Clover文件夹替换掉U盘EFI(或硬盘EFI)的Clover文件夹,重启,进入系统安装,完成后安装各种第三方驱动,一切就完成了,切记不要再放任何DSDT.aml到ACPI/patched目录。
测试可以直接升级BIOS,而不需要修改任何热补丁,换言之,以往升级BIOS后需要重新提取DSDT修改的工作,在这里可以全免。
Clover采用r4003版本。
- NVMe SSD做系统盘的,深度睡眠唤醒后有可能会导致系统分区崩溃,必须重装系统或者从备份还原,据观察,有部分人会遇到,很不幸我就是其中一位。
- USB3.1和Thunderbolt,以及HDMI,我都没有设备测试。
- 触摸板你可以自行测试最新的VoodooPS2Controller或SmartTouchpad,当然,更推荐的是 @syscl 定制过手势的VoodooPS2Controller。
- 读卡器就不要妄想了…………
- 如果你的4K屏在唤醒后有什么白色线条的话,这个大家说是DELL的问题,等BIOS更新解决吧。
ALC298(3266)-Info
,声卡相关的节点,LayoutID,ConfigData信息,原始Codec,还有从windows10注册表提取出来的PinConfigData,有需要可以自己拿来修改CLOVER-Install
,完整的Clover配置(你下载后自己把名字改回Clover),根据你的需要进行修改。DSDT-HotPatches
,Clover的DSDT/SSDT热补丁dsl源码,可以从RehabMan主页得到。MoreKexts-LE
,安装好系统后再安装的第三方驱动。- 如果你需要修改声卡Layout-ID,请在
SSDT-Config.dsl
修改Name(AUDL, 你的id十进制)
,然后编译成aml,放回ACPI/patched
这个可以自行下载,找pcbeta论坛里10.12.1的DMG就行了
- 如果你已有硬盘EFI分区的Clover,下载原版的DMG也可以
- 没有的话就要找带U盘Clover引导的镜像,这里随便无责任推一个:10.12.1镜像,注意选用原版,不要下错懒人版了。
还是老伙计,Transmac
,网上找个和谐版吧,写入U盘的过程我不说了,参考我上一篇教程,写入完毕后:
-
如果你有硬盘Clover,把你EFI里的Clover文件夹改名成bak,用我的Clover文件夹代替。
-
如果你没有硬盘Clover,那就删除U盘EFI分区里面的Clover文件夹,用我的Clover文件夹代替。
- 不知道如何设置BIOS让U盘的Clover引导启动的话,参照我上一篇教程的BIOS设置部分。
-
把我提供的MoreKext-LE复制到U盘安装系统的分区里(方便你安装系统后立刻可以访问)
-
如果你是4K屏,打开config.plist,在Devices节点下增加一个:
<key>FakeID</key> <dict> <key>IntelGFX</key> <string>0x12345678</string> </dict>
-
如果你是i5,config.plist里的
0x191b0000
还要改成0x19160000
。 -
如果你是i7+1080P,飘过。
感谢 @matri同学反映的4K分辨率问题,之前没留意写上来
用Clover引导安装你写入了U盘的镜像系统,完成并进入系统
据@shiweifu同学的反映,引导时可能会遇到panic并瞬间重启,可尝试在config.plist的SMBIOS 注入内存信息
把我提供的MoreKext-LE复制到桌面,里面有**LE
和VoodooPSController
**文件夹
执行终端命令:
cd 鼠标拖LE文件夹过来
sudo cp -r * /Library/Extensions/
sudo rm -rf /System/Library/Caches/com.apple.kext.caches/Startup/kernelcache
sudo rm -rf /System/Library/PrelinkedKernels/prelinkedkernel
sudo touch /System/Library/Extensions && sudo kextcache -u /
,- 正常情况执行的时候是会显示LE文件夹里那些驱动的名字,30秒左右完成。
- 如果是提示
Lock acquired; proceeding
什么的,等到再次提示执行命令的时候重复执行一次上条命令即可。
sudo spctl --master-disable
,这个是让系统可以安装任何来源的APP
还有个VoodooPSController文件夹,里面有个文件_install.command
,双击运行,输入密码,完成后关闭。
- 终端执行这两条命令:(感谢@yeboxiu同学的测试及纠正)
sudo perl -i.bak -pe 's|\xB8\x01\x00\x00\x00\xF6\xC1\x01\x0F\x85|\x33\xC0\x90\x90\x90\x90\x90\x90\x90\xE9|sg' /System/Library/Frameworks/CoreDisplay.framework/Versions/Current/CoreDisplay
sudo codesign -f -s - /System/Library/Frameworks/CoreDisplay.framework/Versions/Current/CoreDisplay
- 然后把config.plist的Devices下的FakeID整个删除(如果是用Clover Configurator配置,把IntelGFX框清空)。
RehabMan大神在NVME-patch的github主页强调过,用Clover给Kext驱动动态打补丁还是有点危险的(特指nvme驱动的情况下),如果你的OSX系统更新了,原生的NVME驱动随之更新,然后Clover打补丁的时候不一定能完全匹配到所有补丁(因为补丁是有版本针对性的),造成“部分补丁成功”的情况,糟糕的是,OSX系统还加载了这个半成品驱动……引发的后果是,你的磁盘数据可以会被损坏……
所以,大神建议,一旦你过了安装系统的阶段,就应该给NVME驱动打个静态的补丁,生成一个kext驱动,安装到S/L/E或者L/E里,然后删除系统原生的NVME驱动(IONVMeFamily.kext)。
前因后果就这样了,下面的步骤之前,我觉得你应该能联网了(网卡如果和我的一样的话),下面的步骤需要网络支持。
cd ~/Downloads
git clone https://github.com/RehabMan/patch-nvme.git
,如果提示你要安装命令行工具什么的,点击安装,大概等5~10分钟完成,然后再执行一次本条命令才继续下面的操作。cd patch-nvme
./patch_nvme.sh 10_12_1
open .
注意这条命令里有一个点,不是我手抖。然后你发现有个292KB的HackrNVMeFamily-10_12_1.kext
文件
继续看回终端:
sudo cp -r HackrNVMeFamily-10_12_1.kext /Library/Extensions/
sudo mv /System/Library/Extensions/IONVMeFamily.kext /System/Library/Extensions/NVME.bak
,这个意思是,把系统的NVME驱动改名,下次就不会加载了。接下来重建缓存:sudo rm -rf /System/Library/Caches/com.apple.kext.caches/Startup/kernelcache
sudo rm -rf /System/Library/PrelinkedKernels/prelinkedkernel
sudo touch /System/Library/Extensions && sudo kextcache -u /
如果一切顺利,你会在命令行看见列出了你安装过的IntelBacklight、NullEthernet、HackrNVMeFamily-10_12_1
、aDummy.kext,否则等1分钟后再执行一次上述重建命令。
补丁打完了,现在要把EFI分区里Clover的config.plist里面的所有关于IONVMeFamily的补丁删除,请自行用Clover Configurator挂载分区并操作。实在懒的话,可以用我GitHub的Clover-Finish文件夹里的plist覆盖你的。
- 点击右上角的WiFi图标,选择最后一项,在左边列表删除掉所有网络。
- 终端执行
sudo rm /Library/Preferences/SystemConfiguration/NetworkInterfaces.plist
- 系统偏好设置——Language & Region,添加简体中文,Restart now(重启)。
- 等系统重启完了,点击右上角的WiFi图标,选择最后一项,按顺序重新添加以太网,Wi-Fi,应用。蓝牙可以不添加,之后自动会加的。
很多人反映大概率遇到开机无声或者唤醒无声,这里提供另外一个声音方案,也是我目前在用的,唤醒后,耳机还是会有些问题,但总体还是比较好的。
- 移除aDummy.kext,移除ACPI/patched/SSDT-ALC298.aml
- 把我提供的
AppleHDA.kext_mod_10.12.3.zip
解压得到AppleHDA.kext
,把系统原来的/S/L/E下的AppleHDA.kext备份,把我提供的覆盖到/S/L/E/,重建缓存。 - 确保你有安装
CodecCommander.kext
,然后把alc_fix.zip
解压,执行命令:- cd alc_fix
- chmod +x install.sh
- ./install.sh
既然说了是点到为止,那就到此为止好了,本来怕有同学是U盘引导的,还想说说如何把Clover安装到硬盘,不过我上一篇教程里都有提过了,实在是不该再重复劳动了。
我总是有一种怕别人看不懂我文章,或者怕读者遇到和我文章描述的情况不同的时候该怎么办,后来想想,大概这是一种病了,哪里担心得了那么多呢,你会遇到的问题,几乎都有人遇到过,多搜索,然后再发帖提问吧。
完美黑苹果的路还很远,大家一起努力!
考虑下如果系统在线升级了,原生IONVMeFamily.kext又被装回来了的情况下可怎么办?这里翻译一篇RehabMan的教程,让破解驱动与原生驱动共存。有动手能力的可以试试,我?当然是试过了才发出来的嘛……做完之后10.12.1直升10.12.2成功。
方法是RehabMan原贴提出的。
- 下文提到的原生NVMe驱动指:IONVMeFamily.kext
- 破解脚本生成的NVMe驱动指:HackrNVMeFamily*.kext
这个方法的原理是伪造一个不存在于原生驱动的IOPCIClassMatch取值范围内的class-code来让其不加载。
- 分两步实现:
- 注入一个“非常规”的class-code使得原生NVMe驱动不加载
- 修改HackrNVMeFamily*.kext的Info.plist里的IOPCIClassMatch的值
要注入一个伪造的class-code
,我选择用ACPI的方式(用一个SSDT)。前提是你必须知道你的SSD在PCI0设备的路径是什么。
在我的NUC6i7KYK
机子里,路径是_SB.PCI0.RP13.PXSX
,这个每台电脑都不一定相同的,和你的ACPI表、SSD插在哪个槽都有关,你可以用 ioreg 或者 Windows设备管理器 来确定,如下图。
因此,用于注入非常规class-code
的SSDT代码如下:
// Inject bogus class code for NVMe SSD so that native IONVMeFamily.kext does not load
DefinitionBlock("", "SSDT", 2, "hack", "NVMe-Pcc", 0)
{
External(_SB.PCI0.RP13.PXSX, DeviceObj)
Method(_SB.PCI0.RP13.PXSX._DSM, 4)
{
If (!Arg2) { Return (Buffer() { 0x03 } ) }
Return(Package()
{
"class-code", Buffer() { 0xff, 0x08, 0x01, 0x00 },
})
}
}
//EOF
在这个SSDT被加载之后,HackrNVMeFamily*.kext(破解脚本生成的驱动)和 原生NVMe驱动 都不会加载了,因为IOPCIClassMatch的值不匹配。
我们需要修改HackrNVMeFamily*.kext的IOPCIClassMatch的值为我们的非常规class-code:0x0108ff00&0xFFFFFF00
。
-
如果你是用文本编辑器改plist的话,改成这样:
<key>IOPCIClassMatch</key> <string>0x0108ff00&0xFFFFFF00</string>
-
高端点,用Xcode改的话:
你可以把这种方法用于引导安装OSX或者用于安装好系统之后,它可以让你在系统升级之后依然能够使用HackrNVMeFamily*.kext来驱动,直到你想为新的原生NVMe驱动打破解补丁为止。
当然也可以用config.plist/Devices/Arbitrary
来注入伪造的class-code。
在Clover的引导画面,你可以按F2键来得到preboot.log(生成在EFI/Clover/misc/preboot.log),它可以帮你确定PCI设备的地址。
0:100 0:000 === [ GetDevices ] ========================================
0:100 0:000 PCI (00|00:00.00) : 8086 1910 class=060000
0:100 0:000 PCI (00|00:02.00) : 8086 193B class=030000
0:100 0:000 - GFX: Model=Intel Iris Graphics P580 (Intel)
0:100 0:000 PCI (00|00:08.00) : 8086 1911 class=088000
0:100 0:000 PCI (00|00:14.00) : 8086 A12F class=0C0330
0:100 0:000 PCI (00|00:14.02) : 8086 A131 class=118000
0:100 0:000 PCI (00|00:16.00) : 8086 A13A class=078000
0:100 0:000 PCI (00|00:1D.00) : 8086 A118 class=060400
0:100 0:000 PCI (00|01:00.00) : 144D A801 class=010601
0:100 0:000 PCI (00|00:1D.04) : 8086 A11C class=060400
0:100 0:000 PCI (00|02:00.00) : 144D A802 class=010802
0:100 0:000 PCI (00|00:1F.00) : 8086 A14E class=060100
0:100 0:000 PCI (00|00:1F.02) : 8086 A121 class=058000
0:100 0:000 PCI (00|00:1F.03) : 8086 A170 class=040300
0:100 0:000 PCI (00|00:1F.04) : 8086 A123 class=0C0500
0:100 0:000 PCI (00|00:1F.06) : 8086 15B7 class=020000
你可以看到950 Pro NVMe在PCI地址:02:00.00(设备:144d:a802,注意常规的NVMe class是:010802)
因此,在Devices/Arbitrary
里这样填:
可别忘了,当你启用了Devices/Arbitrary,所有Clover自动化注入的行为都会被取消掉(例如Graphics/Inject里的内容),因此,那些自动注入项都要你自己手动在Devices/Arbitrary或者ACPI再注入一次。
-
用ioreg找到自己的NVMe SSD所在的PCI位置路径,我的是
_SB.PCI0.RP09.PXSX
。 -
把原生NVMe驱动(上面被我们改成了NVME.bak)改名回IONVMeFamily.kext,再用RehabMan的脚本生成破解的HackrNVMeFamily*.kext驱动,
修改Info.plist,我用,现在可以用脚本参数:PlistEditPro
改的,把IOPCIClassMatch改成:0x0108ff00&0xFFFFFF00
./patch_nvme.sh --spoof 10_12_1
直接生成修改好class-code的破解驱动,然后把它安装到/Library/Extensions里,重建缓存。 -
用上面提供的SSDT代码(SSDT-NVMe.dsl)生成一个
SSDT-NVMe.aml
(记得修改RP13为你的),放到ACPI/patched里加载,重启。重启完一切正常,在系统信息里查看IONVMeFamily.kext是没有载入的,签名是Apple的。 -
有系统升级时照常升级,等新版本的NVMe破解脚本出来后再执行一次第2步,懒的话也可以什么也不做。比如我目前是10.12.1,到了12月14日,10.12.2正式版出来了,然后我直接App Store更新系统,5分钟左右就升级成功了,系统使用一切正常,当然4K的要注意FakeID和补丁,下面有讨论到。
-
如果你是1080P
- 完成
NVMe驱动,破解与原生的共存
的操作,你可以直接在AppStore里升级,我就是这样升级到10.12.2的。
- 完成
-
如果你是4K
-
完成
NVMe驱动,破解与原生的共存
的操作, -
在升级前把config.plist修改,在Devices下增加:
<key>FakeID</key> <dict> <key>IntelGFX</key> <string>0x12345678</string> </dict>
-
升级完系统之后再执行终端命令:
sudo perl -i.bak -pe 's|\xB8\x01\x00\x00\x00\xF6\xC1\x01\x0F\x85|\x33\xC0\x90\x90\x90\x90\x90\x90\x90\xE9|sg' /System/Library/Frameworks/CoreDisplay.framework/Versions/Current/CoreDisplay sudo codesign -f -s - /System/Library/Frameworks/CoreDisplay.framework/Versions/Current/CoreDisplay
-
然后把config.plist的Devices下的FakeID整个删除(如果是用Clover Configurator配置,把IntelGFX框清空)。
-
确实有这样的情况,我一共遇到过4次,一旦出现,你除了重新安装系统、TimeMachine还原,别无他法
(如果有,请告诉我,万分感谢!)
- 触发条件:NVMe SSD是系统盘,从深度睡眠唤醒,有小几率发生
- 情况分为两种:
- 唤醒后打开任何APP都崩溃,只能重启系统。一旦重启,你会卡在Verbose画面,提示读取某些文件出问题。
- 唤醒后直接自动重启或开盖后处于关机状态,需要手动开机,进入Clover画面,只有macOS启动项消失了,其他Recovery HD、Windows等启动项还存在。
遇到情况1,尝试过用引导U盘来进入安装系统时的磁盘工具,急救,失败,退出代码8。尝试用终端手动fsck_hfs -fy,失败。
遇到情况2,进入RecoveryHD,打开磁盘工具,macOS分区急救也失败,退出代码8。
针对这个严重的问题,我请教过@syscl ,他提到Clover的HWPEnable
为true时会导致黑苹果在休眠状态下数据严重损坏,但是我有三次崩溃都没有开启HWPEnable
,所以我觉得原因不是这个。
绝对排除了在Windows安装HFS+读取软件导致的问题,我没有安装这类软件。
我开头也怀疑过是NVMe驱动破解有问题导致的,但是我的NVMe SSD划分为两个分区,另外一个文件系统是exFAT,资料完完整整没有损坏,只有AFS系统分区完全损坏了。
已经有多个人遇到这种情况了,目前还没有找到具体原因。
我11月中安装的10.12.1系统,使用期间直接升级到10.12.2用了半个月,到12月30日崩溃了,很沮丧,各位都时刻准备好TimeMachine吧,祝你好运!