01.GPU云服务器直通方式实现
1、 设备环境
1.1 硬件环境:
-
• NF5280M5 4路服务器
• NVIDIA Tesla V100
1.2软件环境:
-
• Ubuntu 16.04.5 LTS (GNU/Linux 4.15.0-36-generic x86_64)
• Openstack Queens版本
2、 配置操作系统
2.1 方法及步骤:
(1)BIOS中打开硬件辅助虚拟化功能
VT(VT-x)及VT-d支持,需要将相关支持设置为enable,默认开启
路径:Processor—IIO Configuration—Intel@ VT for Directed I/O(VT-d)
(2)配置intel_iommu=on
执行命令:sudo vi /etc/default/grub
在GRUB_CMDLINE_LINUX_DEFAULT字段添加 intel_iommu=on iommu=pt rd.driver.pre=vfio-pci
在GRUB_CMDLINE_LINUX字段添加 intel_iommu=on iommu=pt rd.driver.pre=vfio-pci
(3)修改内核模块文件/etc/modules
修改内核模块文件/etc/modules,里面列出的模块会在系统启动时自动加载。
执行命令:vi /etc/modules
添加以下内容:
pci_stub
vfio
vfio_iommu_type1
vfio_pci
kvm
kvm_intel
(4)更新grub.cfg文件
执行命令:sudo update-grub 或使用sudo grub-mkconfig -o /boot/grub/grub.cfg
(5)重启操作系统开启 Intel_iommu=on
(6)检查VT-d(AMD芯片时是 IOV)是否工作
执行命令:dmesg | grep IOMMU 或 dmesg | grep -e DMAR -e IOMMU 检查VT-d(AMD芯片时是 IOV)是否工作。若没有相应输出(IOMMU enabled 必须有),需要重新检查之前的步骤。
(7)添加黑名单
添加黑名单,使卡不被占用。
执行命令:sudo vim /etc/modprobe.d/blacklist.conf
最后添加内容:
#NVIDIA config
blacklist snd_hda_intel
blacklist amd76x_edac
blacklist vga16fb
blacklist nouveau
blacklist rivafb
blacklist nvidiafb
blacklist rivatv
(8)设置vfio并隔离用于直通的GPU
在/etc/modprobe.d下添加文件vfio.conf
执行命令:
cd /etc/modprobe.d
touch vfio.conf (创建文档)(如果出现touch: cannot touch 'vfio.conf': Permission denied 先执行sudo chmod -R 777 /etc/modprobe.d )
文档内写入内容:options vfio-pci ids=10de:1db6 (其中10de:1db6由9得来)
(9)查看pci设备信息
使用命令:lspci -nn | grep NVIDIA
如果不是NVIDIA的显卡,可以换自己显卡的关键字查询。重查询结果上注意查看自己独立显卡(也就是要直通的显卡)的设备ID和地址,形如: [10de 1b80] 和 [10de 10f0], 01.00.0和01.00.1。(Gefore显卡一般会集成一个声卡芯片)
其中GPU设备各值含义:
3b:00.0 和 86:00.0 以 ”bus:slot.func“ 格式来唯一标识一个 PCI 设备
0302 设备模式 0300: Graphics -- 代表为图形模式 0302:Compute -- 则表明为计算模式
10de 厂商识别字段(Vendor ID),10de代表此设备来自NVIDIA公司
1db6 标明特定的设备,由厂商来分配
a1 设备的版本识别代码,其值由厂商提供
(10)查看pci设备驱动
执行命令:lspci -vv -s 3b:00.0 | grep driver
没有输出说明没有驱动.
如果有输出信息如下:
lspci -vv -s 3b:00.0 | grep driver
>Kernel driver in use: nouveau (ubuntu系统为显卡绑定的默认驱动)
lspci -vv -s 01:00.1 | grep driver
>Kernel driver in user: snd_hda_intel (显卡上附带的集成声卡的默认驱动)
(11)将PCI设备相关驱动解绑
如果(10)中出现执行后有输出,需进行设备解绑
执行命令:(每个卡都要解绑)
echo 0000: 3b:00.0 > /sys/bus/pci/devices/0000\:3b\:00.0/driver/unbind
echo 0000:01:00.1 > /sys/bus/pci/devices/0000\:01\:00.1/driver/unbind
(12)将PCI设备绑定到VFIO
引入VFIO 用户态驱动框架,向用户提供配置IOMMU接口,实现PCI设备在虚拟化场景透传。
解绑设备 (命令执行上面11),并绑定到VFIO:
加载VFIO执行命令:
sudo modprobe vfio
sudo modprobe vfio-pci
执行完重启系统,重新启动主机并检查GPU是否在不同的IOMMU组中隔离,以及
正在使用vfio驱动程序.
执行命令检查GPU是否在不同的IOMMU组中隔离:
find /sys/kernel/iommu_groups/*/devices/*
执行命令进行绑定:
echo 10de 1db6 > /sys/bus/pci/drivers/vfio-pci/new_id
查看驱动是否绑定(每个卡都要看一下),执行命令:
lspci -vv -s 3b:00.0 | grep driver
如果出现 Kernel driver in use : vfio-pci 说明绑定成功。
3、 配置openstack
3.1 方法及步骤:
(1)配置nova-scheduler (controller节点),编辑文件 /etc/nova/nova.conf
[scheduler] 没有修改,用的默认
scheduler_driver=nova.scheduler.filter_scheduler.FilterScheduler
[filter_scheduler] 默认有,此处没有修改
available_filters=nova.scheduler.filters.all_filters
available_filters=nova.scheduler.filters.pci_passthrough_filter.PciPassthroughFilter
[DEFAULT]修改此处
scheduler_default_filters=RamFilter,ComputeFilter,AvailabilityZoneFilter,ComputeCapabilitiesFilter,ImagePropertiesFilter,PciPassthroughFilter
(2)重启nova-scheduler 服务
执行命令:sudo service nova-scheduler restart
(3)配置nova-api (controller节点),编辑文件 /etc/nova/nova.conf:
[PCI] 添加内容
alias = {"name":"nvidia_v100","product_id":"1db6","vendor_id":"10de","device_type":"type-PCI"}
(4)重启nova-api服务
执行命令:sudo service nova-api restart
(5)配置nova-compute(compute 节点),编辑文件/etc/nova/nova.conf:
[PCI] 添加内容
passthrough_whitelist = { "vendor_id":"10de","product_id":"1db6" }
alias = {"name":"nvidia_v100","product_id":"1db6","vendor_id":"10de","device_type":"type-PCI"}
(6)重启nova-compute服务
执行命令:sudo service nova-compute restart
4、 创建GPU服务器验证绑定
4.1 方法及步骤:
(1)创建主机聚合
(2) 创建Flavor 添加属性
(3) 创建云服务器
执行命令: openstack server create --network vlan-161 --image ecs-ubuntu1604-x64-20181220 --flavor 513dfb0c-132b-4fb9-903a-ffd131cce6d7 test-gpu-1
(4)进入创建的GPU服务器验证挂载
执行命令:lspci -nn | grep NVIDIA
推荐阅读