背景阐述:
将物理设备直接从宿主机上解绑,然后绑定到虚拟机中
涉及环境:
系统: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了,到此结束!