1. 程式人生 > >Centos 7 + Openstack + PCI passthrough(透傳)

Centos 7 + Openstack + PCI passthrough(透傳)

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”





參考文件: