Dell G3 3590 黑苹果实战:OpenCore 1.0.8 + NullMoth 驱动让 GTX 1660 跑起 Metal
一句话总结 :把一份 2022 年的 OpenCore 0.8.7 EFI 迁到 1.0.8,按驱动安装脚本的权威清单逐项改
config.plist,最终ocvalidate零问题、自建 63 项审计全过。但 GTX 1660 + 笔记本 Optimus 是整条链路上最没被验证过的一段 ------ 本文把前提、改法、坑全部摊开,不藏结果。
- 平台:Dell G3 3590(十代 Intel 酷睿 + UHD 630 核显 + NVIDIA GTX 1660 系列)
- 引导:OpenCore 1.0.8
- 驱动:NullMoth
nvidia-macos-driverv1.14.2 - 系统:macOS 15 Sequoia(只支持这一个版本)
目录
- 一、先把事实核查做掉:NullMoth 是不是噱头
- 二、驱动架构:Metal 请求是怎么落到 NVIDIA 卡上的
- 三、目标硬件与可行性判断
- 四、动手前必须知道的三个前提
- 五、OpenCore 0.8.7 → 1.0.8 迁移做了什么
- 六、config.plist 的 12 处改动
- 七、kext 刷新清单(21 个)
- 八、校验方法论:ocvalidate 不够,得自己审
- 九、两个还没解决的坑
一、先把事实核查做掉:NullMoth 是不是噱头
社区里传的版本是:「NullMoth 在 GitHub 发布了开源项目 nvidia-macos-driver,通过 OpenCore 引导,成功让 NVIDIA RTX 系列显卡在 macOS 15 Sequoia 上启用 Metal 硬件加速。」
结论:是真的,但有三个重要限定。
| 核查项 | 结果 |
|---|---|
| 项目是否真实存在 | 是,源码 1030 个文件、约 19.7 MB |
| 授权 | PolyForm Noncommercial ------ 免费,但不能商用 |
| 是否开源 | 是,含 Rust 编写的 AIR→SPIR-V 翻译器 |
| 实测环境 | RTX 5060 / macOS 15.7.x 与 15.8.1 |
| 支持系统 | 仅 macOS 15 Sequoia,不是 Ventura 也不是 Tahoe |
| GTX 1660 状态 | 设备表覆盖,实机验证 Pending(未验证) |
| 生产可用性 | 否 ------ 要关 SIP、关安全启动、放开 AMFI |
最后一条值得展开。驱动 README 原文把话说得很清楚:
A Metal driver for NVIDIA Turing-and-later cards ... running macOS 15 Sequoia
也就是说,这不是一个「装上就能用」的日常方案。它要求你主动削弱系统的三层安全机制,来换取一个尚未在目标硬件上验证过的图形栈。要上车,先接受这个交换。
二、驱动架构:Metal 请求是怎么落到 NVIDIA 卡上的
这部分是整个项目最值得读的地方。macOS 的图形栈是封闭的,Apple 从来没给过第三方 Metal 后端的官方接口。NullMoth 的做法不是「逆向 Metal」,而是搭一座桥:
Metal 应用
│
▼
NVMTLDriver.bundle ← 驱动提供的 Metal 实现,被 WindowServer 动态加载
│
▼
AIR → SPIR-V 翻译器 ← Rust 实现,把 Apple 的 AIR 中间码翻成 SPIR-V
│
▼
Mesa NVK(Vulkan + NAK) ← 开源的 Vulkan 驱动 + NVIDIA 汇编器
│
▼
内核扩展:NVRM / NVAccel / NVRMFB / NVRMAGDC
│
▼
GPU
内核态跑的是 NVIDIA 官方开源 GPU 内核模块 r610 加 GSP 固件。用户态的 Metal→SPIR-V 翻译走 Mesa NVK。
这套路径决定了它对系统的几个硬性要求,也解释了后面 config.plist 里那些看着很怪的 boot-args:
- 必须放开 AMFI 。
NVMTLDriver.bundle是 ad-hoc 签名的,macOS 的 AMFI 会拒绝加载未签名驱动包。 - WindowServer 才能加载它 。这就是为什么需要
AMFIPass.kext(Lilu 插件)------ 它给特定进程开后门。 - 四个内核扩展必须装进
/Library/Extensions,绝对不要再从EFI/OC/Kexts注入一遍,因为它们链接的是 macOS 自带内核集合里的框架。
顺带说一个坑:AMFI 放开之后,Firefox 这类做了硬化的应用会在启动时崩溃。解药是 ipc_control_port_options=0。
三、目标硬件与可行性判断
Dell G3 3590 是台 2020 年的游戏本,十代 Intel 酷睿 + UHD 630 核显 + NVIDIA GTX 1660 系列独显。原厂 EFI 是 2022 年 12 月给 macOS Ventura 做的,使用 OpenCore 0.8.7。
可行性结论分三层:
核显:没问题。 UHD 630 是 Comet Lake,在 macOS 15 支持范围内。Skylake 那代需要注意(Apple 在 Ventura 之后砍掉了 Skylake 核显 kext,但 Kaby Lake 的还在,WhateverGreen v1.6.1+ 会自动把 SKL 伪装成 KBL),十代不在这个问题里。
独显驱动:能装,能不能亮是另一回事。 见第四节第 3 条。
系统版本:必须 Sequoia。 驱动只支持 15。如果你原来在 Ventura,这份 EFI 的 kext 更新同样兼容 Ventura,但 NullMoth 驱动装不上。反过来想从 Ventura 升到 Sequoia,那就直接用这份重做过的。
四、动手前必须知道的三个前提
1. 这个驱动只支持 macOS 15 Sequoia
别再问「能不能在 Ventura / Sonoma / Tahoe 上用」。README 写死了。要在 Tahoe 上折腾,等驱动的下一个大版本。
2. GTX 1660 是「设备表覆盖」,不是「实机验证」
驱动的 docs/CARD-SUPPORT.md:
| 家族 | 设备表覆盖 | 本版本的实机验证状态 |
|---|---|---|
| Turing(GTX 1650/1660、RTX 20、TITAN RTX、Quadro T1000/RTX) | 是 | Pending(未验证) |
| Ampere / Ada | 是 | Pending |
| Blackwell(RTX 50) | 是 | RTX 5060 自动化通过 |
GTX 1660 系列是 TU116 ,PCI ID 落在 2180--21FF 段,在设备表里,但 NullMoth 没在 Turing 卡上做过物理验证。装它的人确实是第一批吃螃蟹的。
3. ⚠️ 笔记本没有独显直连(Optimus MUX),这是硬伤
这条最容易让人白忙一晚。驱动文档原文:
A laptop also needs a display/output route the NVIDIA card can drive;
accepting its PCI ID does not implement an Optimus display mux.
Dell G3 3590 是无 MUX 的 Optimus 机型:
- 内屏物理上接在 Intel UHD 630 上 ,没接到 GTX 1660。驱动不可能点亮内屏。
- 外接输出看主板走线:HDMI 口通常接独显 ,Type-C 的 DP Alt Mode 通常接核显。
也就是说,装好驱动后大概率只能靠 HDMI 口外接显示器才能看到 Metal 加速效果。这一点无法从 EFI 里读出来,必须实测确认。
预期管理:即使驱动完美工作,内屏上跑的仍然是 Intel 核显,独显只能做无显示输出的计算,或者驱动那台挂在独显上的外接屏。
五、OpenCore 0.8.7 → 1.0.8 迁移做了什么
不是替换几个 exe 就完事,config.plist 的架构在 0.9 / 1.0 之间变过。
二进制替换
逐个 SHA-256 比对确认来自 1.0.8 官方包:
BOOT/BOOTx64.efi OpenCore.efi
Drivers/OpenCanopy.efi OpenHfsPlus.efi OpenRuntime.efi
Drivers/ResetNvramEntry.efi ToggleSipEntry.efi
Tools/ x15
config 架构迁移
以 1.0.8 官方 Docs/Sample.plist 为基准同步键结构:
- 新增 14 个键,删除 1 个(
Misc.Serial.Custom,1.0.x 已移除) Kernel.Block补Strategy键(1.0.x 必需,值为Exclude)UEFI.Drivers5 条各补HideVerbose键- 删掉迁移时误带入的 Sample 占位项
PciRoot(0x0)/Pci(0x1b,0x0)(它的layout-id=01会和本机声卡的layout-id=0x15打架)
主题资源
OpenCore 1.0.8 官方包的 Resources/ 是空的 (不含主题),所以完整保留原 EFI 的 Resources/。
另外补一件事:原包的 Image/Acidanthera/ 基础图标集是缺的(只有 .gitkeep),Syrah 变体又少 4 个图标(OpenCore.icns、Apple.icns、ResetNVRAM.icns、ToggleSIP.icns)------ 从 Image/Dark/ 复制了 78 个图标补齐。不补的话选择器图标会显示空白。
六、config.plist 的 12 处改动
改造依据不是 README 猜的 ,是驱动自己的安装脚本 nullmoth-setup.sh(1401 图形界面在安装时执行的那个 root 脚本)。这是驱动要求的权威清单,比文档更完整 ------ 里面甚至写了 SIG 判断逻辑和 kext 版本的 SHA-256 钉死值。
6.1 NVRAM boot-args
在原有一串后面追加:
nvfb=1 nvaccel=1 nvfbheads=4 -nvkmsnosmooth
amfi_get_out_of_my_way=0x1 amfi=0x80 ipc_control_port_options=0
nvrmsettle=10000 -nvrmnoflip
| 参数 | 作用 |
|---|---|
nvfb=1 nvaccel=1 nvfbheads=4 |
打开 NVRMFB 帧缓冲 + NVAccel 加速器,4 个显示头 |
-nvkmsnosmooth |
关掉 NVKMS 平滑 |
amfi_get_out_of_my_way=0x1 amfi=0x80 |
放开 AMFI,让 WindowServer 能加载未签名的驱动 bundle |
ipc_control_port_options=0 |
AMFI 放开后 Firefox 等硬化应用启动即崩,这条是解药 |
nvrmsettle=10000 |
Turing 专属 。GTX 16/RTX 20 固件需要更长就绪时间,不加会在 AppleKeyStore 死循环 |
-nvrmnoflip |
桌面画在核显上的机器走拷贝路径,避免开机一分钟后黑屏只剩光标 |
Turing 判定逻辑,脚本原文:
bash
case "$NVDEV" in 1[eEfF]??|21[89a-fA-F]?) TURING=1;; *) TURING=0;; esac
[ "$TURING" = 1 ] && WANT_ARGS="$WANT_ARGS nvrmsettle=10000"
GTX 1660 是 TU116,PCI ID 落在 21xx 段,命中 21[89a-fA-F]?,所以 TURING=1,nvrmsettle=10000 必须加。
最后一条 -nvrmnoflip 是笔记本特有的:桌面画在 Intel 核显上,独显只做计算,NVKMS 走 flip 路径会导致开机一分钟后黑屏。
6.2 必须不存在的三个参数
nv_disable=1
-wegnoegpu
agdpmod=pikera
这三个会屏蔽独显,一条都不能留。
6.3 csr-active-config 与 NVRAM.Delete
csr-active-config 保持 0x0FFF(ff0f0000)没动 。驱动要求 0x0A43,而 0x0FFF 是它的超集:
0x0A43 = untrusted kexts (bit0)
| unrestricted FS (bit1)
| unrestricted NVRAM (bit6)
| any recovery (bit9)
| unapproved kexts (bit11)
0x0FFF 是 0x0A43 的超集
脚本逻辑是 SIP = 现有 | 0x0A43(只加不减),所以原样保留。
NVRAM.Delete 增加 csr-active-config(原来只有 boot-args)------ 驱动要求这两项每次开机都重写。
6.4 Quirks / Security
| 项 | 原值 | 新值 | 原因 |
|---|---|---|---|
UEFI.Quirks.ResizeGpuBars |
-1 |
13 |
8 GB BAR1,满带宽。13 表示 2¹³ MB = 8 GB |
Booter.Quirks.ResizeAppleGpuBars |
-1 |
-1(未变) |
macOS 看到完整 BAR |
Booter.Quirks.AllowRelocationBlock |
false |
true |
驱动要求 |
Misc.Security.SecureBootModel |
Default |
Disabled |
Apple 安全启动会拒绝非 Apple 签名的 kext |
⚠️
ResizeGpuBars=13和装 macOS 时用的值相反。装系统时没有 NVIDIA 驱动,要跑在固件屏上,必须是
ResizeAppleGpuBars=0/ResizeGpuBars=-1/ 不排除 IONDRVSupport。装完驱动后才切到上表的值。1401 会自动切换;手工装的话别忘了切回去,否则装完黑屏。
6.5 Kernel.Block 新增一条
原 EFI 完全没有 Kernel.Block:
Identifier: com.apple.iokit.IONDRVSupport
Strategy: Exclude
不加这条,固件帧缓冲会抢占 display index 0,NVRMFB 就上不了位。
6.6 Kernel.Add
| 动作 | 条目 | 说明 |
|---|---|---|
| 关掉 | AirportItlwm.kext |
上游最新只到 Sonoma 14.4,没有 macOS 15 版本 |
| 新增 | IntelBTPatcher.kext |
macOS 12+ 的 Intel 蓝牙必须和 IntelBluetoothFirmware 搭配 |
| 新增 | RestrictEvents.kext |
装上了但默认关闭 。只在桌面级 SMBIOS(MacPro7,1)配 revpatch= 时才需要 |
kext 加载顺序上,Lilu.kext 必须第一、AMFIPass.kext 紧跟其后。 驱动脚本里有一条硬校验:
bash
[ -n "$ap" ] && [ -n "$lp" ] && [ "$ap" -lt "$lp" ] && stop "AMFIPass.kext loads before Lilu.kext ..."
6.7 ACPI:三处屏蔽独显的开关要关掉
SSDT-dGPU-Off.aml→Enabled = false(原来开着)- ACPI.Patch 里
_WAK to ZWAK、_PTS to ZPTS→Enabled = false(原来开着)
这三处是原 EFI 故意屏蔽独显 用的,不关掉驱动永远看不到 GTX 1660。SSDT-USTP→XSTP、BRT6→BRTX 两条改名保留不动(和显卡无关)。
6.8 SMBIOS:不改,但不能照抄
驱动文档建议用 iMacPro1,1(或新版建议 MacPro7,1),但那是台式机 的建议。笔记本换 SMBIOS 会连带搞坏核显缓冲帧、背光、电源管理和 iCloud 登录,所以保持 MacBookPro16,4 。驱动要的只是「一个能跑 macOS 15 的机型」,MacBookPro16,4 满足。
这是本文唯一一处「照抄我的配置可能对你不利」的地方 ------ SMBIOS 机型跟着你的核显走,不要盲抄。
七、kext 刷新清单(21 个)
原 EFI 的 kext 全是 **Ventura 时代(2022 年底)**的,在 macOS 15 上大多加载不了或行为异常。全部换新:
| kext | 原版本 | 新版本 | 备注 |
|---|---|---|---|
| Lilu | 1.6.2 | 1.7.3 | 🔒 驱动安装器钉死版本 |
| AMFIPass | ❌ 缺失 | 1.4.1 | 🔒 钉死版本。原包 config 引用了它但文件根本不存在 |
| USBToolBox | 1.1.1 | 1.2.0 | 🔒 钉死版本 |
| VirtualSMC | 1.3.0 | 1.3.8 | 5 个插件一并更新 |
| WhateverGreen | 1.6.2 | 1.7.1 | 核显缓冲帧 + 背光 |
| AppleALC | 1.7.7 | 1.9.8 | 声卡 |
| NVMeFix | 1.1.0 | 1.1.3 | |
| CPUFriend | 1.2.6 | 1.3.0 | |
| VoodooI2C | 2.7 | 2.9.1 | 触控板 |
| VoodooI2CHID | 1 | 1 | |
| VoodooPS2Controller | 2.3.2 | 2.3.7 | 键盘 |
| BlueToolFixup | 2.6.1 | 2.7.2 | |
| IntelBluetoothFirmware | 2.2.0 | 2.4.0 | |
| RealtekRTL8111 | 2.4.2 | 3.0.4 | 有线网卡 |
| IntelBTPatcher | ❌ 缺失 | 2.4.0 | 新增 |
| RestrictEvents | --- | 1.1.7 | 新增,默认关闭 |
| CPUFriendDataProvider / DisableTurboBoost / VerbStub / UTBMap | --- | 原样保留 | 这四个是机器专属数据,不能换 |
| AirportItlwm | 2.1.0 | 保留原文件,config 里关闭 | 上游死结,见第九节 |
🔒 = NullMoth 安装器里带 SHA-256 钉死的版本:
Lilu-1.7.3-RELEASE.zip 261aebb9dc83adb6515c96405653f53c3c50b09c89babdb91fb41f7b33a1cd2a
AMFIPass-v1.4.1-RELEASE.zip 07b266145906db41f4b13a7938fbb173ea28888cc1fa65f84417f8820adc961e
USBToolBox-1.2.0-RELEASE.zip c315a3a5acfd496dd97d0d19b4fbd1d487103d2fd541c5651583d4c9cebcfe07
注意:Lilu 官方最新 release 是 1.7.2,驱动钉的是 dortania build-repo 的 1.7.3 ;RestrictEvents 同理(官方 1.1.6 / 驱动钉 1.1.7)。以驱动的钉死版本为准,因为驱动是照它测试的。
另外删掉 了一个顶层 VoodooInput.kext(1.1.2)------ 它没被 config 引用,而且和 VoodooI2C.kext/Contents/PlugIns/VoodooInput.kext 的 bundle ID 重复。
八、校验方法论:ocvalidate 不够,得自己审
ocvalidate 是权威工具,但它只查 config 是否符合 OpenCore 的 schema,不查你的配置是否满足驱动的需求。两边都得要。
8.1 ocvalidate(官方)
bash
ocvalidate config.plist
NOTE: This version of ocvalidate is only compatible with OpenCore version 1.0.8!
Completed validating config.plist in 1 ms. No issues found.
迁移过程中它抓到了 6 个问题,都是 1.0.x 新增的必需键:
Missing key Strategy x1 (Kernel.Block)
Missing key HideVerbose x5 (UEFI.Drivers)
8.2 自建 63 项审计
因为 ocvalidate 不知道驱动要求什么,所以写了一个审计脚本,把 nullmoth-setup.sh 里的每一条硬要求翻成断言:
| 分区 | 查什么 |
|---|---|
| A | 7 个二进制的 SHA-256 是否真来自 OpenCore 1.0.8 官方包 |
| B | ocvalidate 输出 |
| C | 9 个 boot-arg 是否在、3 个禁用参数是否已消失、SIP 位、NVRAM.Delete |
| D | 4 个 Quirks / Security 项 |
| E | Kernel.Block 的 IONDRVSupport 用了 Exclude 策略 |
| F | Lilu 第一、AMFIPass 第二、所有 BundlePath 都能在磁盘上解析 |
| G | 16 个 kext 的实际版本(读 Info.plist 的 CFBundleShortVersionString,不是信配置文件) |
| H | SMBIOS 四项 |
| I | dGPU-Off 与两条 ACPI 改名已关闭 |
最终 63 PASS / 0 FAIL。
8.3 字节级完整性
另生成 EFI-SHA256SUMS.txt,覆盖 EFI 内每个文件:
bash
sha256sum --ignore-missing -c EFI-SHA256SUMS.txt
372 个文件全部通过。
九、两个还没解决的坑
1. Intel 无线网卡在 macOS 15 上无解(上游问题)
OpenIntelWireless 的 AirportItlwm 最新 release 是 v2.3.0(2024-06-09) ,最高只到 Sonoma 14.4 ,没有 Sequoia 版本:
AirportItlwm_v2.3.0_stable_Ventura.kext.zip 15,110,181
AirportItlwm_v2.3.0_stable_Sonoma14.0.kext.zip 15,120,535
AirportItlwm_v2.3.0_stable_Sonoma14.4.kext.zip 15,205,597 <- 最新,没有 15.x
itlwm_v2.3.0_stable.kext.zip 15,094,333
所以只能把 AirportItlwm.kext 在 config 里关掉(文件保留,随时可翻回来)。
两条路:
- 推荐 :
itlwm.kextv2.3.0 + HeliPort app。它是IOEthernetController实现,不依赖 Apple 私有的IO80211Family,跨版本稳定。代价:Wi-Fi 显示成一块网卡,需要用 HeliPort 连网,没有原生菜单栏 Wi-Fi、没有 AirDrop/接力。 - 实验性 :第三方分支
zhangcheng142/AirportItlwm-Sequoia,原生接口,但是个人 fork、beta、只支持 WPA2-Personal。在 kext 里跑第三方内核代码有风险,自行权衡。
原 EFI 的 README 本来也写着「❌ 无线网卡(使用 usb 网卡代替)」------ 所以对这台机器大概不是新问题,继续用 USB 网卡即可。
2. 蓝牙:加了 IntelBTPatcher,待验证
macOS 12 以后官方要求 IntelBluetoothFirmware + IntelBTPatcher + BlueToolFixup 三件套,原配置只有两件。补上了。
如果加完后蓝牙反而不工作 ,把 Kernel -> Add 里 IntelBTPatcher.kext 的 Enabled 改回 false 即可。
参考
- NullMoth
nvidia-macos-driver:github.com/nullmoth/nvidia-macos-driver - Dortania OpenCore Install Guide
- OpenCorePkg(含
macrecovery.py) docs/CARD-SUPPORT.md、docs/TROUBLESHOOTING.md(驱动自带,最权威)
镜像版权归 Apple Inc. 所有。本文仅整理公开可得的技术资料与实测记录。