黑苹果 P400 直通显示折腾全记录
日期: 2026-09-07 | 环境: PVE 8 + Debian 13 (KDE Plasma) + macOS Sonoma 14.8.9 VM 102
显卡: NVIDIA Quadro P400 (GP107 / Pascal / 2GB)
〇、最终成果速览
| 项目 | 状态 | 说明 |
|---|---|---|
| P400 直通 macOS | ✅ | hostpci0 直通, 2GB VRAM, HDMI 1080p@60Hz |
| WebDriver 驱动 | ✅ | 全部 4 个 kext 加载成功 (v10.3.3) |
| 开机自动进系统 | ✅ | OpenCore Timeout=2, 默认项已固定 |
| VBIOS romfile | ✅ | GP107.rom (物理卡 nvflash 导出) |
| vga 配置 | ⚠️ | 必须保留 vga: vmware, 不能 vga: none |
一、P400 驱动 (WebDriver) 折腾核心
1.1 为什么 kext 装不上
Sonoma 不再认 amfi_get_out_of_my_way=0x1 启动参数, kext 被拒:
kernelmanagerd: error: tried to insert an invalid codeful kernel extension in the restricted lookup table
1.2 正解 (缺一不可)
| 组件 | 版本 | 作用 |
|---|---|---|
| AMFIPass | 1.4.1 | 绕过 AMFI 限制, 让旧 kext 能加载 (手动加进 Kernel>Add, OCLP 自动逻辑因 iMacPro1,1 跳过了) |
| Lilu | 1.7.2 | 必须 ≥1.6.8 才能带 AMFIPass |
| WhateverGreen | 1.7.0 | 配合驱动 |
| csr-active-config | ff0f0000 (4字节) | 注意必须精确 4 字节, 多了尾部字节会破坏 SIP 解析 |
1.3 Kernel>Add 条目必填字段 (踩坑)
AMFIPass 条目缺失 PlistPath 会导致 OpenCore 启动直接报错:
Injected kext 2() has invalid info
必须: PlistPath=Contents/Info.plist + Arch=Any + MinKernel=20.0.0
1.4 验证成功的日志标志
NVDAStartupWeb: Web (set by nvda_drv_vrl)
NVDAGP100HAL loaded and registered
GeForceWeb v10.3.3
系统报告显示: NVIDIA Quadro P400, 2GB VRAM, Main Display: Yes
二、VBIOS / GOP 折腾 (血泪教训)
2.1 重大发现: P400 VBIOS 一直都有 GOP!
用 rom-parser (权威工具) 验证三个文件全部带 EFI 段:
$ ./rom-parser GP107.rom
Valid ROM signature found @fa00h, PCIR offset 1ch
PCIR: type 3 (EFI), vendor: 10de, device: 1cb3, class: 030000
EFI: Signature Valid, Subsystem: Boot, Machine: X64
Last image
⚠️ 教训: 之前用 Python 自写解析 PCIR+13 判断类型, 结论是"无 GOP"------错的!
rom-parser 才是正确判断工具。差点去刷 BIOS / 注入 GOP, 白折腾。
2.2 三个 ROM 文件对比
| 文件 | 来源 | 大小 | MD5 | EFI段 |
|---|---|---|---|---|
| GP107.rom | Win11 GPU-Z 提取 | 274944 | 2c3a5d2e... | ✅ type 3 |
| 262039.rom | TechPowerUp | 274944 | e3287604... | ✅ type 3 |
| GP1071.rom | Win11 nvflash --save | 274944 | ac1a1122... | ✅ type 3 |
nvflash 从物理卡导出的最完整, 目前推荐用它 (GP1071.rom 已在 PVE /usr/share/kvm/)
2.3 vga: none 为什么黑屏 (关键认知)
因为 QEMU 在 vga: none 时没有任何虚拟显卡给 VNC 提供画面源 → VNC 必然黑屏!
- VNC 黑屏 ≠ 系统没启动
- P400 物理 HDMI 可能有画面, 但 VNC 永远看不到
- 判断系统是否启动要看 SSH / tap 流量, 不能看 VNC
2.4 正确显示配置 (最终形态)
vga: vmware ← 必须保留! VNC 靠它出画面
hostpci0: 0000:01:00,x-vga=1,romfile=GP1071.rom
Proxmox 教程作者也确认: 禁用 vmware 显示会导致 VM 无法启动。
想真正 vga:none 独立显示, 需要物理显示器直连 P400 + 放弃 VNC, 折腾风险高, 不建议。
三、开机自动启动配置
3.1 配置项
Misc > Boot > Timeout = 2 (2 秒后自动启动默认项)
Misc > Boot > ShowPicker = true (保留菜单兜底)
Misc > Security > AllowSetDefault = true (允许 Ctrl+Enter 固定默认项)
3.2 设置默认项的关键操作
在 OpenCore 菜单里:
- 方向键选中 Macintosh HD
- Ctrl+Enter = 固定为默认项 + 立即启动 (Enter 只是临时启动一次)
3.3 Timeout 校准血泪史
| Timeout | 结果 |
|---|---|
| 5 | 太快, 来不及按 Ctrl+Enter |
| 20 | 用于首次设置默认项 |
| 30 | 从容设置默认项 (最终设置时用的) |
| 2 | 最终值, 默认项固定后自动进 |
3.4 失败还原流程 (救急)
SSH 进 macOS:
diskutil mount disk0s1
cp /Volumes/EFI/EFI/OC/config.plist.bak-t2 /Volumes/EFI/EFI/OC/config.plist
diskutil unmount /Volumes/EFI
PVE 侧备用 (VM 起不来时):
qm stop 102
mount -t vfat -o rw,loop,offset=20480,sizelimit=209715200 /dev/pve/vm-102-disk-2 /mnt/efi
# 改完 umount
完整备份: /tmp/EFI-current-20260907-030508.tar.gz (MD5 517f03ee03a3c8925a57822ee3afaf53)
四、已尝试但放弃的路线 (记录防重复)
| 路线 | 结论 |
|---|---|
| EnableGOP (vBiosInsert.sh + EnableGop.efi) | 只能替换已有 GOP 段, 不能凭空创建; BaseTools EfiRom 是 Mach-O 跑不了 |
| NVIDIA 官方 UEFI Update Tool | 官方支持列表只有 GeForce, Quadro 需联系 OEM |
| GOP_Updater (YTEC-info) | 仓库基本只有 README, 无成品工具 |
| vga: none | VNC 必然黑屏, 无虚拟画面源, 死路 |
| 刷写物理 BIOS | 零收益 (VBIOS 本来就有 GOP), 高风险可能砖卡 |
五、当前 VM 102 最终配置
hostpci0: 0000:01:00,x-vga=1,romfile=GP1071.rom
vga: vmware
bios: ovmf
boot: order=virtio1;hostpci0;net0;usb0;usb1
boot-args: keepsyms=1 -v ngfxgl=1 ngfxcompat=1 nvda_drv_vrl=1 amfi_get_out_of_my_way=0x1
csr-active-config: ff0f0000 (4字节)
nvda_drv: 1
Timeout: 2 | ShowPicker: true | AllowSetDefault: true
六、常用命令速查
bash
# SSH
ssh macos # 192.168.31.109 root/123456
ssh pve # 192.168.31.225 root/123456
ssh win11 # 192.168.31.201
# PVE 管理
qm start 102 / qm stop 102 / qm status 102
qm set 102 -hostpci0 "0000:01:00,x-vga=1,romfile=GP1071.rom"
# VBIOS 检查 (rom-parser 编译自 https://github.com/awilliam/rom-parser)
gcc -o rom-parser rom-parser.c
./rom-parser /usr/share/kvm/GP1071.rom
# macOS EFI 编辑
diskutil mount disk0s1
/usr/libexec/PlistBuddy -c "Set :Misc:Boot:Timeout 2" /Volumes/EFI/EFI/OC/config.plist
plutil -lint /Volumes/EFI/EFI/OC/config.plist
diskutil unmount /Volumes/EFI
七、给未来的自己
- VBIOS 判断 GOP 用 rom-parser, 别自己写解析 (吃过大亏)
- VNC 黑屏先查 SSH / tap 流量, 别急着下结论
- 改 EFI 前必备份, 失败 30 秒还原
- Timeout 先用大值设置默认项, 再改小
- P400 完美形态 = vga: vmware + romfile + Timeout=2 自动进, 别再折腾显示