添加debian13下RX6600显卡直通方案

This commit is contained in:
2026-07-08 14:33:42 +08:00
parent 1777c99bc3
commit 04f09fd352
+617
View File
@@ -0,0 +1,617 @@
# Debian KVM / QEMU PCI显卡直通完整记录(RX6600
> 环境:Debian 13 + KVM/QEMU + libvirt
> CPUAMD Ryzen 9 9950X
> 主板:技嘉 X870 小雕
> 宿主机显示:AMD Granite Ridge 核显
> 直通设备:ASUS RX6600Navi23
> 客户机: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
<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 的安全配置:
```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
<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 绑定
确认临时测试成功后。
创建:
```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
<controller type='scsi' index='0' model='virtio-scsi'>
<address type='pci' domain='0x0000' bus='0x03' slot='0x00' function='0x0'/>
</controller>
```
4. 删除整个`<controller>`标签块
5. 保存并退出编辑器
### 注意事项
- 删除前请确认没有磁盘使用SCSI控制器
- 如果有磁盘使用SCSI,需要先将磁盘改为使用virtio或IDE控制器
- 这个仅针对设备管理器还有scsi控制感叹号的情况,不删除也不影响使用,纯粹强迫症可以删除
# 附2. 删除Virtio虚拟显卡
## 操作步骤
1. 在XML配置文件中找到Virtio显卡部分:
```xml
<video>
<model type='virtio' heads='1' primary='yes'>
<acceleration accel3d='yes'/>
</model>
<address type='pci' domain='0x0000' bus='0x00' slot='0x02' function='0x0'/>
</video>
```
2. 删除整个`<video>`标签块
3. 同时删除相关的`<graphics>`配置:
```xml
<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设备信息
1. 查看当前USB设备:
```bash
lsusb
```
2. 查找键盘和鼠标的Vendor ID和Product ID
```
Bus 002 Device 003: ID 046d:c52b Logitech, Inc. Unifying Receiver
```
## 3.2 编辑虚拟机配置
在XML配置文件的`<devices>`部分添加以下内容:
```xml
<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>`块:
```xml
<!-- 键盘 -->
<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声卡后,参照键鼠方案即可。