Skip to content

Ubuntu 22.04.2 Server 虚拟机 + AMD GPU 直通完整步骤

1. 前置检查

1.1 确认 CPU/主板支持 IOMMU

bash
# AMD CPU
egrep -c '(svm|vmx)' /proc/cpuinfo
# 返回值 > 0 表示支持虚拟化

# 查看是否加载 IOMMU 相关模块
lsmod | grep -i kvm
lsmod | grep -i vfio

进入主板 UEFI/BIOS,开启:

  • SVM Mode / Intel VT-x
  • IOMMU / AMD-Vi / VT-d
  • Above 4G Decoding(部分显卡需要)
  • 关闭 CSM,使用纯 UEFI 启动(直通显卡推荐)

1.2 下载 ISO

bash
wget https://old-releases.ubuntu.com/releases/22.04.2/ubuntu-22.04.2-live-server-amd64.iso
# 或从 Ubuntu 官方镜像站下载后放到 /var/lib/libvirt/images/

2. 宿主机安装 KVM/QEMU/libvirt

bash
sudo apt update
sudo apt install -y \
    qemu-kvm \
    qemu-utils \
    libvirt-daemon-system \
    libvirt-clients \
    bridge-utils \
    virt-manager \
    virtinst \
    cpu-checker \
    ovmf

# 把当前用户加入 libvirt/kvm 组(需重新登录生效)
sudo usermod -aG libvirt,kvm $USER

sudo systemctl enable --now libvirtd

3. 启用 IOMMU 与 VFIO

3.1 修改 GRUB

编辑 /etc/default/grub

bash
sudo nano /etc/default/grub

AMD CPU 示例:

text
GRUB_CMDLINE_LINUX_DEFAULT="quiet amd_iommu=on iommu=pt rd.driver.pre=vfio-pci"

如果 IOMMU 分组不理想,可追加 ACS override(需 patched kernel 或该参数已被支持):

text
GRUB_CMDLINE_LINUX_DEFAULT="quiet amd_iommu=on iommu=pt rd.driver.pre=vfio-pci pcie_acs_override=downstream,multifunction"

更新并重启:

bash
sudo update-grub
sudo reboot

3.2 验证 IOMMU

bash
dmesg | grep -i -E "iommu|AMD-Vi|DMAR"

应看到类似:

text
AMD-Vi: Interrupt remapping enabled
AMD-Vi: Virtual APIC enabled
pci 0000:00:00.2: AMD-Vi: IOMMU performance counters supported

查看 IOMMU 分组:

bash
for d in /sys/kernel/iommu_groups/*/devices/*; do
    n=${d#*/iommu_groups/*}; n=${n%%/*}
    printf 'IOMMU Group %s ' "$n"
    lspci -nns "${d##*/}"
done

目标显卡及其 HDMI/DP 音频控制器最好独占一个 IOMMU 组。


4. 绑定 AMD GPU 到 vfio-pci

4.1 查找设备 ID

bash
lspci -nn | grep -iE 'vga|amd'

示例输出:

text
0b:00.0 VGA compatible controller [0300]: Advanced Micro Devices, Inc. [AMD/ATI] Navi 23 [Radeon RX 6650 XT] [1002:73ef] (rev c1)
0b:00.1 Audio device [0403]: Advanced Micro Devices, Inc. [AMD/ATI] Navi 21/23 HDMI/DP Audio Controller [1002:ab28]

记录 1002:73ef1002:ab28

4.2 方式 A:启动时永久绑定(推荐双显卡场景)

bash
# 加载 VFIO 模块
sudo tee /etc/modules-load.d/vfio.conf <<'EOF'
vfio
vfio_iommu_type1
vfio_pci
EOF

# 绑定指定显卡 ID(把示例 ID 换成你自己的)
sudo tee /etc/modprobe.d/vfio.conf <<'EOF'
options vfio-pci ids=1002:73ef,1002:ab28
options vfio-pci disable_vga=1
EOF

# 如果宿主机也是 AMD 显卡,可加入 softdep 让 vfio 优先加载
# echo 'softdep amdgpu pre: vfio-pci' | sudo tee -a /etc/modprobe.d/vfio.conf

sudo update-initramfs -u
sudo reboot

重启后验证:

bash
lspci -nnk -s 0b:00

应显示 Kernel driver in use: vfio-pci

4.3 方式 B:运行时手动绑定(适合测试/单卡切换)

提供了脚本 scripts/bind-gpu-to-vfio.sh,用法:

bash
sudo bash scripts/bind-gpu-to-vfio.sh 0000:0b:00.0 0000:0b:00.1

5. 创建 Ubuntu Server 虚拟机

5.1 使用 virt-manager 图形方式

  1. 启动 virt-manager → 新建虚拟机
  2. 选择 Local install media → 选择 ubuntu-22.04.2-live-server-amd64.iso
  3. 操作系统类型:Linux,版本:Ubuntu 22.04 LTS
  4. 内存建议 ≥ 4GB,CPU ≥ 2 核,开启 Copy host CPU configuration
  5. 磁盘 ≥ 25GB
  6. 创建完成后先不要启动,打开 VM 详情:
    • OverviewFirmware 选择 OVMF_CODE_4M.fd(UEFI)
    • OverviewChipset 选择 Q35
    • 删除默认 Display SpiceVideo QXL(或保留作安装调试)
    • 添加硬件 → PCI Host Device → 选择 AMD GPU(通常有两个 function:video + audio),勾选 All Functions
    • GPU 的 XML 中确认 <address multifunction='on'/>

5.2 导入现成 XML 模板

bash
# 先复制模板并编辑 PCI 地址、内存、CPU 为你自己的配置
cp scripts/ubuntu-server-vm.xml /tmp/my-ubuntu-vm.xml
nano /tmp/my-ubuntu-vm.xml

# 定义虚拟机
virsh define /tmp/my-ubuntu-vm.xml

6. 处理 AMD Reset Bug

如果你的显卡在 VM 第一次启动正常,但关闭后第二次启动失败,说明遇到 AMD Reset Bug

6.1 临时规避

每次 VM 关闭后重启宿主机。

6.2 使用 vendor-reset

bash
sudo apt install -y git dkms build-essential linux-headers-$(uname -r)
git clone https://github.com/gnif/vendor-reset.git
cd vendor-reset
sudo dkms install .

echo "vendor-reset" | sudo tee -a /etc/modules
sudo update-initramfs -u
sudo reboot

加载模块后,VM 启动时 dmesg 会出现类似:

text
vfio-pci 0000:0b:00.0: AMD_NAVI23: performing reset

vendor-reset 对新内核支持可能需手动打补丁,参考仓库 Issues / PR。


7. 虚拟机内安装 AMD 驱动

Ubuntu Server 默认无图形界面。若仅需 GPU 计算,安装 ROCm:

bash
# 在虚拟机内部执行
sudo apt update
sudo apt install -y linux-modules-extra-$(uname -r)

# 下载 AMD 官方 ROCm 安装器
wget https://repo.radeon.com/amdgpu-install/latest/ubuntu/jammy/amdgpu-install_6.x.x_amd64.deb
sudo dpkg -i amdgpu-install_6.x.x_amd64.deb
sudo amdgpu-install --usecase=rocm

# 验证
rocminfo
sudo usermod -aG video,render $USER

具体 ROCm 版本号请到 AMD ROCm 官方仓库 查看最新 .deb


8. 常见问题排查

现象可能原因解决
vfio: error getting device from group X同一 IOMMU 组里还有其它设备未直通一起直通,或 ACS override / 换插槽
VM 启动后黑屏,但显卡风扇转guest 还没加载 amdgpu / ROCm先用 VNC/SPICE 安装驱动
amdgpu 仍占用了直通卡vfio 未优先加载检查 GRUB 参数、vfio-pci ids、initramfs
VM 只能启动一次AMD Reset Bug使用 vendor-reset 或宿主机重启
宿主机无显示把主显卡也绑定到 vfio不要把主显卡的 ID 写进 vfio.conf

9. 安全回滚

如果配置导致宿主机无法启动:

  1. GRUB 启动界面按 e,删除 amd_iommu=on iommu=pt ... 相关参数,按 Ctrl+X 启动。
  2. 进入系统后恢复 /etc/default/grub/etc/modprobe.d/vfio.conf
  3. 重新 update-grub && update-initramfs -u