NVRAM是什么?为什么对黑苹果重要?
概述
本文最后更新:2020年8月13日
这是一篇关于NVRAM的基础教程,如果未能解决您的疑问,请见谅。
根据 Wikipedia,非易失性随机存取存储器(Non-Volatile Random-Access Memory,NVRAM)是一种随机存取存储器,在电源关闭时会保留其信息(具备非易失性)。这与动态随机存取存储器(Dynamic Random-Access Memory,DRAM)和静态随机存取存储器(Static Random-Access Memory,SRAM)形成对比,后者仅在通电时才保持数据。
NVRAM通常以一块芯片的形式存在,所以系统是否支持NVRAM,取决于主板。NVRAM在黑苹果中有及其重要的作用,第一,是用于重启后保存与蓝牙、屏幕亮度、系统音量、iMessage、FaceTime等相关参数;第二,Clover和OpenCore需要NVRAM支持才能支持系统启动磁盘设置(例如Bootcamp功能);第三,用于支持NVIDIA Web Driver Manager等相关功能。配置功能完善的NVRAM,会让你的黑苹果系统完善,较白苹果来讲上述功能几乎没有区别。
NVRAM 支持测试
运行终端进行以下测试,即可知晓自己的主板是否支持NVRAM:
sudo -s
这一步是获取root权限,自行百度一下方法。接下来输入:
sudo nvram -c
这一步是清空 NVRAM,需要关闭SIP,具体方法参考这里;如果你卡在了清空 NVRAM 这一步,说明当前的 NVRAM 设置是有问题的。如果正常,输入以下命令,执行后重启:
sudo nvram TestVar=RandomString
重启后,终端执行以下命令:
sudo nvram -p | grep 'TestVar'
如果你看到终端输出了包含“TestVar RandomString”的结果,则NVRAM正在正常运行;如果没有,则NVRAM需要打补丁修复,iMessage可能无法正常工作。测试完成后,可以运行以下命令清除产生的垃圾代码:
sudo nvram -d TestVar
NVRAM 如何重置
- Clover 用户可在引导选择系统界面按下 F11 重置 NVRAM(如果你使用的是模拟,清空的只是模拟的 NVRAM);
- OpenCore 用户在引导菜单中选择 Reset NVRAM 即可。
- OpenCore 的重置 NVRAM 功能非常彻底,可能会把你已有的引导项一起重置消失掉;处在 Clover 转换到 OpenCore 阶段时,如果重置后再次使用 Clover 可能会提示“您的电脑因为出现问题而重启”,新手谨慎使用;
如果想要删除指定内容,例如要删除每次开机出现的 “您的电脑因为出现问题而重启” 的信息(也就是 Kernel Panic 后遗症):
sudo nvram -d aapl,panic-info
NVRAM 清空错误
如果清空NVRAM出现以下提示:
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 的主板,以上是该问题的所有常用处理办法。
这个时候,可以回到第一步,在终端输入:
sudo nvram TestVar=RandomString
重启,终端输入:
sudo nvram -p | grep 'TestVar'
如果看到终端输出了包含“TestVar RandomString”的结果,输入(这一步是操作 NVRAM 删除这个值):
sudo nvram -d TestVar
或者:
sudo nvram -c
再次重启,输入:
sudo nvram -p | grep 'TestVar'
如果终端提示错误,没有输出包含“TestVar RandomString”的结果,代表 NVRAM 已经工作正常,可忽略错误提示。
NVRAM 支持情况
已知原生支持NVRAM的主板
- GA 主板 5、6、7、8、9 系;
- 华擎 8 系;
- 微星 9 系;
- 华硕 8 系,100系(早期BIOS版本);
- 英特尔 6 系;
- Z370;
绝大多数 Z370 都具备原生 NVRAM,仅需要 AptioMemoryFix.efi 即可,或使用 OsxAptioFix2Drv.efi/OsxAptioFix3Drv.efi 配合 slide 值计算(新手强烈不推荐自行计算,十个新手八个找不到,还有一个算错,直接试一下 slide=0 这个引导参数)。
已知没有原生NVRAM的主板
- GA 主板 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。
使用方法很简单,解压下载到的文件,使用 .aml 后缀的文件,这是已编译好的版本。.dsl 是源代码。
- 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 脚本)。
安装成功后,重启电脑,在 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
1. 本站资源收集于网络,仅做学习和交流使用,请于下载后24小时内删除。如果你喜欢我们推荐的软件,请购买正版支持作者。
2. 如有无法下载的链接,联系:admin#heipg.cn,或到QQ群进行反馈,我们将及时进行处理。
3. 本站发布的内容若侵犯到您的权益,请联系站长删除,联系方式:admin#heipg.cn,我们将第一时间配合处理!
黑苹果星球 » NVRAM是什么?为什么对黑苹果重要?
清空NVRAM这一步有问题啊,没说咋解决……
似乎华硕7系也支持nvram,我的华硕Z77是支持的
已知原生支持NVRAM的主板 技嘉 5、6、7、8、9 系,这是什么意思?技嘉b360,z390都是原生支持?
这个指的是Z170之前的平台
感谢分享,马上试试
在黑苹果-重新启动...,然后,正常关机,接着卡在开机界面,就是主板Logo,按Delete进入BIOS,那个界面,请问这是哪里出问题了? 关机,重新开机是正常的,“睡眠”也是正常,就是“重新启动”不正常。
OpenCore 用户在引导菜单中选择 Reset NVRAM 即可。
这步操作后开机苹果logo变大,一闪后恢复正常,机型:hp Probook 440 G6,麻烦问下怎么解决
可能是因为使用了一键HiDPi脚本的关系
可以试一下关闭后是否正常