# 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 编辑: ```bash nano /etc/default/grub ``` 原: ```bash GRUB_CMDLINE_LINUX_DEFAULT="quiet splash acpi_enforce_resources=lax" ``` 修改: ```bash GRUB_CMDLINE_LINUX_DEFAULT="quiet amd_iommu=on iommu=pt splash acpi_enforce_resources=lax" ``` 更新: ```bash update-grub ``` 重启。 --- # 三、确认 IOMMU 工作 查看: ```bash dmesg | grep -i iommu ``` 正常: ``` AMD-Vi: IOMMU enabled ``` 查看设备分组: ```bash find /sys/kernel/iommu_groups/ -type l ``` RX6600: ```bash find /sys/kernel/iommu_groups/ -type l | grep "03:00" ``` 结果: ``` 03:00.0 03:00.1 ``` 说明 GPU 和 HDMI Audio 分离。 --- # 四、确认显卡信息 查看 PCI: ```bash lspci ``` RX6600: ``` 03:00.0 VGA controller: AMD Navi 23 RX6600 03:00.1 Audio device: AMD HDMI Audio ``` 查看 ID: ```bash lspci -nn -s 03:00.0 ``` 得到: ``` 1002:73ff ``` Audio: ```bash lspci -nn -s 03:00.1 ``` 得到: ``` 1002:ab28 ``` --- # 五、临时 VFIO 绑定测试 第一次不要急着永久配置。 解除宿主机驱动: ```bash 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: ```bash echo "1002 73ff" > /sys/bus/pci/drivers/vfio-pci/new_id echo "1002 ab28" > /sys/bus/pci/drivers/vfio-pci/new_id ``` 确认: ```bash 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 是否收到设备 查看: ```bash virsh qemu-monitor-command Win10 --hmp info pci ``` 应该看到: ``` VGA controller: PCI device 1002:73ff Audio controller: PCI device 1002:ab28 ``` --- # 八、转换 Windows 为 UEFI(如果需要) 使用 OVMF。 查看: ```bash ls /usr/share/OVMF/ ``` Debian 13: ``` OVMF_CODE_4M.fd OVMF_VARS_4M.fd ``` XML: ```xml hvm /usr/share/OVMF/OVMF_CODE_4M.fd /var/lib/libvirt/qemu/nvram/Win10_VARS.fd ``` 安装系统时如果遇到文件不权限最简单的方案: 如果你使用的是 libvirt/QEMU,它默认启用了 AppArmor 或 SELinux 来限制虚拟机只能访问 /var/lib/libvirt/images 等特定目录。如果你经常把 ISO 放在 /mnt,可以修改 QEMU 的安全配置: ```bash nano /etc/libvirt/qemu.conf ``` 找到 security_driver 这一行,将其改为: ```bash security_driver = "none" ``` 保存后重启 libvirt 服务: ```bash systemctl restart libvirtd ``` --- # 九、解决 AMD RX6600 Code 43 现象: 第一次启动: * Windows识别RX6600 * 驱动安装成功 之后: * 重启VM * 关机再启动 出现: ``` AMD Radeon RX6600 Code 43 ``` 解决: --- ## 1. libvirt隐藏虚拟化信息 编辑: ```bash virsh edit Win10 ``` hyperv中加入: ```xml ``` --- ## 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 绑定 确认临时测试成功后。 创建: ```bash nano /etc/modprobe.d/vfio.conf ``` 内容: ```text options vfio-pci ids=1002:73ff,1002:ab28 ``` 更新: ```bash update-initramfs -u ``` 重启。 确认: ```bash lspci -k -s 03:00.0 ``` 结果: ``` Kernel driver in use: vfio-pci ``` --- # 十一、最终验证 RX6600: ```bash lspci -k -s 03:00.0 ``` 结果: ``` Kernel driver in use: vfio-pci ``` 核显: ```bash lspci -k -s 7a:00.0 ``` 结果: ``` Kernel driver in use: amdgpu ``` 说明: * RX6600 已完全脱离 Debian * 核显继续负责宿主机显示 --- # 十二、经验总结 ## 1. Code 43 不一定代表直通失败 判断顺序: 1. 看 IOMMU group 2. 看 VFIO绑定 3. 看 QEMU PCI设备 4. 看 Windows枚举 5. 最后处理驱动兼容 --- ## 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控制器 ### 操作步骤 1. 停止虚拟机 ```bash virsh destroy Win10 ``` 2. 编辑虚拟机配置 ```bash virsh edit Win10 ``` 3. 在XML配置文件中找到SCSI控制器部分,通常如下所示: ```xml
``` 4. 删除整个``标签块 5. 保存并退出编辑器 ### 注意事项 - 删除前请确认没有磁盘使用SCSI控制器 - 如果有磁盘使用SCSI,需要先将磁盘改为使用virtio或IDE控制器 - 这个仅针对设备管理器还有scsi控制感叹号的情况,不删除也不影响使用,纯粹强迫症可以删除 # 附2. 删除Virtio虚拟显卡 ## 操作步骤 1. 在XML配置文件中找到Virtio显卡部分: ```xml