618 lines
8.6 KiB
Markdown
618 lines
8.6 KiB
Markdown
# 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声卡后,参照键鼠方案即可。
|