当前位置: 首页 > 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.lryc.cn/news/617706.html

相关文章:

  • 梯度裁剪总结
  • 做调度作业提交过程简单介绍一下
  • Spring Cloud Gateway 路由与过滤器实战:转发请求并添加自定义请求头(最新版本)
  • 如何安装 Git (windows/mac/linux)
  • 【数据可视化-85】海底捞门店数据分析与可视化:Python + pyecharts打造炫酷暗黑主题大屏
  • Java数据库编程之【JDBC数据库例程】【ResultSet作为表格的数据源】【七】
  • NY185NY190美光固态闪存NY193NY195
  • cf--思维训练
  • 【C++语法】输出的设置 iomanip 与 std::ios 中的流操纵符
  • Dashboard.vue 组件分析
  • 基于 Axios 的 HTTP 请求封装文件解析
  • 【Redis的安装与配置】
  • ESP32将DHT11温湿度传感器采集的数据上传到XAMPP的MySQL数据库
  • loading效果实现原理
  • 【JAVA】使用系统音频设置播放音频
  • 在线代码比对工具
  • Selenium元素定位不到原因以及怎么办?
  • 机器学习 TF-IDF提取关键词,从原理到实践的文本特征提取利器​
  • Effective C++ 条款36: 绝不重新定义继承而来的非虚函数
  • Excel 连接阿里云 RDS MySQL
  • 开闭原则代码示例
  • Pytest项目_day11(fixture、conftest)
  • js数组reduce高阶应用
  • B 树与 B + 树解析与实现
  • 可商用的 AI 图片生成工具推荐(2025 最新整理)
  • Kubernetes部署apisix的理论与最佳实践(一)
  • 专题:2025人形机器人与服务机器人技术及市场报告|附130+份报告PDF汇总下载
  • docker安装Engine stopped
  • 内置redis使用方法
  • Python 高阶函数:filter、map、reduce 详解