银河麒麟V10配置KVM的Ubuntu虚机GPU直通实战
银河麒麟V10配置KVM的Ubuntu虚机GPU实战
注:typora导入的markdown部分格式可能有问题
KVM安装
跌跌撞撞,搜了许多资料作为参考,实际都遇到了各自问题,最后自己完成整个流程作为记录,看似不多的内容耗费了许多的时间,属实不易。
系统以及内核
先是KVM的安装,查看自己的CPU是否支持虚拟化技术且是64位
Intel:cat /proc/cpuinfo | grep --color vmx
AMD: cat /proc/cpuinfo | grep --color svm
配置Yum
wget -O /etc/yum.repos.d/CentOS-Base.repo http://mirrors.aliyun.com/repo/Centos-7.repo
安装KVM
yum install -y qemu-kvm libvirt libguestfs-tools virt-viewer virt-install virt-manager libvirt-python acpid
qemu-kvm : kvm主程序, KVM虚拟化模块
virt-manager: KVM图形化管理工具
libvirt: 虚拟化服务
libguestfs-tools : 虚拟机的系统管理工具
virt-install :安装虚拟机的实用工具,比如virt-clon克隆工具就是这个包安装的
libvirt-python : python调用libvirt虚拟化服务的api接口库文件
acpid:虚拟机的电源按钮服务
libvirtd 服务启动
[root@zy11 ~]# systemctl start libvirtd #开启虚拟化服务
[root@zy11 ~]# systemctl enable libvirtd #设置libvirtd服务开机启动
[root@zy11 ~]# systemctl is-enabled libvirtd #查看是不是开机启动
acpid 服务启动
[root@zy11 ~]# systemctl start acpid (开启虚拟机的电源模式服务)
[root@zy11 ~]# systemctl enable acpid
[root@zy11 ~]# systemctl is-enabled acpid
KVM内核加载查看
modprobe kvm
lsmod | grep kvm #查看kvm内核
查看虚拟工具版本
virsh --version
virt-install --version
qemu-kvm -version
GPU直通KVM的Ubuntu虚机配置
1.启用 IOMMU
编辑/etc/default/grub
文件,找到GRUB_CMDLINE_LINUX_DEFAULT
这一行,添加intel_iommu=on
(Intel CPU)或amd_iommu=on
(AMD CPU)参数。
保存后更新grub
配置,重启宿主机使设置生效。
vim /etc/default/grub
GRUB_CMDLINE_LINUX_DEFAULT="quiet splash intel_iommu=on即可,按照CPU型号添加
" #""中只添加intel_iommu=on即可,按照CPU型号添加
update-grub #更新
reboot #重启
重启后查看是否生效
- Intel CPU:如果 IOMMU 启用成功,可能会看到类似
intel_iommu: Enabled
的输出。 - AMD CPU:可能会看到类似
AMD IOMMUv2 Driver by Joerg Roedel <joerg.roedel@amd.com>
以及AMD IOMMU enabled
等信息。
dmesg | grep -i iommu
检查 /sys/kernel/iommu_groups
目录,/sys
目录存储了系统设备和内核状态的相关信息,通过检查其中与 IOMMU 相关的文件和目录可以判断 IOMMU 是否启用,如果 IOMMU 启用,该目录下会列出多个子目录,每个子目录代表一个 IOMMU 组,里面包含了属于该组的设备信息。
ls /sys/kernel/iommu_groups
2.屏蔽宿主机 GPU 驱动
vfio-pci
是 Linux 内核中的一个设备驱动模块,主要用于安全地隔离和直通物理 PCIe 设备(如显卡、网卡、USB 控制器等)到虚拟机(如 KVM 虚拟机),使虚拟机能够直接访问物理设备,获得接近原生的性能。
/etc/modules-load.d/vfio-pci.conf
:指定开机自动加载的内核模块
vim /etc/modules-load.d/vfio-pci.conf
vfio
vfio_iommu_type1
vfio_pci
vfio_virqfd
卸载原有的nvidia的驱动
yum remove -y nvidia-* libnvidia-*
因为主机原本已经有nvidia驱动,设备已经被物理主机给占用了,所以要先做好配置之后重启,把显卡过度给vfio-pci。
获取 GPU 的 PCI 地址和设备 ID
lspci -nn | grep -i nvidia # 以NVIDIA GPU为例
参数部分 | 含义说明 |
---|---|
0b:00.0 | 显卡的 PCIe 总线地址,用于唯一标识设备在 PCI 总线上的位置: - 0b :总线号(十六进制,对应十进制 11) - 00 :设备号 - 0 :功能号(单功能设备通常为 0) |
3D controller [0302] | 设备类型及 PCI 分类代码: - 3D controller :说明这是 3D 加速控制器(专业显卡常见类型,区别于普通显卡的VGA compatible controller ) - [0302] :PCI 标准分类代码,03 代表显示控制器,02 是 3D 控制器的子类别 |
NVIDIA Corporation | 设备制造商:NVIDIA 公司 |
GK110GL [Tesla K20m] | 具体显卡型号信息: - GK110GL :显卡核心架构(Kepler 架构的 GK110 核心,针对计算场景优化) - [Tesla K20m] :显卡产品型号(Tesla 系列是 NVIDIA 的专业计算卡,K20m 是面向高性能计算的型号) |
[10de:1028] | PCI 设备 ID(关键标识): - 10de :NVIDIA 的厂商 ID(所有 NVIDIA 设备通用) - 1028 :该显卡的产品 ID(用于系统识别具体型号,与驱动适配相关) |
(rev a1) | 硬件版本号:a1 表示该显卡的硬件修订版本,不同修订版可能在细节上有微小差异,但功能一致 |
/etc/modprobe.d/vfio.conf
:指定由 vfio-pci
管理的设备
vim /etc/modprobe.d/vfio.conf
options vfio-pci ids=10de:1028 #ids的值是PCI 设备 ID
完成后进行重启操作,然后来查看显卡的纳管情况
lspci -nn|grep NVIDIA
lspci -nnk -s 0b:00.0
这里的内核驱动使用显示为vfio-pci就表示已经配置成功了,接下来可以在KVM的虚机里把显卡配置进去。
3.ubuntu虚机识别GPU
可以通过改配置文件的方式,或者在创建虚机时直接加载即可,我这里选择的是后者。
virt-install --virt-type=kvm --name ubuntu20_04_gpu --vcpus=2 --memory=4086 --cdrom=/vmhost/ubuntu-22.04.5-live-server-amd64.iso --disk path=/vmhost/ubuntu20_04_gpu.qcow2,size=30,format=qcow2,bus=virtio --network network=default,model=virtio --graphics vnc,listen=0.0.0.0,port=5902 --noautoconsole --os-type=generic --host-device=0b:00.0 --console pty,target_type=serial
host-device=0b:00.0:这个参数表明在创建 / 配置虚拟机时,已明确将宿主机上 PCI 地址为 0b:00.0
的设备(即 Tesla K20m 显卡)直通给了虚拟机,是 GPU 直通的核心配置。
在步骤2显卡的 Kernel driver in use
显示为 vfio-pci
时,意味着该显卡已被 vfio-pci
驱动接管,此时查看该显卡所属的 IOMMU 组(即 “线组”),其关联的驱动也是 vfio-pci
。
所以直接挂载之后,安装完成就可以在ubuntu系统中找到对应的设备。
这里查看下虚拟机的配置文件cat /etc/libvirt/qemu/ubuntu20_04_gpu_2.xml ,列出显卡的主要配置项。
<hostdev mode='subsystem' type='pci' managed='yes'><source><address domain='0x0000' bus='0x0b' slot='0x00' function='0x0'/></source><address type='pci' domain='0x0000' bus='0x00' slot='0x06' function='0x0'/></hostdev>
对应关系:
lspci
输出中的显卡 PCI 地址:0b:00.0
这是宿主机上该 NVIDIA 显卡的物理 PCI 地址,格式为 bus:slot.function
(0b
是总线号,00
是槽位号,0
是功能号)。
XML 配置中<source>
的地址
<address domain='0x0000' bus='0x0b' slot='0x00' function='0x0'/>
这里的bus='0x0b'
、slot='0x00'
、function='0x0'
分别对应宿主机 PCI 地址的 0b
、00
、0
,与lspci
显示的0b:00.0
完全一致,表明该<hostdev>
配置的就是这张 NVIDIA Tesla K20m 显卡。
填下空就是这样
<address domain='0x0000' bus='0x[0b]' slot='0x[00]' function='0x[0]'/>
把列举刚才图文中列举的 <hostdev> </hostdev>
内容加上到虚机的xml配置文件中也可以实现GPU直通,不过因为xml的配置文件对于格式要求过于严格,写上比较耗时所以直接在创建时添加,实际情况如果已经有虚机的情况下可以采用这种方式添加。
4.在ubuntu虚机中验证查看
lspci | grep NVIDIA
到这里完成银河麒麟V10配置KVM的Ubuntu虚机GPU直通