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客户端进行链接。

