背景阐述:

                      将物理设备直接从宿主机上解绑,然后绑定到虚拟机中

涉及环境:

                      系统:redhat或者centos

                      相关模块:vfio    vfio-pci

概念简述 :

                      PCI-through会用到一个框架,叫vfio;

                      vfio是一个框架,用来实现用户态设备驱动;

                      进一步理解就是,将宿主机上面的设备和宿主机的驱动做一次解绑,然后在绑定到vfio-pci这上面,然后启动虚拟机的时候,将解绑后的设备顺带加入虚拟机的启动中,从而让虚拟机能够直接使用这个设备;

PCI-through出现的理由:

                      某些行业对虚拟机的性能以及高效的追求,等等;

可能实现的前提条件:

                       1、CPU支持并且开启VT-d/AMD-V虚拟化支持。
                       2、CPU支持,并且内核开启了相应的IOMMU支持和模块。
                       3、内核开启VFIO支持和模块。     

           注:以上三个中,一条不满足就不能做穿透,切记!!!!

           注:以下链接中会有前提条件描述以及实现方案阐述     https://wiki.archlinux.org/index.php/PCI_passthrough_via_OVMF_(%E7%AE%80%E4%BD%93%E4%B8%AD%E6%96%87)

当你死活都无法实现PCI穿透,但是iommu处于enable状态的时候或许以下信息会帮助你:         

  • VT-d 指的是直接输入/输出虚拟化(Intel Virtualization Technology for Directed I/O),不应与VT-x(x86平台下的Intel虚拟化技术,Intel Virtualization Technology)混淆。VT-x 可以让一个硬件平台作为多个“虚拟”平台,而 VT-d 提高了虚拟化的安全性、可靠性和 I/O 性能。

即:只有VT-x的话,那就是说硬件不支持穿透!

 

实现步骤理论阐述:(因为目前没有相关资源提供实验环境,仅做阐述)

1,查阅pci信息

     lspci  [-nnk | -vvk]  |  more

注:加参数能看到每个pci的使用者信息,解绑一个使用者信息会消失,绑定后就会出现!

注:这个命令若没有,自己yum或者apt-install;看的就是最前面的 xx:xx.x  ;

2,指定pci解绑

相关设备路径:  /sys/bus/pci/devices/...

echo  ‘0000:xx:xx.x’  > /sys/bus/pci/devices/'pci的地址'/driver/unbind

注:解绑的时候注意iommu_group组的存在,想要实现某个设备穿透,这个设备在这个组里时,该组的其他设备也要解绑,不解绑好像也行,不过具体操作自己百度

3,将pci绑定(唯一标识符我忘了叫什么,可以自己看我上面提供的链接)

echo  ‘唯一标识符’ > /sys/bus/pci/drivers/vfio/pci

4,使用命令查看是否完成驱动的改变

lspci  [-nnk | -vvk ] | more

注:若没完成驱动绑定的改变,则需要自己重新看看,哪里出了问题;没解决,就别想操作第五步了

5,使用命令

这步操作方案很多,其实前面几步的方案也是有很多的,不过大同小类

关于kvm的,有

virsh  --nodedev-detach

quem-system-*(注:该命令,在unbutu或者debian中存在)

/usr/libexec/quem-kvm

.....

 

6,总结

以上就是我对pci穿透的实际操作的概述,最坑的是VT-d和VT-x全称的差别,需要自己在bios中确认是否存在VT-d!

还要虚拟机的启动方式也是很令人头疼的,反正第五步才是重点,前提条件必须仔细确认,其他的都ok了,到此结束!