KVM 手动直通 NVIDIA 2080 Ti 显卡和 PCIe NVMe SSD

KVM 手动直通 NVIDIA 2080 Ti 显卡和 PCIe NVMe SSD

本文介绍在 KVM 虚拟化环境 下,将 NVIDIA 2080 Ti 显卡 和 PCIe NVMe SSD 手动直通到虚拟机(VM)的完整流程,包括:查看硬件、绑定 VFIO、修改 XML、更新 initramfs、启动虚拟机 等操作。

1、硬件信息查看
使用 lspci 命令查看 PCI 设备信息:
# 查看 NVMe 和显卡相关设备

 lspci -nn | grep NV
41:00.0 VGA compatible controller [0300]: NVIDIA Corporation TU102 [GeForce RTX 2080 Ti] [10de:1e04] (rev a1)
41:00.1 Audio device [0403]: NVIDIA Corporation Device [10de:10f7] (rev a1)
41:00.2 USB controller [0c03]: NVIDIA Corporation Device [10de:1ad6] (rev a1)
41:00.3 Serial bus controller [0c80]: NVIDIA Corporation Device [10de:1ad7] (rev a1)

# 查看NVMe SSD
3d:00.0 Non-Volatile memory controller: Samsung Electronics Co Ltd Device a825

2、PCI设备加入 VFIO
VFIO(Virtual Function I/O)是 Linux 提供的一种 安全直通 PCI/PCIe 设备给虚拟机 的机制。
它的作用主要有:
将 PCIe 设备交给 QEMU/KVM 使用
避免宿主系统占用或干扰设备
提供安全、稳定的直通环境
绑定规则:
对显卡(多功能 device:GPU + Audio + USB + Serial)来说,需要 VFIO 绑定所有相关 function。
对 NVMe SSD,只需要绑定对应 device(通常 function 0)即可。
GPU:绑定所有功能(function 0~3)
NVMe SSD:只绑定 function 0

VFIO 配置(lspci -nn)
# VFIO 绑定绑定 Samsung NVMe SSD( lspci -nn )
echo "options vfio-pci ids=144d:a825" > /etc/modprobe.d/vfio.conf

# VFIO 绑定绑定显卡(lspci -nn)
echo "options vfio-pci ids=10de:1e04,10de:10f7,10de:1ad6,10de:1ad7" >> /etc/modprobe.d/vfio.conf

#加载模块
modprobe vfio
modprobe vfio-pci

3、更新 initramfs
为了保证 VFIO 模块在系统启动前加载,需要更新 initramfs

dracut -f
重启
reboot
验证是否成功
lspci -nnk | grep -A3 3d:00.0

4、虚拟机 XML 配置示例
#显卡直通 虚拟机XML文件

 <video>
      <model type='cirrus' vram='16384' heads='1' primary='yes'/>
      <address type='pci' domain='0x0000' bus='0x00' slot='0x01' function='0x0'/>
    </video>
    <hostdev mode='subsystem' type='pci' managed='no'>
      <driver name='vfio'/>
      <source>
        <address domain='0x0000' bus='0x41' slot='0x00' function='0x0'/>
      </source>
      <rom bar='on' file='/var/lib/zstack/pcirom/50aa30f480ed4937a300585c6b668fdf'/>
    </hostdev>
    <hostdev mode='subsystem' type='pci' managed='no'>
      <driver name='vfio'/>
      <source>
        <address domain='0x0000' bus='0x41' slot='0x00' function='0x1'/>
      </source>
    </hostdev>
    <hostdev mode='subsystem' type='pci' managed='no'>
      <driver name='vfio'/>
      <source>
        <address domain='0x0000' bus='0x41' slot='0x00' function='0x2'/>
      </source>
    </hostdev>
    <hostdev mode='subsystem' type='pci' managed='no'>
      <driver name='vfio'/>
      <source>
        <address domain='0x0000' bus='0x41' slot='0x00' function='0x3'/>
      </source>
    </hostdev>
可以删除 <address> 元素,让 libvirt 自动选择空闲 PCI 地址,避免冲突。

#硬盘直通 虚拟机XML文件
<hostdev mode='subsystem' type='pci' managed='yes'>
  <driver name='vfio'/>
  <source>
    <address domain='0x0000' bus='0x3d' slot='0x00' function='0x0'/>
  </source>
  <address type='pci' domain='0x0000' bus='0x0f' slot='0x00' function='0x0'/>
</hostdev>
SSD PCI 地址必须与虚拟机其他设备不冲突,可手动指定唯一 bus/slot/function,或删除 <address> 让 libvirt 自动分配。

5、启动虚拟机

 virsh start ad7f750b87694a27a29f099e1c0dcd44

6、查看虚拟机的VNC端口号

[root@localhost ~]#  virsh vncdisplay ad7f750b87694a27a29f099e1c0dcd44
:0
#表示端口默认是5900,可以使用VNC客户端进行链接。

评论已关闭。