Files
HK-IT-Docs/Debian13+RX6600显卡直通.md
T

618 lines
8.6 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# 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声卡后,参照键鼠方案即可。