OSX-KVM GPU 直通指南:3 步把独显交给 macOS 虚拟机,告别模拟显卡的掉帧
【免费下载链接】OSX-KVMRun macOS on QEMU/KVM. With OpenCore + Monterey + Ventura + Sonoma support now! Only commercial (paid) support is available now to avoid spammy issues. No Mac system is required.项目地址: https://gitcode.com/GitHub_Trending/os/OSX-KVM
如果你的 macOS 虚拟机还在用 QEMU 默认的 VGA 模拟输出,拖一下窗口都会卡,渲染视频时帧率掉到个位数——那问题不在参数调优,而在显示链路本身。OSX-KVM 这个基于 QEMU/KVM 跑 macOS 的项目,提供了 boot-passthrough.sh 脚本,可以把宿主机上的一块独立显卡通过 VFIO 直接划给虚拟机,让 macOS 像裸机一样驱动它。
动手前,先确认三条硬条件
直通能不能做,取决于硬件和内核状态,跟软件技巧无关。对照下面这张清单,任何一条不满足就先停下来:
| 检查项 | 怎么看 | 不满足怎么办 |
|---|---|---|
| 主板/CPU 支持 IOMMU(Intel VT-d 或 AMD-Vi) | lsmod \| grep -E "intel_iommu\|amd_iommu"有输出 | 换硬件,无解 |
| 至少两块显卡 | lspci \| grep -i vga看到两块 | 宿主机保留集显,独显给虚拟机 |
| KVM 模块与 QEMU 已装好 | 跑 run-diagnostics.sh | 先按项目说明装虚拟化环境 |
先跑一遍诊断脚本:
sudo ./run-diagnostics.sh它会打印分布信息、已加载的内核模块和 QEMU 版本。输出里出现amd_iommu或intel_iommu且引用计数为 0 以外(已加载),说明 IOMMU 就绪;如果它提示ignore_msrs设置不对,执行echo 1 | sudo tee /sys/module/kvm/parameters/ignore_msrs修掉,否则后续启动会踩到 MSR 报错。
⚠️ 一个容易忽略的顺序问题:先用不带直通的脚本装好 macOS,再用直通脚本开机。boot-passthrough.sh 里的注释明确写了这一点——直通状态下做首次安装,引导链更容易出问题。
让系统认得出这块卡:找到 PCI 地址和 IOMMU 分组
直通的前提是 QEMU 知道"哪块卡归谁"。运行项目自带的分组脚本:
./scripts/list_iommu_groups.sh它遍历/sys/kernel/iommu_groups并用lspci打印每个组里的设备。输出长这样:
IOMMU Group 15: 01:00.0 VGA compatible controller [0300]: Advanced Micro Devices, Inc. [AMD/ATI] Ellesmere [Radeon RX 470/480/570/570X/580/580X/590] [1002:67df] 01:00.1 Audio device [0403]: Advanced Micro Devices, Inc. [AMD/ATI] Ellesmere HDMI Audio [Radeon RX 470/480 / 570/580/590] [1002:aaf0]记下两个地址:VGA 控制器01:00.0和配套的 HDMI 音频01:00.1。音频口和显卡在同一个组里是好事——同组设备要么一起直通、要么一起留下,不会拆散;如果音频口被分到了别的组,就只直通 VGA 控制器,代价是虚拟机里没有 HDMI 声音。
把显卡从内核手里抢过来:绑定 vfio-pci
拿到地址后,要让 Linux 内核在开机时就接管这些设备。编辑 GRUB 的内核参数(/etc/default/grub的GRUB_CMDLINE_LINUX_DEFAULT),按平台二选一:
- Intel 平台:
intel_iommu=on iommu=pt vfio-pci.ids=1002:67df,1002:aaf0 - AMD 平台:
amd_iommu=on iommu=pt vfio-pci.ids=1002:67df,1002:aaf0
三个参数各干各的事:intel_iommu=on/amd_iommu=on打开 IOMMU;iommu=pt让其余设备保持直通模式,不拖慢宿主机;vfio-pci.ids=指定显卡和音频口的厂商:设备ID(就是上面输出里的1002:67df这类值),开机时自动绑给vfio-pci。
如果你用的是 AMD 显卡,再加一条更稳的做法:在/etc/modprobe.d/vfio.conf里写options vfio-pci ids=1002:67df,1002:aaf0 disable_vga=1,并用softdep让vfio-pci抢在amdgpu之前加载。改完sudo update-grub(或对应发行版命令)重启。
岔路口 1:不想改 GRUB?项目提供了手动接管工具,不用重启宿主机就能把指定 IOMMU 组绑给 vfio-pci:
sudo ./scripts/vfio-group.sh 15 # 参数是 IOMMU 组号 sudo ./scripts/vfio-ungroup.sh 15 # 反向操作,把设备还回去适合调试阶段反复切换设备;长期运行还是建议走 GRUB 方案。
另外,把设备节点权限固化下来:
sudo cp vfio-kvm.rules /etc/udev/rules.d/vfio-kvm.rulesvfio-kvm.rules 里就一条SUBSYSTEM=="vfio", OWNER="root", GROUP="kvm",作用是让 kvm 组对/dev/vfio/*有权限,避免 QEMU 启动时报权限错。
验证是否生效:
dmesg | grep -iE "iommu|vfio" lspci -k | grep -A3 "01:00.0"看到IOMMU enabled、vfio-pci 0000:01:00.0字样,且该设备Kernel driver in use: vfio-pci,这一步才算真正完成。
修改启动脚本:告诉 QEMU 直通哪块卡
打开 boot-passthrough.sh,需要动的只有几处:
-vga none -device vfio-pci,host=01:00.0,multifunction=on,x-no-kvm-intx=on -device vfio-pci,host=01:00.1-vga none:关掉 QEMU 自带的模拟显卡,否则和直通卡抢显示输出。host=01:00.0:换成你自己的 VGA 控制器地址;multifunction=on告诉 QEMU 这是一张多功能卡,后续还能挂同卡的音频子设备。x-no-kvm-intx=on:禁用 KVM 对 INTx 中断的处理,是 AMD 卡上绕过中断死锁的常用开关。- 第二行把 HDMI 音频口也直通进去,让虚拟机里有声音。
岔路口 2:显卡初始化黑屏?有些卡(尤其 NVIDIA)的 VBIOS 在 QEMU 的 PCI 拓扑下起不来。脚本里留了一行注释掉的备选:
# -device vfio-pci,host=01:00.0,multifunction=on,romfile=gpu_original_bios.bin把这张卡原始 BIOS 从宿主机里 dump 出来(sudo cat /sys/bus/pci/devices/0000:01:00.0/rom > gpu_original_bios.bin),改用romfile喂给它。注意加了romfile就不用multifunction=on,两者留一个即可。
资源方面,直通后 GPU 负载会真实落到虚拟机上,把默认值提一提:
ALLOCATED_RAM="8192" # MiB,跑图形任务至少 8GB CPU_CORES="4" CPU_THREADS="8"MY_OPTIONS那行 CPU 特性开关(+avx,+aes等)如果启动时内核 panic 报invalid opcode,按脚本注释先回退MY_OPTIONS再排查。
开机后的验收动作
./boot-passthrough.sh进入 macOS 后做两件事:
- 打开「系统信息 → 图形卡」,确认型号是你那张物理显卡,而不是
VGA compatible controller; - 如果直通了音频口,系统信息里还能看到 HDMI Audio。
下图是虚拟机里 macOS 的系统设置界面,显示器一栏应该显示的是直通显卡提供的分辨率列表,而不是固定不变的默认值:
想直观感受性能差距,把显示器物理线插到直通显卡的接口上——能点亮且流畅,比任何跑分都有说服力;跑一遍 Cinebench 或导出一次 4K 视频做前后对比,数字会替你做结论。
排障速查表
| 报错 / 现象 | 原因 | 一句话处理 |
|---|---|---|
Device in use by driver | 设备还绑在原生驱动(amdgpu/ nouveau)上 | 确认vfio-pci.ids=已生效并重启,或用 scripts/vfio-ungroup.sh 解绑后重新 scripts/vfio-group.sh |
| AMD 卡反复重置、虚拟机循环重启 | 俗称 "AMD reset bug" | 内核参数加pcie_acs_override=downstream,配合脚本里的x-no-kvm-intx=on;仍不行就换 NVIDIA 或打 vendor-reset 补丁 |
/dev/vfio权限拒绝 | udev 规则没装 | 把 vfio-kvm.rules 拷进/etc/udev/rules.d/并sudo udevadm control --reload-rules |
| 开机黑屏、无输出 | 卡没有 VBIOS 或 QEMU 环境起不来 | 用romfile加载原始 BIOS(见上文岔路口 2) |
内核 panic 带invalid opcode | CPU 暴露的特性超出 macOS 支持 | 调低MY_OPTIONS,逐项回退+avx、+aes等开关 |
| 同一 IOMMU 组里混着网卡/USB 控制器 | 组内设备无法单独直通 | 加pcie_acs_override=downstream拆组,或把整组一起交给虚拟机 |
收尾之后,还能往哪走
主线走通后,方向性拓展只有三个值得试的:
- USB 控制器直通:同样用
vfio-pci.ids=+-device vfio-pci,host=...的思路把一块独立 USB 3.0 主控(如 ASM1142)划给虚拟机,脚本注释里就有现成写法。 - 自动化:把 scripts/ 里的 group/ungroup 工具串进开机脚本,省去手动绑定。
- 第二块 GPU 给第二台虚拟机:两块独显各自直通到不同 VM,互不干扰——前提是 IOMMU 分组干净。
硬件差异是直通配置的全部难点所在,上面每一步的输出都值得先跑一遍再往下走:分组结果、dmesg里的 vfio 日志、以及系统信息里的显卡型号,就是你手里仅有的三张"证据"。
【免费下载链接】OSX-KVMRun macOS on QEMU/KVM. With OpenCore + Monterey + Ventura + Sonoma support now! Only commercial (paid) support is available now to avoid spammy issues. No Mac system is required.项目地址: https://gitcode.com/GitHub_Trending/os/OSX-KVM
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考