当前位置: 首页 > news >正文

银河麒麟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.function0b是总线号,00是槽位号,0是功能号)。

XML 配置中<source>的地址

<address domain='0x0000' bus='0x0b' slot='0x00' function='0x0'/>

这里的bus='0x0b'slot='0x00'function='0x0' 分别对应宿主机 PCI 地址的 0b000,与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直通

http://www.dtcms.com/a/326211.html

相关文章:

  • AI测试平台实战:深入解析自动化评分和多模型对比评测
  • 人工智能-python-机器学习-逻辑回归与K-Means算法:理论与应用
  • 机器学习之DBSCAN
  • Redis中的AOF原理详解
  • 【unity实战】在Unity中实现不规则模型的网格建造系统(附项目源码)
  • CI/CD的持续集成和持续交付
  • 变频器实习DAY26 CDN 测试中心使用方法
  • 标准IO详解(fgets、gets、fread、fwrite、fseek 等应用)
  • ubuntu24.04设置登陆背景图片
  • 【openEuler构建测试环境或部署嵌入式系统】openEuler生态扩容新路径:内网穿透工具cpolar助力多场景落地
  • 服务器使用ADB调试手机
  • Redis 数据结构及特点
  • 计算机网络(一)——TCP
  • JavaScript Const的基础使用
  • QML的中英文翻译
  • 快速搭建前端playwright工程
  • SpringAI实现Reread(Advisor)
  • DNS核心概念与BIND配置详解
  • C++11的历史和统一的初始化列表
  • Qt串口通信设计指南:通信层架构与实践
  • K8S学习----应用部署架构:传统、虚拟化与容器的演进与对比
  • 虚拟财产刑事辩护:跨地域性与匿名性带来的挑战
  • 记录一些sonic自动化运行中的问题
  • 常见通信协议详解:TCP、UDP、HTTP/HTTPS、WebSocket 与 GRPC
  • 基于 Axios 的 HTTP 请求封装文件解析
  • Rust:专业级错误处理工具 thiserror 详解
  • Nginx 从入门到实战:安装、配置、升级与高级应用全解析
  • Web 开发前端与后端 API 的交互
  • golang 基础案例_01
  • 【MYSQL】MySQL中On duplicate key update