添加debian13下RX6600显卡直通方案
This commit is contained in:
@@ -0,0 +1,617 @@
|
||||
# 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
|
||||
<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声卡后,参照键鼠方案即可。
|
||||
Reference in New Issue
Block a user