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

8.6 KiB
Raw Permalink Blame History

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

编辑:

nano /etc/default/grub

原:

GRUB_CMDLINE_LINUX_DEFAULT="quiet splash acpi_enforce_resources=lax"

修改:

GRUB_CMDLINE_LINUX_DEFAULT="quiet amd_iommu=on iommu=pt splash acpi_enforce_resources=lax"

更新:

update-grub

重启。


三、确认 IOMMU 工作

查看:

dmesg | grep -i iommu

正常:

AMD-Vi: IOMMU enabled

查看设备分组:

find /sys/kernel/iommu_groups/ -type l

RX6600

find /sys/kernel/iommu_groups/ -type l | grep "03:00"

结果:

03:00.0
03:00.1

说明 GPU 和 HDMI Audio 分离。


四、确认显卡信息

查看 PCI

lspci

RX6600

03:00.0 VGA controller:
AMD Navi 23 RX6600

03:00.1 Audio device:
AMD HDMI Audio

查看 ID

lspci -nn -s 03:00.0

得到:

1002:73ff

Audio

lspci -nn -s 03:00.1

得到:

1002:ab28

五、临时 VFIO 绑定测试

第一次不要急着永久配置。

解除宿主机驱动:

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

echo "1002 73ff" > /sys/bus/pci/drivers/vfio-pci/new_id

echo "1002 ab28" > /sys/bus/pci/drivers/vfio-pci/new_id

确认:

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 是否收到设备

查看:

virsh qemu-monitor-command Win10 --hmp info pci

应该看到:

VGA controller: PCI device 1002:73ff

Audio controller: PCI device 1002:ab28

八、转换 Windows 为 UEFI(如果需要)

使用 OVMF。

查看:

ls /usr/share/OVMF/

Debian 13

OVMF_CODE_4M.fd
OVMF_VARS_4M.fd

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 的安全配置:

nano /etc/libvirt/qemu.conf

找到 security_driver 这一行,将其改为:

security_driver = "none"

保存后重启 libvirt 服务:

systemctl restart libvirtd

九、解决 AMD RX6600 Code 43

现象:

第一次启动:

  • Windows识别RX6600
  • 驱动安装成功

之后:

  • 重启VM
  • 关机再启动

出现:

AMD Radeon RX6600
Code 43

解决:


1. libvirt隐藏虚拟化信息

编辑:

virsh edit Win10

hyperv中加入:

<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 绑定

确认临时测试成功后。

创建:

nano /etc/modprobe.d/vfio.conf

内容:

options vfio-pci ids=1002:73ff,1002:ab28

更新:

update-initramfs -u

重启。

确认:

lspci -k -s 03:00.0

结果:

Kernel driver in use: vfio-pci

十一、最终验证

RX6600

lspci -k -s 03:00.0

结果:

Kernel driver in use: vfio-pci

核显:

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. 停止虚拟机
virsh destroy Win10
  1. 编辑虚拟机配置
virsh edit Win10
  1. 在XML配置文件中找到SCSI控制器部分,通常如下所示:
<controller type='scsi' index='0' model='virtio-scsi'>
  <address type='pci' domain='0x0000' bus='0x03' slot='0x00' function='0x0'/>
</controller>
  1. 删除整个<controller>标签块
  2. 保存并退出编辑器

注意事项

  • 删除前请确认没有磁盘使用SCSI控制器
  • 如果有磁盘使用SCSI,需要先将磁盘改为使用virtio或IDE控制器
  • 这个仅针对设备管理器还有scsi控制感叹号的情况,不删除也不影响使用,纯粹强迫症可以删除

附2. 删除Virtio虚拟显卡

操作步骤

  1. 在XML配置文件中找到Virtio显卡部分:
<video>
  <model type='virtio' heads='1' primary='yes'>
    <acceleration accel3d='yes'/>
  </model>
  <address type='pci' domain='0x0000' bus='0x00' slot='0x02' function='0x0'/>
</video>
  1. 删除整个<video>标签块
  2. 同时删除相关的<graphics>配置:
<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设备:
lsusb
  1. 查找键盘和鼠标的Vendor ID和Product ID
Bus 002 Device 003: ID 046d:c52b Logitech, Inc. Unifying Receiver

3.2 编辑虚拟机配置

在XML配置文件的<devices>部分添加以下内容:

<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>块:

<!-- 键盘 -->
<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声卡后,参照键鼠方案即可。