核显/独显直通笔记
更新记录
20260503: 新增显卡直通出现的问题
author: Haohahahaha (Haorui Zhang)
mail: 1259203802@qq.com
date: 2025-02-10
核显直通笔记
参考文献
准备的文件
-
本ROM 需要使用两个rom文件:
-
核显直通 OptionROM:
gen12_igd.rom--各平台基本通用 -
GOP ROM: --- 根据不同核显平台选择相应rom文件,11-13代酷睿用
gen12_gop.rom
-
1. 传入文件
- 把上述两个rom file copy to
/use/share/kvm/
2. PVE 显卡直通设定
-
编辑
grub,增加选项# 打开此文件 vim /etc/default/grub # 将此行修改为示例的样子 GRUB_CMDLINE_LINUX_DEFAULT="quiet intel_iommu=on iommu=pt initcall_blacklist=sysfb_init pcie_acs_override=downstream" # 更新 grub # update-grub -
编辑
/etc/modules,增加以下 module# 打开此文件 vim /etc/modules # 添加如下四行 vfio vfio_iommu_type1 vfio_pci vfio_virqfd # 此时再更新 grub 即可。 update-grub -
把显卡驱动加入黑名单
# 编辑黑名单文件(如没有即新建) vim /etc/modprobe.d/pve-blacklist.conf # 添加如下几行 blacklist i915 blacklist snd_hda_intel blacklist snd_hda_codec_hdmi # 可能还可以添加几行 blacklist nvidiafb blacklist nouveau blacklist nvidia blacklist radeon blacklist amdgpu -
执行
lspci -n | grep -E "0300"查看并记录核显 VendorID 和 DeviceID,通过设备ID绑定vfio-pci# 编辑此文件 # 但我现在觉得可能是作者写错了,应该是vfio.conf。 # 反正我两个都建了,内容一模一样(有点懒) vim /etc/modprobe.d/vifo.conf # 在文件中添加一行 # "ids=8086:a780" 仅为示例! # 且可通过 `,` 连接多个设备ID,以将多个设备绑定到 vfio-pci # > vifo.conf 没有 disable_vga=1,有的删掉! options vfio-pci ids=8086:a780 # 更新 update-initramfs -u # 重启 # 重启后添加设备时应该可以看到核显了。 reboot
3. 按要求新建虚拟机
新建虚拟机的操作:
-
机型必须 i440fx ,(QEMU不支持Q35 核显Legacy模式下显示,可以定制QEMU支持Q35,不在本文讨论)
-
scsi控制器设置为 VirtIO SCSI
-
将BIOS设置为 OVMF(UEFI),EFI存储设置为local-lvm即可(这个看实际命名),Intel核显已不支持传统BIOS启动.
-
添加TPM,TPM存储设置为local-lvm即可,版本v2.0
-
CPU设置下:将类型设置为 host ,这样可以获取cpu的所有指令集
-
虚拟机内存 至少4G ,小于4G可能有问题
-
网络设置下: 将“模型”设置为 VirtIO(半虚拟化),这是除了直通网卡外性能最好的方案。
-
新建好后添加 PCI 设备-选择原始设备,应该可以看到 intel 核显与声卡了。
- 选择原始设备的时候,最左侧一列为 ID,核显 ID 通常为
0000:00:02.0,声卡 ID 通常为0000:00:1f.3。
- 选择原始设备的时候,最左侧一列为 ID,核显 ID 通常为
-
将 显示 设置为 无
4. 修改虚拟机配置文件
-
核显PCI加入legacy-igd=1以支持核显Legacy模式下显示
-
args加入:-set device.hostpci0.addr=02.0 -set device.hostpci0.x-igd-gms=0x2 -set device.hostpci0.x-igd-opregion=on
-
args中的 “-debugcon file:/root/d-debug.log -global isa-debugcon.iobase=0x402” 为调试文件,介意的不加 -
建议 x-igd-gms=0x2,同时注意BIOS设定:DVMT pre allocated,不要大过64M
-
BIOS 设定 DVMT
- 这里说的是物理机的 BIOS。
- 华硕主板的选项在
高级-北桥-显示设置-DVMT Pre-allocated,默认 64M,检查一下,不对改正即可。
最后结果如下:
args: -set device.hostpci0.addr=02.0 -set device.hostpci0.x-igd-gms=0x2 -set device.hostpci0.x-igd-opregion=on -debugcon file:/root/igd_debug.log -global isa-debugcon.iobase=0x402
# ……中间为conf已有内容
hostpci0: 0000:00:02.0,legacy-igd=1,romfile=gen12_igd.rom
hostpci1: 0000:00:1f.3,romfile=gen12_gop.rom
可用的辅助命令
# 查询系统状态是否确实开启了IOMMU
dmesg | grep -e DMAR -e IOMMU -e AMD-Vi
注意事项
实测有部分主板不支持 ACS 功能,故 intel 硬件 IOMMU 打开时, intel 的声卡也和板载 intel 网卡相连。应注意此事,做好买个千兆网卡的准备。
浩睿吐槽:omg,耗了我一宿,好累😪
补充:强制拆分IOMMU的办法
经验:尝试了,但实际效果对 声卡-网卡 “绑定” 现象 无帮助,但有需求时依然可以参考。
5. 开机,安装驱动
- 此步骤略,只要有网,下载个 intel 的驱动确实有手就行。
结束啦,其实早就想做核显直通的笔记了(24年7月),结果这部分的施工最早也才是1月初哈城之旅。好啦,趁着2月这次机会,抓紧写好也不错嘛😉
显卡直通问题
- @jht 的电脑最近有点炸,分析原因才知道,是直通显卡的虚拟机,显卡占用IO,引发了QEMU内核的死机
- 具体表现:
- 挂载usb设备时,usb设备列表无法打开;
- PVE界面无法访问(转圈圈)
- 其余虚拟机运行正常,挂载独显的机器炸了
- 不正常关机,导致掉盘了,有两个虚拟机打不开(实际上是没找到磁盘,磁盘没挂载),一条
lvchange -ay /dev/lvm-jht2/vm-101-disk-0就可以解决了。
- 分析:所以看起来一眼显卡问题
- 问题:没屏蔽
nouveau驱动导致的。
GPT 总结
最开始显卡没有被 vfio 正确接管(nouveau/未绑定),QEMU 在启动或运行中访问 GPU 时,驱动链是混乱的。然后某个时刻(通常是 VM 启动、关机、reset 或中断初始化),QEMU 通过 vfio 向 GPU 发起操作,但 GPU 没有正确响应(可能是驱动不一致、设备没 reset 成功、或资源冲突),内核就在等待这个响应。
- 解决办法
接下来是 GPT 给的步骤:
# 从 PVE 管理里摘掉,避免继续拖死整个系统 mv /etc/pve/qemu-server/106.conf /root/106.conf.bak # 恢复界面 systemctl restart pvestatd pveproxy pvedaemon# 结论直接给你:你的 4060Ti 根本没有被 vfio 接管,当前是“未绑定 + 可能被 nouveau 抢占/残留”的半残状态,这种最容易把 QEMU 卡进 D 状态。这就是你刚才整机被拖死的根因。 # 你现在这行已经说明问题了: # 没有看到 Kernel driver in use: vfio-pci # 只看到 Kernel modules: nouveau # 先彻底修正驱动绑定,不然还会复现。 # 第一步,屏蔽 nouveau: echo "blacklist nouveau" > /etc/modprobe.d/blacklist-nouveau.conf echo "options nouveau modeset=0" >> /etc/modprobe.d/blacklist-nouveau.conf # 第二步,绑定 vfio(你的显卡ID是 10de:2803 和 10de:22bd): echo "options vfio-pci ids=10de:2803,10de:22bd" > /etc/modprobe.d/vfio.conf # 第三步,确保 vfio 模块加载顺序正确: echo -e "vfio\nvfio_pci\nvfio_iommu_type1\nvfio_virqfd" > /etc/modules # 第四步,加内核参数(很关键): # 编辑 /etc/default/grub # 把这一行改成: GRUB_CMDLINE_LINUX_DEFAULT="quiet intel_iommu=on iommu=pt video=efifb:off" # 然后执行: update-grub update-initramfs -u # 重启机器 # 重启后验证(这一步必须做): lspci -nnk | grep -A3 -i nvidia # 须看到即可解决: # Kernel driver in use: vfio-pci
后记
- GPT越来越强了,搁我自己纯找文档修,肯定得修个两三天……太菜了TAT。
- 但是,也得懂计算机的运行原理,才能通过表象很快地定位到具体问题。
- 让其他人来,可能一通描述还给AI搞乱了。
- 所以“经验丰富+AI辅助”的确是当下(20260503)的最优解,至于以后AI能不能完全自主意识嘛……也许会有那么一天?再说,嘿嘿。
- 具体表现: