8.6 KiB
Debian KVM / QEMU PCI显卡直通完整记录(RX6600)
环境:Debian 13 + KVM/QEMU + libvirt
CPU:AMD Ryzen 9 9950X
主板:技嘉 X870 小雕
宿主机显示:AMD Granite Ridge 核显
直通设备:ASUS RX6600(Navi23)
客户机:Windows 10目标:
- Debian 使用核显输出
- RX6600 完整直通给 Windows 10
- Windows 使用 AMD 原生驱动
一、最终架构
AMD Ryzen 9 9950X
├── 7a:00.0 Granite Ridge 核显
│ |
│ └── amdgpu
│ |
│ └── Debian宿主机显示
│
└── 03:00.0 RX6600 VGA
03:00.1 RX6600 HDMI Audio
|
└── vfio-pci
|
└── Windows 10 VM
RX6600 插 HDMI 显卡欺骗器(dummy plug),保证 Windows 初始化显卡。
二、开启 IOMMU
编辑:
nano /etc/default/grub
原:
GRUB_CMDLINE_LINUX_DEFAULT="quiet splash acpi_enforce_resources=lax"
修改:
GRUB_CMDLINE_LINUX_DEFAULT="quiet amd_iommu=on iommu=pt splash acpi_enforce_resources=lax"
更新:
update-grub
重启。
三、确认 IOMMU 工作
查看:
dmesg | grep -i iommu
正常:
AMD-Vi: IOMMU enabled
查看设备分组:
find /sys/kernel/iommu_groups/ -type l
RX6600:
find /sys/kernel/iommu_groups/ -type l | grep "03:00"
结果:
03:00.0
03:00.1
说明 GPU 和 HDMI Audio 分离。
四、确认显卡信息
查看 PCI:
lspci
RX6600:
03:00.0 VGA controller:
AMD Navi 23 RX6600
03:00.1 Audio device:
AMD HDMI Audio
查看 ID:
lspci -nn -s 03:00.0
得到:
1002:73ff
Audio:
lspci -nn -s 03:00.1
得到:
1002:ab28
五、临时 VFIO 绑定测试
第一次不要急着永久配置。
解除宿主机驱动:
echo "0000:03:00.0" > /sys/bus/pci/drivers/amdgpu/unbind
echo "0000:03:00.1" > /sys/bus/pci/drivers/snd_hda_intel/unbind
绑定 VFIO:
echo "1002 73ff" > /sys/bus/pci/drivers/vfio-pci/new_id
echo "1002 ab28" > /sys/bus/pci/drivers/vfio-pci/new_id
确认:
lspci -k -s 03:00.0
应该:
Kernel driver in use: vfio-pci
六、libvirt 添加 PCI 设备
关闭虚拟机。
添加:
03:00.0 RX6600 VGA
03:00.1 RX6600 Audio
注意:
设备顺序非常重要
错误:
03:00.1 Audio
03:00.0 VGA
可能导致 Windows 无法正确枚举显卡。
正确:
03:00.0 VGA
03:00.1 Audio
七、检查 QEMU 是否收到设备
查看:
virsh qemu-monitor-command Win10 --hmp info pci
应该看到:
VGA controller: PCI device 1002:73ff
Audio controller: PCI device 1002:ab28
八、转换 Windows 为 UEFI(如果需要)
使用 OVMF。
查看:
ls /usr/share/OVMF/
Debian 13:
OVMF_CODE_4M.fd
OVMF_VARS_4M.fd
XML:
<os>
<type arch='x86_64' machine='pc-q35-10.0'>hvm</type>
<loader readonly='yes'
type='pflash'
format='raw'>
/usr/share/OVMF/OVMF_CODE_4M.fd
</loader>
<nvram>
/var/lib/libvirt/qemu/nvram/Win10_VARS.fd
</nvram>
</os>
安装系统时如果遇到文件不权限最简单的方案:
如果你使用的是 libvirt/QEMU,它默认启用了 AppArmor 或 SELinux 来限制虚拟机只能访问 /var/lib/libvirt/images 等特定目录。如果你经常把 ISO 放在 /mnt,可以修改 QEMU 的安全配置:
nano /etc/libvirt/qemu.conf
找到 security_driver 这一行,将其改为:
security_driver = "none"
保存后重启 libvirt 服务:
systemctl restart libvirtd
九、解决 AMD RX6600 Code 43
现象:
第一次启动:
- Windows识别RX6600
- 驱动安装成功
之后:
- 重启VM
- 关机再启动
出现:
AMD Radeon RX6600
Code 43
解决:
1. libvirt隐藏虚拟化信息
编辑:
virsh edit Win10
hyperv中加入:
<vendor_id state='on' value='1234567890ab'/>
2. Windows注册表
路径:
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Class\
{4d36e968-e325-11ce-bfc1-08002be10318}
找到 RX6600 对应项。
增加 DWORD:
EnableMmioSpace
值:
1
增加 DWORD:
DisableDynamicPowerManagement
值:
1
完成后:
测试:
- Windows重启
- Windows关机后重新启动
- virsh destroy/start
均正常。
十、永久 VFIO 绑定
确认临时测试成功后。
创建:
nano /etc/modprobe.d/vfio.conf
内容:
options vfio-pci ids=1002:73ff,1002:ab28
更新:
update-initramfs -u
重启。
确认:
lspci -k -s 03:00.0
结果:
Kernel driver in use: vfio-pci
十一、最终验证
RX6600:
lspci -k -s 03:00.0
结果:
Kernel driver in use: vfio-pci
核显:
lspci -k -s 7a:00.0
结果:
Kernel driver in use: amdgpu
说明:
- RX6600 已完全脱离 Debian
- 核显继续负责宿主机显示
十二、经验总结
1. Code 43 不一定代表直通失败
判断顺序:
- 看 IOMMU group
- 看 VFIO绑定
- 看 QEMU PCI设备
- 看 Windows枚举
- 最后处理驱动兼容
2. AMD显卡直通重点
- VGA function 要优先于 Audio function
- 需要考虑虚拟化隐藏
- 可能需要关闭动态电源管理
- dummy plug 很有帮助
3. 排障原则
不要同时修改:
- BIOS
- GRUB
- VFIO
- XML
- Windows注册表
一次只改一个变量。
当前最终状态
✅ Debian 13 ✅ KVM/QEMU ✅ RX6600 PCI直通 ✅ Windows 10 AMD驱动 ✅ VM重启正常 ✅ VM关机启动正常 ✅ Debian继续使用9950X核显输出
附1. 删除SCSI控制器
操作步骤
- 停止虚拟机
virsh destroy Win10
- 编辑虚拟机配置
virsh edit Win10
- 在XML配置文件中找到SCSI控制器部分,通常如下所示:
<controller type='scsi' index='0' model='virtio-scsi'>
<address type='pci' domain='0x0000' bus='0x03' slot='0x00' function='0x0'/>
</controller>
- 删除整个
<controller>标签块 - 保存并退出编辑器
注意事项
- 删除前请确认没有磁盘使用SCSI控制器
- 如果有磁盘使用SCSI,需要先将磁盘改为使用virtio或IDE控制器
- 这个仅针对设备管理器还有scsi控制感叹号的情况,不删除也不影响使用,纯粹强迫症可以删除
附2. 删除Virtio虚拟显卡
操作步骤
- 在XML配置文件中找到Virtio显卡部分:
<video>
<model type='virtio' heads='1' primary='yes'>
<acceleration accel3d='yes'/>
</model>
<address type='pci' domain='0x0000' bus='0x00' slot='0x02' function='0x0'/>
</video>
- 删除整个
<video>标签块 - 同时删除相关的
<graphics>配置:
<graphics type='vnc' port='-1' autoport='yes' listen='0.0.0.0'>
<listen type='address' address='0.0.0.0'/>
</graphics>
效果
- 删除后Windows中将不再显示Virtio显卡设备
- 物理显卡将完全独占使用
注意事项
如果只是删除virto虚拟显卡,重新开机后,由于vnc仍然存在,会自动生成一个cirrus显卡, 且vnc依然有问题。
所以要不virto虚拟显卡和vnc一起删除,要不就都保留,看自己的需求。如果物理显示器配合了后续的键鼠直通,那么可以一起删除了,完全没用。
附3. 添加键鼠直通配置
3.1 查找USB设备信息
- 查看当前USB设备:
lsusb
- 查找键盘和鼠标的Vendor ID和Product ID:
Bus 002 Device 003: ID 046d:c52b Logitech, Inc. Unifying Receiver
3.2 编辑虚拟机配置
在XML配置文件的<devices>部分添加以下内容:
<hostdev mode='subsystem' type='usb' managed='yes'>
<source>
<vendor id='0x046d'/>
<product id='0xc52b'/>
</source>
<address type='usb' bus='0' port='1'/>
</hostdev>
3.3 多设备配置
如果有多个USB设备,可以添加多个<hostdev>块:
<!-- 键盘 -->
<hostdev mode='subsystem' type='usb' managed='yes'>
<source>
<vendor id='0x046d'/>
<product id='0xc52b'/>
</source>
<address type='usb' bus='0' port='1'/>
</hostdev>
<!-- 鼠标 -->
<hostdev mode='subsystem' type='usb' managed='yes'>
<source>
<vendor id='0x046d'/>
<product id='0xc07d'/>
</source>
<address type='usb' bus='0' port='2'/>
</hostdev>
声卡直通
显示器、键鼠、是不是还差声音了,不过不建议直通板载声卡,网上买一个USB声卡后,参照键鼠方案即可。