1. 检查宿主机配置
主流的CPU都是支持CPU虚拟化的
开启CPU虚拟化支持 VT-D 和IOMMU 在系统BIOS中查看虚拟化是否打开
dmesg | grep -e DMAR -e IOMMU
确认IOMMU已经开启
VFIO 虚拟化驱动
默认开机状态下 ,通过指令
lspci | grep VGA
查看当前安装NVIDIA 显卡
[root@compute ~]# lspci | grep NVIDIA
05:00.0 VGA compatible controller: NVIDIA Corporation GM204GL [Tesla M60] (rev a1)
06:00.0 VGA compatible controller: NVIDIA Corporation GM204GL [Tesla M60] (rev a1)
显示更详细的信息
[root@compute ~]# lspci -nn | grep NVIDIA
05:00.0 VGA compatible controller [0300]: NVIDIA Corporation GM204GL [Tesla M60] [10de:13f2] (rev a1)
06:00.0 VGA compatible controller [0300]: NVIDIA Corporation GM204GL [Tesla M60] [10de:13f2] (rev a1)
其中 05:00.0 表示显卡安装的物理位置, 以及设备相关配置放在linux 的文件目录 /sys/bus/pci/devices/
VGA compatible controller [0300] 表示 M60 工作在图形模式。
10de:13f2 为设备型号 10de vendor ID 为厂商ID 即NVIDIA 13f2 为 product ID 即M60显卡上 一个 GM204GL 核
要想让GPU可以在虚拟机上运行 ,实现虚拟机到物理机的中断映射,物理地址映射 bar空间映射 等
需要在物理机上 使GPU加载VFIO-PCI 驱动 在未安装NVIDIA的情况下,系统自带的驱动是nouveau,在安装了NVIDIA 驱动使用的 nvidia
[root@compute ~]# lspci -k -d 10de:13f2
05:00.0 VGA compatible controller: NVIDIA Corporation GM204GL [Tesla M60] (rev a1)
Subsystem: NVIDIA Corporation Device 115e
Kernel driver in use: vfio-pci
Kernel modules: nouveau, nvidia_drm, nvidia
06:00.0 VGA compatible controller: NVIDIA Corporation GM204GL [Tesla M60] (rev a1)
Subsystem: NVIDIA Corporation Device 115e
Kernel driver in use: vfio-pci
Kernel modules: nouveau, nvidia_drm, nvidia
注意项:
IOMMU 分组 需要虚拟化的GPU卡 应当单独放在一个分组里。
假如该分组里还有别的设备,那么这个虚拟机必须同时挂载该分组里别的设备。
比如:2080ti这样的GPU卡,除了GPU核心以外,还有 audio等。
2. 在openstack中添加GPU
配置 openstack nova服务
nova-cpu.conf,nova.conf
注意 :
配置文件目录 为 /etc/nova/
管理 节点 nova 服务 使用的 配置文件 为 nova.conf,计算节点 nova-compute 服务 使用 配置文件 为 nova-cpu.conf ,两个服务均为 systemd 服务 ,因此 可以在 /etc/system/systemd 文件夹找到对应的配置
在filter_scheduler 添加 PciPassthroughFilter
enabled_filters =PciPassthroughFilter
添加白名单
[pci]
alias = { "vendor_id":"10de", "product_id":"13f2", "device_type":"type-PCI", "name":"GPU-M60" }
passthrough_whitelist = { "vendor_id": "10de", "product_id": "13f2" }
相关联的服务有两个:
- nova-api服务
- nova-compute 服务
passthrough_whitelist 添加了以后,nova-compute 服务就会通过将对应设备放在白名单里,计算节点就可以调用使用该设备。
alias 修改后相当于给设备赋予了名字,这个设备添加到了nova-api中,在整个集群调度生成虚拟机时可以通过添加元数据,调度生成虚拟机。
添加完成后在计算节点查看查看实时日志:
#在devstack中:
journalctl -f --unit devstack@*
#在openstack中:
journalctl -f --unit nova-compute
Final resource view: name=compute phys_ram=32672MB used_ram=512MB phys_disk=149GB used_disk=0GB total_vcpus=24 used_vcpus=0 pci_stats=[PciDevicePool(count=2,numa_node=0,product_id=\'13f2\',tags={dev_type=\'type-PCI\'},vendor_id=\'10de\')]
在实例类型,元数据上应添加上要透传的pcie设备
pci_passthrough:alias =GPU-M60:1
其中:GPU-M60 为pci设备名 1 表示数量
生成实例后查看是否GPU成功加载
3. 在客户机上安装NVIDIA驱动
驱动安装可以通过.run文件静态安装,不过最方便的还是通过apt源直接安装,管理更加方便,可以使用国内的阿里源
通过阿里的 apt 源 直接下载
curl -fsSL https://mirrors.aliyun.com/nvidia-cuda/ubuntu1804/x86_64/7fa2af80.pub/
|sudo apt-key add -
echo "deb https://mirrors.aliyun.com/nvidia-cuda/ubuntu1804/x86_64/ ./" > /etc/apt/sources.list.d/cuda.list
sudo apt update
sudo apt install -y nvidia-driver-450-server
#nvswitch 机器 需要下载 fabricmanager 工具
sudo apt install -y nvidia-fabricmanager-450
sudo systemctl enable nvidia-fabricmanager
sudo systemctl start nvidia-fabricmanager
4. 安装CUDA
在 sample 文件夹下有 GPU 的性能 测试样例
deviceQuery 查询 GPU 状态
bandwidthTest pcie 通信测试
5. 后续
CUDA 带宽测试失败
在nova-compute nova.conf 文件中修改 cpu_mode 为 host-passthrough 或 host-model 具体含义可以在网上查查
调度生成虚拟机失败
需要注意的是调度生成虚拟机的过程为 调度 -》 生成块设备 -》孵化
在调度阶段失败说明 openstack 配置不正确 ,检查/etc/nova.conf 配置
生成块设备错误: 说明后端存储有问题,需要检查
孵化报错: 说明宿主机有问题