Centos 7 + Openstack + PCI passthrough(透传)
来源:互联网 发布:巨人网络纪学锋离职 编辑:程序博客网 时间:2024/05/17 01:26
0.遇到的问题
a.多个设备在同一个iommu_group的问题,多见于显卡
error:please ensure all devices within the iommu_group are bound to their vfio bus driver
需要将多个设备全部解绑定,解决方案见参考文档7,8
b.当控制节点同时作为计算节点使用
不可将控制节点显卡(GPU)透传到VM,否则在dashboard-console中VNC服务将不可用
1.确认硬件支持虚拟化技术及PCI passthrough
由于需要硬件支持,先要确认CPU及主板(motherboard)是否支持Intel或AMD的硬件辅助虚拟化功能,可以查看官方的硬件支持列表,或者在BIOS中查看相关选项。也可在参考文档3中进行查询(文档所列并不完整,找不的可以到官方支持列表查询),Intel CPU可以在参考文档5链接中查询。
还需要支持PCI passthrough的硬件设备。
2.在BIOS中打开硬件辅助虚拟化功能支持
主要是VT(VT-x)及VT-d支持,需要将相关支持设置为enable
这两个选项一般在BIOS中Advance下CPU和System或相关条目中设置。
以Intel为例:
VT: Intel Virtualization Technology
VT-d: Intel VT for Directed I/O
3.确认内核集成 pci-stub/vfio,DMAR,IOMMO这几个模块
a. 确认内核支持iommu
$ cat /proc/cmdline | grep iommu
如果没有输出结果,添加intel_iommu=on到grub的启动参数
如果你想在系统启动时加载一个内核参数,需修改GRUB的配置模板(/etc/default /grub),添加"名称=值”的键值对到GRUB_CMDLINE_LINUX变量,添加多个时用空格隔开,例如GRUB_CMDLINE_LINUX="...... name=value"(如果没有GRUB_CMDLINE_LINUX变量时,用GRUB_CMDLINE_LINUX_DEFAULT替代即可),然后使用grub2-mkconfig -o /boot/grub2/grub.cfg更新grub.cfg文件
b. 使用dmesg | grep -i DMAR -i IOMMO来判断 (DMAR与IOMMO都必须有)。
$ dmesg | grep -e DMAR -e IOMMU
...
DMAR:DRHD base: 0x000000feb03000 flags: 0x0
IOMMU feb03000: ver 1:0 cap c9008020e30260 ecap 1000
...
也可以使用命令 find /sys/kernel/iommu_groups/ -type l 来确认
4.确认pci设备驱动信息并从host默认驱动程序中解绑,以备虚拟机透传使用
a. 查看pci设备信息
$ lspci -nn
01:00.0 VGA compatible controller [0300]: NVIDIA Corporation GT218 [GeForce 210] [10de:0a65] (rev a2)
b. 查看设备由什么驱动管理使用
$ lspci -vv -s 01:00.0 | grep driver
Kernel driver in use: nouveau
c. 从默认驱动程序解绑设备
有两种方式,一是通过fio-pci在用户态直通使用PCI设备,二是使用pci-stub使用设备
PCI-STUB:
解绑方法一:使用libvirt的命令
$ virsh nodedev-list | grep pci #查询设备ID
$ virsh nodedev-dumpxml pci_0000_01_00_0 #查询当前使用的驱动程序
$ virsh nodedev-detach pci_0000_01_00_0 #解绑当前设备
$ virsh nodedev-detach pci_0000_01_00_1 #解绑audio
解绑方法二:配置GRUB_CMDLINE_LINUX
$ lspci -n -s 01:00.0
01:00.0 0300: 10de:0a65 (rev a2)
$ lspci -n -s 01:00.1
01:00.1 0403: 10de:0be3 (rev a1)
$ vim /etc/default/grub
GRUB_CMDLINE_LINUX="rd.lvm.lv=fedora-server/root rd.lvm.lv=fedora-server/swap rhgb quiet intel_iommu=on pci-stub.ids=8086:0152,10de:1401,10de:0a65,10de:0be3”
$ grub2-mkconfig -o /boot/grub2/grub.cfg
$ reboot
解绑方法三:
$ modprobe pci_stub
$ echo “10de 0a65” > /sys/bus/pci/drivers/pci-stub/new_id
$ echo “10de 0be3” > /sys/bus/pci/drivers/pci-stub/new_id
$echo 0000:01:00.0 > /sys/bus/pci/devices/0000\:01\:00.0/driver/unbind
$ echo 0000:01:00.1 > /sys/bus/pci/devices/0000\:01\:00.1/driver/unbind
$ echo 0000:01:00.0 > /sys/bus/pci/drivers/pci-stub/bind
$ echo 0000:01:00.1 > /sys/bus/pci/drivers/pci-stub/bind
FIO-PCI:
VFIO可以用于实现高效的用户态驱动。在虚拟化场景可以用于device passthrough。通过用户态配置IOMMU接口,可以将DMA地址空间映射限制在进程虚拟空间中。这对高性能驱动和虚拟化场景device passthrough尤其重要。相对于传统方式,VFIO对UEFI支持更好。VFIO技术实现了用户空间直接访问设备。无须root特权,更安全,功能更多。
解绑方法一:
同PCI-STUB
解绑方法二:
挂载VFIO驱动
$ modprobe vfio
$ modprobe vfio-pci
设备unbind
查看iommu_group及其下所有设备,或者: find /sys/kernel/iommu_groups/ -type l
$ cd /sys/bus/pci/devices/0000\:01\:00.0/
$ readlink iommu_group#查看iommu_group名字
../../../../kernel/iommu_groups/28
$ ll iommu_group/devices#查看iommu_group下设备
将iommu_group下所有设备unbind并添加到iommu_group中
$ echo 0000:01:00.0 > /sys/bus/pci/devices/0000\:01\:00.0/driver/unbind
$ echo 0000:01:00.1 > /sys/bus/pci/devices/0000\:01\:00.1/driver/unbind
$ echo 10de 0a65 > /sys/bus/pci/drivers/vfio-pci/new_id
$ echo 10de 0be3 > /sys/bus/pci/drivers/vfio-pci/new_id
5.配置Openstack,启用pci passthrough
a. 计算节点:
pci_passthrough_whitelist: White list of PCI devices available to VMs.
$ vim /etc/nova/nova.conf
添加 pci_passthrough_whitelist = {"vendor_id": "10de”,”product_id": "0a65"}
b.控制节点:
pci_alias: An alias for a PCI passthrough device requirement.
$ vim /etc/nova/nova.conf
添加 pci_alias = {"name": "NVIDIA-Corporation-GT218",
"product_id": "0a65",
"vendor_id": "10de",
"device_type": "type-PCI"}
c.Nova scheduler 节点
enable pci devices filter.
$ vim /etc/nova/nova.conf
修改如下
scheduler_driver=nova.scheduler.filter_scheduler.FilterScheduler
scheduler_available_filters=nova.scheduler.filters.all_filters
scheduler_available_filters=nova.scheduler.filters.pci_passthrough_filter.PciPassthroughFilter
scheduler_default_filters=RamFilter,ComputeFilter,AvailabilityZoneFilter,ComputeCapabilitiesFilter,ImagePropertiesFilter,PciPassthroughFilter
d.改完重启OpenStack controller和compute服务
e.创建带有pci-passthrough的flavor
$ nova flavor-key m1.large set "pci_passthrough:alias”=“NVIDIA-Corporation-GT218:1”
参考文档:
1.https://wiki.openstack.org/wiki/Pci_passthrough
2.http://www.linux-kvm.org/page/How_to_assign_devices_with_VT-d_in_KVM
3.https://wiki.xenproject.org/wiki/VTd_HowTo
4.http://blog.csdn.net/quqi99/article/details/22853403
5.http://ark.intel.com/
6.http://www.openstack.cn/?p=4657
7.http://vfio.blogspot.hk/2015/05/vfio-gpu-how-to-series-part-3-host.html
8.http://vfio.blogspot.hk/2014/08/iommu-groups-inside-and-out.html
- Centos 7 + Openstack + PCI passthrough(透传)
- pci-passthrough of openstack havana
- OpenStack PCI passthrough(PIC直通)环境配置
- PCI passthrough
- xen pci-passthrough 2
- pci passthrough with qemu
- xen pci-passthrough 2
- fedora 18 kvm pci passthrough
- CentOS7 中Xen PCI passthrough
- qemu使用PCI passthrough设备
- VGA GPU passthrough 虚拟桌面pci穿透--Ubuntu与centos的内核升级步骤
- Libvirt之vfio pci的passthrough
- Ubuntu 16.04 KVM中实现PCI Passthrough
- Libvirt之vfio pci的passthrough
- 使用passthrough模式,只通过PCI任意设备(该过程是在RHEL7系统进行,其他系统原理一样)
- VirtualBox 学习 - 高级课题3 - CPU热插拔,PCI passthrough
- VGA GPU passthrough qemu虚拟桌面pci穿透
- Centos 7 单机安装 Openstack(PackStack)
- JAVA文件过滤器
- 机器学习&深度学习资料
- [leetcode]129. Sum Root to Leaf Numbers -- JavaScript 代码
- linux双网关设置-原进原出
- Eidt Value setting
- Centos 7 + Openstack + PCI passthrough(透传)
- Idea实现WebService实例
- 在linux下启动tomcat命令
- 微服务实战(一):微服务架构的优势与不足
- 提交一个本地项目到git
- HashMap的工作原理
- BZOJ4691 Let There Be Light
- Hexo在Github中搭建博客系统(1)Hexo安装
- spinbox 初始化的时候显示不正常