NVRAM是什么?为什么对黑苹果重要?

2020-03-10 / 3.72w / 教程 / 4.91k / 15分钟

概述

本文最后更新: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的主板

  • 技嘉 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。

超级会员免费 永久超级会员免费

已有267人查看

使用方法很简单,解压下载到的文件,使用 .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

 

0. 本站所有资源解压密码均为 heipg.cn
1. 本站资源收集于网络,仅做学习和交流使用,请于下载后24小时内删除。如果你喜欢我们推荐的软件,请购买正版支持作者。
2. 如有无法下载的链接,请及时邮箱[email protected],或到QQ群进行反馈,我们将及时进行处理。
3. 本站发布的内容若侵犯到您的权益,请联系站长删除,联系方式:[email protected],我们将第一时间配合处理!
扫描QQ二维码加入【黑苹果星球交流群】

黑苹果星球 » NVRAM是什么?为什么对黑苹果重要?

13 评论

  1. 博主你好,我的是B360M迫击炮主板,在执行nvram清空时提示清空错误,按照教程中的描述,在 执行/EFI/Clover/Drivers/UEFI 目录的操作后,仍然无效,还是一样的错误,请问这个应该如何解决?

    1. 这个问题也没有更多办法,文中已把目前所有方法都列出来了,建议把本文中的全套试一遍。

  2. 照這個方法解決了關機自動重開機的問題,真的是太感謝了

  3. 我的板子是技嘉 Z390 UD ,按關機後會自動重開機。是要用這個方法解決麼?

    1. 可以试一下以下步骤,但关机变重启并不完全是NVRAM和内存的问题:
      1.使用AptioMemoryFix.efi引导系统,删掉所有OsxAptioFixDrv版本;
      2.添加slide=0引导参数,或计算slide值
      3.添加修复Z390的NVRAM的SSDT

  4. 不行,Catalina执行nvram -c后提示: nvram: Error clearing firmware variables: (iokit/common) not permitted

  5. 下载下来的ZIP包无法解压,搞不懂什么情况

    1. 测试正常,请更换解压缩软件再试

  6. z390 opencore nvram

  7. 执行nvram -c后提示:
    nvram: Error clearing firmware variables: (iokit/common) not permitted

    1. 已补充相关内容:)

  8. NVRAM.plist 无法添加, 10.15.4

    同样问题

  9. NVRAM.plist 无法添加, 10.15.4

发表评论