主题
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-xIOMMU/AMD-Vi/VT-dAbove 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 libvirtd3. 启用 IOMMU 与 VFIO
3.1 修改 GRUB
编辑 /etc/default/grub:
bash
sudo nano /etc/default/grubAMD 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 reboot3.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:73ef 和 1002: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.15. 创建 Ubuntu Server 虚拟机
5.1 使用 virt-manager 图形方式
- 启动
virt-manager→ 新建虚拟机 - 选择
Local install media→ 选择ubuntu-22.04.2-live-server-amd64.iso - 操作系统类型:
Linux,版本:Ubuntu 22.04 LTS - 内存建议 ≥ 4GB,CPU ≥ 2 核,开启
Copy host CPU configuration - 磁盘 ≥ 25GB
- 创建完成后先不要启动,打开 VM 详情:
Overview→Firmware选择OVMF_CODE_4M.fd(UEFI)Overview→Chipset选择Q35- 删除默认
Display Spice和Video 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.xml6. 处理 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 resetvendor-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. 安全回滚
如果配置导致宿主机无法启动:
- GRUB 启动界面按
e,删除amd_iommu=on iommu=pt ...相关参数,按Ctrl+X启动。 - 进入系统后恢复
/etc/default/grub和/etc/modprobe.d/vfio.conf。 - 重新
update-grub && update-initramfs -u。