概述
www.imacosx.cn

根据 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 支持测试

www.imacosx.cn

运行终端进行以下测试,即可知晓自己的主板是否支持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 如何重置

www.imacosx.cn
    • Clover 用户可在引导选择系统界面按下 F11 重置 NVRAM(如果你使用的是模拟,清空的只是模拟的 NVRAM);
    • OpenCore 用户在引导菜单中选择 Reset NVRAM 即可。
  • OpenCore 的重置 NVRAM 功能非常彻底,可能会把你已有的引导项一起重置消失掉;处在 Clover 转换到 OpenCore 阶段时,如果重置后再次使用 Clover 可能会提示“您的电脑因为出现问题而重启”,新手谨慎使用;

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

sudo nvram -d aapl,panic-info

NVRAM 清空错误

www.imacosx.cn

如果清空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 如何重置

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

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

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

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

sudo nvram -d aapl,panic-info

NVRAM 清空错误

www.imacosx.cn

如果清空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 已经工作正常,可忽略错误提示。

发表回复

后才能评论