银河麒麟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直通

<think>我们有一个已经配置GPU大模型的Ubuntu(在KVM中运行),现在需要将其制作为KVM可用的镜像。这样我们可以快速部署多个相同的实例。 参考之前的引用,我们注意到: 1. 引用[1]和[2]中提到了GPU直通(Passthrough)的配置,但制作镜像时,我们不需要在镜像中包含宿主特定的直通设置(因为直通是在启动时由宿主配置的)。 2. 镜像中需要包含必要的驱动和配置,以便在新的启动时能够识别直通GPU设备。 步骤概述: 1. 清理:移除临时文件、缓存以及不必要的配置,以减少镜像大小并避免启动问题。 2. 卸载特定的硬件相关配置(如GPU驱动通常不需要卸载,因为新的可能使用相同的GPU型号,但需要注意驱动是否兼容不同的宿主环境)。 3. 安装和配置cloud-init(可选,但推荐),以便新启动的能够根据注入的配置进行初始化(如设置主名、网络、SSH密钥等)。 4. 将的磁盘转换为合适的镜像格式(如qcow2),并确保其可以被KVM使用。 5. 测试镜像。 详细步骤: 步骤1:在内部进行清理和准备 - 清理软件包缓存: sudo apt clean - 清理临时文件: sudo rm -rf /tmp/* sudo rm -rf /var/tmp/* - 清理日志文件: sudo find /var/log -type f -exec truncate --size=0 {} \; - 移除SSH主密钥(这样新启动时会生成新的密钥): sudo rm /etc/ssh/ssh_host_* - 移除网络接口的持久化规则(避免新使用相同的MAC地址导致冲突): sudo rm /etc/netplan/*.yaml # 注意:如果你有自定义的netplan配置,先备份,然后移除,这样新启动时会重新生成默认配置 - 可选:重置cloud-init(如果之前使用过): sudo cloud-init clean --logs --reboot - 注意:GPU驱动和CUDA等大模型依赖的软件不要卸载,因为我们需要这些环境。 步骤2:安装cloud-init(如果尚未安装) 为了让新启动的能够自动配置网络、主名、用户等,建议安装cloud-init: sudo apt update sudo apt install cloud-init -y 安装完成后,可以配置cloud-init的默认行为(通常不需要修改,因为启动时通过元数据服务注入配置)。 步骤3:关闭 sudo shutdown now 步骤4:在宿主上操作,将的磁盘转换为镜像 假设磁盘文件为`/data/ubuntu.img`(如引用[1]中创建时使用的磁盘路径),我们可以将其转换为qcow2格式(压缩和节省空间)。 - 转换磁盘格式(如果原始格式是raw,转换为qcow2): qemu-img convert -O qcow2 /data/ubuntu.img /data/ubuntu-cloud.qcow2 注意:如果原始磁盘已经是qcow2格式,可以直接复制,但为了减小大小,可以重新转换(带压缩): qemu-img convert -O qcow2 -c /data/ubuntu.img /data/ubuntu-cloud.qcow2 其中`-c`参数表示压缩。 步骤5:测试镜像 使用这个镜像创建一个新的,注意: - 启动时,需要配置GPU直通(如引用[1]中的`--host-device`参数),但镜像本身不包含直通设置,直通是启动时由宿主分配给的。 - 确保新的能够正常启动,并且GPU驱动正常工作。 示例创建新的命令(参考引用[1]): sudo virt-install \ --name=ubuntu-from-image \ --memory=380000 \ --vcpus=46 \ --os-type=linux \ --os-variant=ubuntu18.04 \ --disk path=/data/ubuntu-cloud.qcow2 \ --bridge=br0 \ --graphics vnc,listen=0.0.0.0,keymap=en_us \ --host-device 04:00.0 \ --host-device 83:00.0 \ --features kvm_hidden=on \ --machine q35 \ --import # 注意:这里使用--import表示使用已有的磁盘镜像,而不是重新安装 步骤6:验证 进入新,检查: - nvidia-smi 是否正常显示GPU信息 - 大模型环境是否正常 注意事项: - 镜像中的GPU驱动是针对特定型号的,如果新的宿主上的GPU型号不同,可能需要重新安装驱动。因此,建议在相同GPU型号的宿主上使用此镜像。 - 如果需要在不同型号的GPU上使用,可以考虑在镜像中安装多版本驱动,或者使用兼容性更好的驱动版本。 引用说明: - 清理和转换镜像的步骤参考了云镜像制作的最佳实践[^1][^2]。 - 创建新时使用直通设备的方法参考了引用[1]和[^2]。 相关问题: 1. 如何优化镜像大小? 2. 如何将镜像上传到OpenStack Glance服务? 3. 如何为不同GPU型号的宿主准备镜像? 4. cloud-init 的配置如何自定义? 5. 如何验证镜像中的GPU驱动兼容性? 完成以上步骤后,你就有了一个包含GPU大模型环境的KVM可用镜像。</think>### 将已配置GPU大模型的Ubuntu制作为KVM镜像的完整指南 #### 一、核心制作流程 1. **准备** ```bash # 清理临时文件和缓存(引用[1]) sudo apt clean sudo rm -rf /tmp/* sudo journalctl --vacuum-time=1d # 卸载GPU驱动(避免宿主冲突) sudo nvidia-uninstall # 或使用 apt purge nvidia-* ``` 2. **安装云初始化工具** ```bash # 安装cloud-init(关键步骤) sudo apt update sudo apt install cloud-init cloud-utils-growpart -y sudo systemctl enable cloud-init ``` 3. **重置器ID(重要!)** ```bash # 避免克隆后ID冲突 sudo rm /etc/machine-id sudo systemd-machine-id-setup ``` 4. **关闭** ```bash sudo shutdown now ``` #### 二、宿主操作(转换镜像) 1. **定位磁盘** ```bash virsh dumpxml ubuntu | grep 'source file' # 获取磁盘路径(如/data/ubuntu.img) ``` 2. **转换为QCOW2格式** ```bash # 转换并压缩镜像(引用[1]) qemu-img convert -O qcow2 -c /data/ubuntu.img /data/gpu-model-base.qcow2 ``` 3. **验证镜像完整性** ```bash qemu-img check /data/gpu-model-base.qcow2 virt-filesystems -a /data/gpu-model-base.qcow2 # 检查文件系统 ``` #### 三、GPU特殊处理 1. **驱动兼容性配置** ```bash # 添加通用GPU支持(引用[1][2]) virt-customize -a /data/gpu-model-base.qcow2 \ --install nvidia-driver-535-server \ --run-command 'echo "options nvidia NVreg_EnablePCIeGen3=1" > /etc/modprobe.d/nvidia.conf' ``` 2. **禁用KVM隐藏特性** ```bash # 移除特征标记(引用[1]) virt-customize -a /data/gpu-model-base.qcow2 \ --delete '/etc/modprobe.d/kvm.conf' ``` #### 四、创建新测试 ```bash sudo virt-install \ --name=gpu-clone \ --memory=380000 \ --vcpus=46 \ --disk path=/data/gpu-model-base.qcow2 \ --graphics none \ --host-device 04:00.0 \ --host-device 83:00.0 \ --import # 关键参数:使用现有镜像 ``` > 验证命令: > `nvidia-smi` 应显示GPU状态 > `lspci | grep -i nvidia` 确认设备直通[^1] #### 五、镜像优化技巧 1. **空间压缩** $$ \Delta S = S_{raw} - S_{qcow2} \approx 0.6 \times S_{raw} $$ ```bash virt-sparsify --compress /data/gpu-model-base.qcow2 gpu-model-compressed.qcow2 ``` 2. **安全加固** ```bash virt-customize -a gpu-model-compressed.qcow2 \ --run-command 'passwd -d root' \ --ssh-inject root:file:/home/user/.ssh/id_rsa.pub ``` #### 六、技术原理 1. **镜像与直通解耦** $$ I_{final} = f(I_{base}, P_{host-device}) $$ - 基础镜像 $I_{base}$ 包含预装环境 - 设备直通 $P_{host-device}$ 由启动时动态绑定[^2] 2. **cloud-init作用** ```mermaid graph LR A[启动实例] --> B[获取元数据] B --> C[配置网络] B --> D[注入SSH密钥] B --> E[执行用户脚本] ``` 首次启动自动完成个性化配置[^1] --- ### 相关问题 1. 如何验证镜像中的NVIDIA驱动兼容不同型号GPU? 2. 使用`virt-sparsify`压缩镜像时如何避免数据损坏? 3. 如何为镜像添加自动扩展根分区的能力? 4. 在多GPU宿主环境下如何指定直通设备?[^2] 5. 如何将KVM镜像转换为OpenStack支持的格式?
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

虚伪的空想家

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值