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”
參考文件: