Dell G3 3590 黑苹果实战:OpenCore 1.0.8 + NullMoth 驱动让 GTX 1660 跑起 Metal

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-driver v1.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:

  1. 必须放开 AMFI 。NVMTLDriver.bundle 是 ad-hoc 签名的,macOS 的 AMFI 会拒绝加载未签名驱动包。
  2. WindowServer 才能加载它 。这就是为什么需要 AMFIPass.kext(Lilu 插件)------ 它给特定进程开后门。
  3. 四个内核扩展必须装进 /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.Drivers 5 条各补 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.kext v2.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. 所有。本文仅整理公开可得的技术资料与实测记录。

相关推荐
遇码4 小时前
macOS 触摸板捏合在 GPUI 里无响应:vendor 打补丁,把手势合成为 cmd+滚轮事件
rust·图形渲染·策略模式·桌面应用·gpui
mmsx1 天前
Android 架构分层:MVVM 与 MVP 共存,网络层怎么切
android·策略模式·mvvm·mvp
博风1 天前
7、设计模式应用举例:策略模式:加密、解密文件
设计模式·策略模式
mmsx1 天前
Android 本地优先的三级语义理解降级链
android·数码相机·策略模式
早点睡觉好了1 天前
LangChain 源码入门 02:消息、ChatPromptTemplate 与 Chat Model 调用链
ai·langchain·策略模式
花间相见2 天前
【计算基础|网络12】TCP 抓包与经典边界问题
网络·tcp/ip·策略模式
花间相见2 天前
【计算基础|网络11】TCP(下):拥塞控制与参数优化
网络·tcp/ip·策略模式
小羊没烦恼!3 天前
OS X 上使用.NET开发应用程序
开发语言·前端·数据库·人工智能·c#·策略模式
沫璃染墨8 天前
《Linux工程实践篇(一):认识设计模式——从日志系统看策略模式》
linux·c++·安全·设计模式·策略模式