NVRAM能否正常支持,是判断黑苹果完美程度的一个因素。NVRAM是一个储存芯片,用来保存蓝牙参数,亮度与音量,启动磁盘等等,还有就是储存iMessage与FaceTime的参数。比如更先进的Opencore引导,没有设置默认启动磁盘的地方,而就是靠设置-启动磁盘,里面你的选择。这和白苹果几乎无区别了。而你选的启动磁盘就被保存到NVRAM里等待下次开机读取,如果没有驱动好NVRAM,会导致Opencore无法更改启动磁盘。

但是,并不是所有的主板自带的NVRAM都支持macOS。测试自己的NVRAM能否被支持使用,即能否驱动原生NVRAM,请参阅教程

https://khronokernel-2.gitbook.io/opencore-vanilla-desktop-guide/post-install/post-install/nvram#emulated-nvram

 

200系列芯片组请自测。目前已知300芯片组除了Z370之外都无法使用原生NVRAM,因为Z370是200系列芯片组马甲,不是真正的300系列芯片组。比如B360 B365 H310 H370 Q370 Z390均不支持原生NVRAM。

所以我们为了黑果的完美,需要模拟NVRAM,我们使用EmuVariableUefi。
但是注意!Clover作者明确指出:安装Clover时勾选了EmuVariableUefi,但没有勾选RC脚本,这样等于什么都没做。所以一定要勾选RC脚本。只在drivers里放EmuVariableUefi等于没放,再强调一遍。

正确安装后重启两次,会在EFI分区内看到NVRAM.plist,这样代表模拟NVRAM已经正确工作。

终端运行代码

获取root权限

sudo -s

清空NVRAM,需要关闭SIP

sudo nvram -c

清空后设置一个显示MissFeather的内容,需要输入密码

sudo nvram TestVar=MissFeather

重启电脑,打开终端,输入

sudo nvram -p | grep 'TestVar'

 

如果看到TestVar MissFeather的字样,表示你的主板支持原生NVRAM,如果不显示,表示你的主板需要打一个修复补丁。

如果可以正常显示后,可以清除设置,我也不知道如何称呼,编程一般叫变量。

sudo nvram -d TestVar

如果清除出错,显示下面的内容

nvram: Error clearing firmware variables: (iokit/common) not permitted

 

以四叶草引导举例,去 /EFI/Clover/Drivers/UEFI 目录找到:

# 文件系统
apfs.efi 替换为 ApfsDriverLoader.efi
# 内存补丁
OsxAptioFix2Drv.efi 替换为 AptioMemoryFix.efi
# 如果是300系主板:
OsxAptioFix2Drv.efi 替换为 OsxAptioFixDrv.efi
# 如果依旧无法重置NVRAM,删除:
EmuVariableUEFI.efi

如果删除 EmuVariableUEFI-64.efi 可能导致 iMessage 无法登陆或异常。替换文件前,务必做好文件备份。

 

NVRAM 如何重置

Clover 用户可在引导选择系统界面按下 F11 重置 NVRAM(如果你使用的是模拟,清空的只是模拟的 NVRAM);

OpenCore 用户在引导菜单中选择 Reset NVRAM 即可。

OpenCore 的重置 NVRAM 功能非常彻底,可能会把你已有的引导项一起重置消失掉;处在 Clover 转换到 OpenCore 阶段时,如果重置后再次使用 Clover 可能会提示“您的电脑因为出现问题而重启”,新手谨慎使用;

 

如果想要删除指定内容,例如要删除每次开机出现的 “您的电脑因为出现问题而重启” 的信息(也就是 Kernel Panic 后遗症):

sudo nvram -d aapl,panic-info

 

如果清除出错,显示下面的内容

nvram: Error clearing firmware variables: (iokit/common) not permitted

 

首先,确认你关闭了SIP(系统完整性保护),再次尝试清空命令;

如果是 OpenCore 用户,检查 Booter → Quirks → DisableVariableWrite,设置为 NO(不勾选);使用 OcQuirks.efi 的 Clover 用户也注意该项设置为 False;

Clover 用户删除 /EFI/Clover/drivers64UEFI/ 目录以及目录下的所有文件(删除文件前,务必做好备份。);

在 /EFI/Clover/Drivers/UEFI 目录:

apfs.efi 替换为 ApfsDriverLoader.efi,如果两个都有,删除 apfs.efi;

内存修复驱动 OsxAptioFixDrv.efi/OsxAptioFix2Drv.efi/OsxAptioFix3Drv.efi 替换为 AptioMemoryFix.efi,或使用 OcQuirks.efi 替代;

如果你的主板使用 AptioMemoryFix.efi 可以不计算 slide 正常工作(具体表现是启动时不卡++++号),这是最理想的情况

如果卡在++++号可以试试添加引导参数 slide=0(可能影响休眠),或计算 slide值;

不推荐使用 OsxAptioFix2Drv-free2000.efi,因为作者自曝这个驱动可能会永久性损坏你的主板;

删除 EmuVariableUEFI.efi;

EmuVariableUEFI.efi 是用于模拟 NVRAM 的 efi 驱动,如果删除可能导致 iMessage 无法登陆或异常.

删除各个 EFI 分区下的 nvram.plist 文件,如果你使用过 Clover 的 RC 脚本,还需删除以下文件。并重启系统。删除或替换文件前,务必做好文件备份。

/etc/rc.clover.lib/etc/rc.boot.d/10.save_and_rotate_boot_log.local 
/etc/rc.boot.d/20.mount_ESP.local 
/etc/rc.boot.d/70.disable_sleep_proxy_client.local.disabled 
/etc/rc.shutdown.d/80.save_nvram_plist.local​

将 /EFI/Clover/kexts/other/ 目录下的 FakeSMC.kext 及其传感器 kext 全部删除,替换为 VirtualSMC.kext 及其传感器 kext,删除 /EFI/Clover/Drivers/UEFI/ 目录下的 smchelper.efi,加入 virtualsmc.efi,重启。

重启后,在 Clover 系统选择界面按下 F11,这是 Clover 重置 NVRAM 的操作,此时系统可能会再次重启。

如果以上方法均无效,台式机请拔掉电源,并取下主板上的纽扣电池,静置5分钟,重新装回电池再试。

到这里,绝大部分的主板应该已经解决问题(部分主板可能还需要添加本文后面提到的 SSDT)。

对于拥有原生 NVRAM 的主板,以上是该问题的所有常用处理办法。

 

NVRAM 支持情况

已知原生支持NVRAM的主板

技嘉 5、6、7、8、9 系;
华擎 8 系;
微星 9 系;
华硕 8 系,100系(早期BIOS版本);
英特尔 6 系;
Z370;
绝大多数 Z370 都具备原生 NVRAM,仅需要 AptioMemoryFix.efi 即可,或使用 OsxAptioFix2Drv.efi/OsxAptioFix3Drv.efi 配合 slide 值计算(新手强烈不推荐自行计算,十个新手八个找不到,还有一个算错,直接试一下 slide=0 这个引导参数)。

 

已知没有原生NVRAM的主板

技嘉 100 系;
华硕 100 系(较新BIOS版本);
已知部分 X99、X299 配备的 NVRAM 和 macOS 不兼容;
99% 的 B360、B365、H310、H370、Z390 “不具备”原生NVRAM;

对于没有 NVRAM 支持的主板,下面推荐2种解决办法,第一种是使用 SSDT 补丁开启原生支持,主要针对300系主板;如果你的主板无法使用 SSDT 方案,参考第二种办法,使用模拟。

 

使用 SSDT 补丁开启 NVRAM

为什么目前 300 系的主板,B360、B365、H310、H370、Z390 主板“不具备”原生NVRAM?答案其实很扯,是因为英特尔“忘记了”将 FW 芯片真正声明为 ACPI 中的 MMIO,因此 XNU 将忽略 UEFI 内存映射声明的 MMIO 区域。因此,NVRAM SMM 页面错误地出现在未映射的页面访问上。

原文:

Intel “forgot” to actually declare the FW chip as MMIO in ACPI and so XNU will ignore the MMIO region declared by the UEFI memory map. And so NVRAM SMM page fault’ed on unmapped page access, oh what fun!

 

所幸,在 OpenCorePkg 的开发堆栈中,有爱好者贡献了一个 SSDT 用以解决这个问题。

虽然来自 OpenCore 的开发堆栈,但这个 SSDT 并没有绑定到 OpenCore,Clover 用户也是可以使用的,因为能否使用其实取决于你的主板有没有 LPCB,这个在 Z390 主板上非常常见,可以通过 IORegistryExplorer.app 搜索 PCI0 → LPCB。

IORegistryExplorer.app:https://www.mfpud.com/topics/82/

 

提取反编译SSDT和DSDT

Clover 用户请将其放入 EFI/CLOVER/ACPI/patched

OpenCore 用户请将其放入 EFI/OC/ACPI(注意在 OpenCore 的 config 文件中启用).

 

删除模拟 NVRAM 残留文件

如果你使用过模拟 NVRAM,请依次删除以下文件,注意某些项目可能需要 关闭 SIP 才能删除(如果你使用的是 RC 脚本)

/Volumes/EFI/EFI/CLOVER/drivers/UEFI/EmuVariableUefi-64.efi
/Volumes/EFI/nvram.plist
/etc/rc.clover.lib/etc/rc.boot.d/10.save_and_rotate_boot_log.local
/etc/rc.boot.d/20.mount_ESP.local
/etc/rc.boot.d/70.disable_sleep_proxy_client.local.disabled
/etc/rc.shutdown.d/80.save_nvram_plist.local​

OpenCore 用户只需要关闭以下项目即可:

Booter -> Quirks -> DisableVariableWrite -> False
NVRAM -> LegacyEnable -> False

最后,不要忘记删除各个 EFI 分区下的 nvram.plist 文件。都完成后,可以返回本文开头部分测试 NVRAM 是否开启成功。

 

使用 CloverDaemon 模拟 NVRAM

如果你的主板不能使用 SSDT 方案,可以考虑使用 Clover.app 辅助程序安装 CloverDaemonNew,CloverDaemonNew 是一个全新设计的 Clover 守护程序(需要 Clover r5040以上版本),主要用于替代 RC 脚本实现 NVRAM 功能(CloverDaemonNew 和 RC 脚本必须二选一,非常不推荐使用 RC 脚本)。

Clover.app 下载:https://github.com/CloverHackyColor/CloverBootloader/releases

安装成功后,重启电脑,在 EFI 目录看到 NVRAM.plist 文件即代表成功。

 

如果重启后仍然没有出现 NVRAM.plist

如果你的主板安装了 CloverDaemon 重启后仍然没有出现 nvram.plist,注意需要额外的模拟驱动。处理办法是使用 Clover.app 安装相应的 efi 驱动文件,请确保 Clover 是 UEFI 模式安装,运行在 UEFI 引导模式,安装驱动文件中的 EmuVariableUefi.efi,安装好后,重启两次就应该会生效。

 

现在可直接编辑 nvram.plist,也可以使用命令操作,例如:

sudo nvram -xp

可以显示 NVRAM 的所有条目。

这时可以使用:

sudo nvram -d keyname

建议成功生成 NVRAM.plist 后使用以下命令清空一次 NVRAM(注意现在清空的只是模拟的 NVRAM):

sudo nvram -c