AI服务器GPU直通配置:让虚拟机独占物理显卡的实操步骤
GPU直通是把一张物理显卡完整交给某台虚拟机独占使用,宿主机不再加载它的常规驱动。
和vGPU共享、MIG切分不同,直通后虚拟机内看到的是一张完整GPU,CUDA性能接近裸机。
适用条件是服务器CPU和主板支持VT-d/AMD-Vi,且显卡本身允许直通(多数数据中心卡支持,部分消费卡有复位问题)。
先确认硬件和系统是否具备直通条件
直通依赖IOMMU(输入输出内存管理单元),它负责把PCIe设备的安全访问权限隔离给虚拟机。
登录宿主机后按顺序检查:
- 确认CPU虚拟化与IOMMU已在BIOS/UEFI中开启。Intel平台找
VT-d,AMD平台找IOMMU,通常位于Advanced或Chipset菜单。 - 确认内核已启用IOMMU。编辑GRUB配置:
# Intel平台
GRUB_CMDLINE_LINUX="intel_iommu=on iommu=pt"
# AMD平台
GRUB_CMDLINE_LINUX="amd_iommu=on iommu=pt"
更新后重启并验证:
update-grub # Debian/Ubuntu,CentOS用 grub2-mkconfig -o /boot/grub2/grub.cfg
reboot
dmesg | grep -i iommu
看到 DMAR: IOMMU enabled 或 AMD-Vi: Interrupt remapping enabled 才算正常。
- 确认显卡所在IOMMU分组。执行
for d in /sys/kernel/iommu_groups/*/devices/*; do n=${d#*/iommu_groups/*}; n=${n%%/*}; printf 'IOMMU Group %s ' "$n"; lspci -nns "${d##*/}"; done,找到GPU及其音频功能是否在同一组。如果GPU和网卡、SATA控制器同组,直通会连带隔离其他设备,需要调整PCIe插槽或接受无法直通。
把GPU从宿主机解绑并交给vfio-pci
宿主机不能同时用NVIDIA驱动和vfio驱动管理同一张卡。
先获取GPU的PCI地址:
lspci -nn | grep -i nvidia
# 输出示例:01:00.0 3D controller [0302]: NVIDIA Corporation GA100 [A100] [10de:20b2]
记录 01:00.0 和厂商设备ID 10de:20b2,音频功能通常是 01:00.1。
然后做两件事:
- 在
/etc/modprobe.d/vfio.conf写入options vfio-pci ids=10de:20b2,如果有音频功能一并加入。 - 在
/etc/modprobe.d/blacklist.conf中屏蔽宿主机NVIDIA驱动:blacklist nouveau和blacklist nvidia。
更新initramfs并重启:
update-initramfs -u -k all # CentOS用 dracut -f
reboot
重启后验证绑定结果:
lspci -nnk -s 01:00.0
# 应看到 Kernel driver in use: vfio-pci
如果仍显示 nvidia,说明屏蔽顺序或initramfs未生效,检查 dmesg | grep -i vfio 是否有绑定失败记录。
在KVM虚拟机中挂载直通GPU
以libvirt管理的KVM为例,用 virsh edit 虚拟机名 编辑XML,在 段加入:
如果虚拟机使用UEFI启动,还需要在 中启用 ,避免NVIDIA驱动检测到虚拟化环境后拒绝加载。
保存后启动虚拟机,进入系统执行 nvidia-smi,能列出GPU型号和显存即表示直通成功。
常见失败原因和避坑提醒
- 虚拟机启动报“Failed to assign device”:多为IOMMU分组不干净或设备仍被宿主机占用。回到宿主机用
lsof /dev/nvidia*检查是否有进程占用,必要时先卸载宿主机驱动。 - 虚拟机内nvidia-smi报“No devices were found”:检查XML中PCI地址是否写错,以及虚拟机是否使用了与宿主机冲突的驱动版本。
- 直通后宿主机无法再用该GPU:这是预期行为。直通是独占模式,宿主机监控工具看不到该卡属正常现象,不要误判为掉卡。
- 消费级显卡直通后虚拟机重启失败:部分GeForce卡存在复位bug,需要在XML中加
或使用厂商提供的直通ROM,企业级卡通常无此问题。
直通配置完成后,建议在虚拟机内跑一次 nvidia-smi -q 和简单的CUDA样例,确认算力可用。
如果后续需要多虚拟机共享同一张卡,应改用vGPU或MIG方案,而不是反复切换直通绑定。