Proxmox(pve)内核添加VFIO模块

VFIO 就是内核针对 IOMMU 提供的软件框架,支持 DMA Remapping 和 Interrupt Remapping,这里只讲DMA Remapping。VFIO 利用 IOMMU这个特性,可以屏蔽物理地址对上层的可见性,可以用来开发用户态驱动,也可以实现设备透传。


概念介绍

先介绍 VFIO 中的几个重要概念,主要包括 Group 和 Container。

  • Group:group 是 IOMMU 能够进行 DMA 隔离的最小硬件单元,一个 group 内可能只有一个 device,也可能有多个 device,这取决于物理平台上硬件的 IOMMU 拓扑结构。 设备直通的时候一个 group 里面的设备必须都直通给一个虚拟机。不能够让一个 group 里的多个 device 分别从属于2个不同的 VM,也不允许部分 device 在host上而另一部分被分配到 guest 里, 因为就这样一个 guest 中的 device 可以利用DMA攻击获取另外一个 guest 里的数据,就无法做到物理上的 DMA 隔离。

  • Container:对于虚机,Container 这里可以简单理解为一个 VM Domain 的物理内存空间。对于用户态驱动,Container 可以是多个 Group 的集合。


Proxmox(pve)内核添加VFIO模块


echo -e "vfio\nvfio_iommu_type1\nvfio_pci\nvfio_virqfd" >> /etc/modules
echo "options kvm ignore_msrs=1 report_ignored_msrs=0" > /etc/modprobe.d/kvm.conf

 

# 忽略异常,防止虚拟机异常导致宿主机崩溃

#   ignore_msrs             :   忽略异常

#   report_ignored_msrs     :   是否报告异常

kvm.ignore_msrs={0|1} 是否忽略客户机对未经处理的MSR(unhandled MSR)的访问。"0"(默认值)表示不忽略但是会注入#GP;"1"表示忽略。


# 允许不安全的中断

echo "options vfio_iommu_type1 allow_unsafe_interrupts=1" > /etc/modprobe.d/iommu_unsafe_interrupts.conf

(未实验此参数)












update-initramfs -k all -u