一、概述
(GPU 直通(KVM PCI Passthrough)是面向服务器 / 虚拟化场景的高阶核心能力)该方案绕过Hypervisor虚拟化层转发,让虚拟机独占物理PCI设备,可实现近乎原生硬件性能(单node情况下,直通虚拟机中的Bandwidth、P2P、NCCL等基本与host持平,而GDS的Throughput相对有一点降低、Latency高一点)。
二、技术原理
2.1 PCI直通核心机制
基于Linux VFIO虚拟化直通框架,通过内核IOMMU硬件隔离技术,将物理PCI设备从Host主机驱动解绑,绑定至VFIO通用直通驱动,再通过libvirt的--hostdev参数将设备完整透传给虚拟机。虚拟机内可直接加载设备原生驱动,完全独占硬件资源。
2.2 核心参数说明
本次统一使用标准直通参数格式,适配所有PCI设备(GPU/NIC/DISK):
--hostdev 00:00.0<BDF>,address.type=pci,address.multifunction=on
BDF:PCI设备唯一标识,格式为总线:插槽.功能(如01:00.0),通过lspci命令查询
address.type=pci:指定设备直通类型为原生PCI设备直通
address.multifunction=on:开启PCI多功能设备支持,适配GPU、网卡等包含多个子功能的硬件,避免设备功能缺失
2.3 组件依赖关系
Host系统:Linux发行版(CentOS7+/Ubuntu20.04+/Debian11+)
虚拟化组件:qemu-kvm、libvirt、virt-install、vfio内核模块
安装介质:官方原版ISO系统镜像
连接方式:SSH远程管理Host主机、VNC远程连接虚拟机安装界面
三、环境前置检查与配置
3.1 硬件虚拟化与IOMMU检查
PCI直通必须依赖CPU硬件虚拟化(Intel VT-d / AMD-Vi)和主板IOMMU功能,需提前开启。
1、检查硬件支持状态
# 检查CPU虚拟化支持
grep -E 'vmx|svm' /proc/cpuinfo
# 检查IOMMU支持
dmesg | grep -i iommu
输出非空即代表硬件支持,若无输出需进入BIOS开启VT-d/AMD-Vi、IOMMU功能。
2、系统开启IOMMU内核参数
编辑内核启动配置文件
vim /etc/default/grub
根据CPU类型添加对应参数至GRUB_CMDLINE_LINUX字段末尾
Intel CPU:intel_iommu=on
AMD CPU:amd_iommu=on
示例(Intel平台):
GRUB_CMDLINE_LINUX="crashkernel=auto spectre_v2=retpoline rd.lvm.lv=centos/root rd.lvm.lv=centos/swap intel_iommu=on"
3、更新grub并重启生效
# CentOS/RHEL
grub2-mkconfig -o /boot/grub2/grub.cfg
# Ubuntu/Debian
update-grub
# 重启系统
reboot
3.2 加载VFIO直通内核模块
开机自动加载VFIO核心模块,用于接管PCI设备
# 编辑模块加载配置
vim /etc/modules-load.d/vfio.conf
# 添加以下内容
vfio
vfio-pci
vfio_iommu_type1
# 生效模块
modprobe vfio
modprobe vfio-pci
modprobe vfio_iommu_type1
# 检查模块加载状态
lsmod | grep vfio
正常输出vfio_pci、vfio_iommu_type1等模块即配置成功。
3.3 安装虚拟化依赖组件
# CentOS/RHEL
yum install -y qemu-kvm libvirt libvirt-daemon-kvm virt-install virt-viewer bridge-utils
# Ubuntu/Debian
apt install -y qemu-kvm libvirt-daemon-system virt-install bridge-utils
# 启动并设置开机自启
systemctl start libvirtd
systemctl enable libvirtd
systemctl restart libvirtd
四、查询待直通设备PCI BDF信息
通过lspci命令查询GPU、网卡、磁盘控制器的BDF地址,为后续直通配置做准备。
lspci | grep -i nvidia # 英伟达GPU
lspci | grep -i ethernet # 物理网卡NIC
lspci | grep -i storage # 磁盘控制器DISK
记录以上设备的BDF地址,后续直通命令直接引用。
五、解绑设备并绑定VFIO驱动(关键步骤)
需将待直通设备从Host原生驱动解绑,绑定至VFIO驱动,否则直通失效。
5.1 查询设备厂商ID与设备ID
lspci -nn | grep 01:00.0 # 替换为你的设备BDF
输出格式:01:00.0 设备名称 [厂商ID:设备ID],记录两组ID。
5.2 配置VFIO永久绑定设备
# 编辑VFIO设备绑定配置
vim /etc/modprobe.d/vfio-pci.conf
# 写入配置(替换为实际的厂商ID:设备ID,多设备逗号分隔)
options vfio-pci ids=10de:1f02,10de:1f03,8086:1563
softdep pre: vfio-pci
5.3 刷新内核并重启生效
# 重建内核镜像
dracut -f /boot/initramfs-$(uname -r).img $(uname -r) # CentOS
update-initramfs -u # Ubuntu
# 重启主机
reboot
重启后可通过lspci -k -s 01:00.0查看设备驱动,显示vfio-pci即绑定成功。
六、virt-install命令创建直通虚拟机
本步骤通过virt-install命令,加载ISO镜像,批量直通GPU、NIC、DISK设备,启用VNC远程连接,全程SSH远程执行。
6.1 前置准备
提前上传系统ISO镜像至Host主机固定目录(如/data/iso/)
提前创建虚拟机磁盘镜像文件(如/data/vm/test.qcow2)
关闭主机防火墙或放行VNC端口(默认5900+端口)
6.2 完整virt-install部署命令
替换命令中BDF地址、镜像路径、磁盘路径、内存CPU参数为实际环境参数,所有设备统一采用标准直通格式。
virt-install \
--name=VM-BBK-01 \
--memory=16384 \
--vcpus=8 \
--cpu host-passthrough \
--os-variant=Ubuntu24.04 # 按需修改:redhat、centos8、ubuntu22.04等
--disk path=/data/vm/test.qcow2,size=100,format=qcow2,bus=pci \
--network bridge=virbr0,model=virtio \
--graphics vnc,listen=0.0.0.0,port=5901,noauth=yes \
--noautoconsole \
# GPU设备直通(替换为实际GPU BDF)
--hostdev 01:00.0,address.type=pci,address.multifunction=on \
# 物理网卡NIC直通(替换为实际网卡BDF)
--hostdev 02:00.0,address.type=pci,address.multifunction=on \
# 磁盘控制器DISK直通(替换为实际磁盘控制器BDF)
--hostdev 03:00.0,address.type=pci,address.multifunction=on \
--cdrom /data/iso/Ubuntu24.04.iso
6.3 核心参数详解
--cpu host-passthrough:CPU直通,最大化虚拟机性能
--graphics vnc:开启VNC远程桌面,监听所有地址,无密码访问,适配远程安装
--noautoconsole:SSH执行时不自动拉起控制台,避免终端阻塞
--hostdev xxx:批量绑定PCI直通设备,严格遵循标准直通格式
七、VNC连接虚拟机完成系统安装
7.1 查看虚拟机VNC端口状态
# 查看虚拟机详细信息,确认VNC端口
virsh vncdisplay VM-BBK-01
# 查看虚拟机运行状态
virsh list --all
7.2 远程VNC连接安装
本地打开VNC客户端(VNC Viewer、TightVNC等)
输入连接地址:Host主机IP:5901
连接成功后自动进入ISO镜像安装界面,按照常规系统安装流程完成分区、系统部署
系统安装完成后,进入虚拟机内部,安装对应GPU、网卡、磁盘控制器原生驱动
八、直通效果验证
8.1 虚拟机内验证设备
8.2 Host主机验证直通状态
# 查看虚拟机绑定的直通设备
virsh dumpxml VM-PASSTHROUGH-01 | grep hostdev
可查询到所有配置的PCI设备直通条目,参数与部署命令一致即为配置生效。
九、总结
基于Linux KVM+libvirt+qemu架构,通过标准化PCI直通参数,完整实现了GPU、NIC、DISK三类核心硬件的设备直通虚拟化。全程采用SSH远程部署+VNC安装的无桌面运维模式,所有直通设备均通过address.type=pci,address.multifunction=on标准参数配置,兼容性强、性能损耗极低。