Centos 7 + Openstack + PCI passthrough(透传)

原创 2016年08月29日 09:47:38

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


版权声明:本文为博主原创文章,未经博主允许不得转载。

OpenStack 支持的虚拟化技术种类

OpenStack到底支持怎样的云

深度学习GPU卡的理解(五)

最后这一篇是对于计算卡的理解指导《 A Full Hardware Guide to Deep Learning》 Deep Learning is very computationally...

基于kvm的显卡透传

基于kvm的显卡透传 ,坑很多 ,下面是我的硬件环境: GPU : NVIDIA Quadro M4000 CPU : Intel(R) Xeon(R) CPU E5-2683 v3 @ ...

关于使用kvm-pci-assign IOMMU遇到的问题

按照书上写的配置了内核,BIOS里也启动了IOMMU,但是无论怎么弄都出现 ”qemu-system-x86_64 No IOMMU found.  Unable to assign device ”...

KVM嵌套虚拟化nested之CPU透传

作者:【吴业亮】云计算开发工程师 博客:http://blog.csdn.net/wylfengyujiancheng嵌套式虚拟nested是一个可通过内核参数来启用的功能。它能够使一台虚拟机具有...

Linux 虚拟化和 PCI 透传技术

  级别: 中级M. Tim Jones, 自由作家2009 年 11 月 19 日处理器已经演变为针对虚拟环境提高性能,但 I/O 方面发生了什么变化呢?了解一种名为设备(或 PCI)透传(pa...

GPU 虚拟化

OpenStack 企业私有云的若干需求(1):Nova 虚机支持 GPU 本系列会介绍OpenStack 企业私有云的几个需求: 自动扩展(Auto-scaling)支持多租户和租户隔离...

Libvirt之vfio pci的passthrough

libvirt之vfio pci的passthrough 2015-08-18 一、准备 1.开机启动项  /etc/default/grub文件 在GRUB_CMDLINE_LINUX参数加入in...

虚拟机设备直通的两种方式(Working in Progress)

pci passthrough 概念 允许guest排他使用host上的某个PCI设备,就像将该设备物理连接到guest上一样。 使用场景 提升性能(如直通网卡和显卡) 降低延迟(避免数据丢失...

dev/iommu_group/iommu_domain 三者关系的简单理解

从device这个结构体中可以得到struct iommu_group *group; 例如: struct iommu_group *iommu_group_get(struct device ...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:Centos 7 + Openstack + PCI passthrough(透传)
举报原因:
原因补充:

(最多只允许输入30个字)