解決VFIO透傳問題

0. 相關配置

首先說明一下目前設備中網卡透傳大概操作流程:

  1. 從主機中把網卡與驅動解綁定,比如:網卡使用的是igb驅動,首先解綁定
  2. 網卡綁定vfio-pci虛擬化驅動,通過綁定vfio驅動後,網卡才能給虛擬機使用

如果要實現以上方式,系統需要進行如下配置:

  1. BIOS中開啓VT-d直通模式,建議開啓SRIOV模式
  2. 內核模塊中增加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]# 

4. 參考資料

虛擬機直接IO原理與架構

配置 SR-IOV 網絡

Intel VT-d(3)- 中斷重映射

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章