0. 相關配置
首先說明一下目前設備中網卡透傳大概操作流程:
- 從主機中把網卡與驅動解綁定,比如:網卡使用的是igb驅動,首先解綁定
- 網卡綁定vfio-pci虛擬化驅動,通過綁定vfio驅動後,網卡才能給虛擬機使用
如果要實現以上方式,系統需要進行如下配置:
- BIOS中開啓VT-d直通模式,建議開啓SRIOV模式
- 內核模塊中增加vfio和IOMMU相關模塊
進行了如上設置以後,在設備啓動以後,可以看到加載的vfio相關模塊
1. 問題現象
產品中使用vfio進行設備直通,在設備直通後,虛擬機啓動時,啓動報錯:failed to set iommu for container,或者 Device initialization failed
2. 解決方案
造成以上問題的原因是因爲設備不支持IOMMU 中斷重映射,那怎麼判斷設備是否支持中斷重映射呢,如下所示:
當 ecap (0xf020fe → …1110) 的第 3 位是 1 時,意味着 IOMMU 支持中斷重映射。如上所示,應該支持中斷重映射。
如果由於硬件不支持中斷重新映射而導致傳遞失敗,則可以考慮allow_unsafe_interrupts在虛擬機受信任時啓用該選項。此選項默認是不啓動的。
[root@localhost cloud]# cat /sys/module/vfio_iommu_type1/parameters/allow_unsafe_interrupts
N
[root@localhost cloud]#
具體開啓方式如下:
在grub.cfg文件中增加 vfio_iommu_type1.allow_unsafe_interrupts = 1 的設置
3. vfio透傳
與Legacy KVM Device Assignment(使用pci-stub driver) 相比, VFIO(Virtual Function IO[1]) 最大的改進就是隔離了設備之間的DMA和中斷, 以及對IOMMU Group的支持, 從而有了更好的安全性。 IOMMU Group可以認爲是對PCI設備的分組, 每個group裏面的設備被視作IOMMU可以操作的最小整體; 換句話說, 同一個IOMMU Group裏的設備不可以分配給不同的客戶機。 在以前的Legacy KVM Device Assignment中, 並不會檢查這一點, 而後面的操作卻註定是失敗的。 新的VFIO會檢查並及時報錯。
另外, 新的VFIO架構也做到了平臺無關, 有更好的可移植性。
查看有哪些IOMMU Group以及所屬的設備:
[root@localhost cloud]# ls /sys/kernel/iommu_groups/
0 10 12 14 16 18 2 21 23 25 27 29 30 32 34 36 38 4 41 43 45 47 49 6 8
1 11 13 15 17 19 20 22 24 26 28 3 31 33 35 37 39 40 42 44 46 48 5 7 9
[root@localhost cloud]#