vfio设备透传主要用于将设备直通给虚拟机以提高性能,本篇以一张网卡为例讲述VFIO设备的配置使用及底层原理。其中涉及的技术背景主要有linux+qemu+kvm+vfio。
一、VFIO网卡的配置使用
1.host配置iommu
首先是宿主机host必须支持硬件虚拟化技术,如x86架构的VT-d,其中有关IO的有iommu的支持,x86默认是不开启的,可以通过追加内核参数“intel_iommu=on”来打开。
vim /etc/default/grub
添加完后重启宿主机,并dmesg | grep -i iommu查看是否开启成功
powerpc架构下的iommu是默认开启的,所以可以直接跳过此步。
2.选择设备
本次以一张网卡为例,常见的intel网卡如I350等都是支持VFIO透传的,可以在dmesg看到网卡的iommu支持。
记住一定要选择一个宿主机不用的网卡,如state=DOWN的或ifconfig查看 rx和tx=0 bytes的网卡来配置透传,毕竟vfio属于二选一,透传给VM则host不能再用了。
本次选择enP1p27s0fx这张网卡;
3.设备解绑与重新绑定vfio-pci驱动
#查看group里面的设备,可以发现这个group中共有4个设备
[root@localhost jcf]# ls /sys/bus/pci/devices/0001\:1b\:00.0/iommu_group/devices/
0001:1b:00.0 0001:1b:00.1 0001:1b:00.2 0001:1b:00.3
#将设备与驱动程序解绑,注意这里要把同一group下的4张网卡全部解绑
[root@localhost jcf]# echo 0001:1b:00.0 > /sys/bus/pci/devices/0001\:1b\:00.0/driver/unbind
[root@localhost jcf]# echo 0001:1b:00.1 > /sys/bus/pci/devices/0001\:1b\:00.1/driver/unbind
[root@localhost jcf]# echo 0001:1b:00.2 > /sys/bus/pci/devices/0001\:1b\:00.2/driver/unbind
[root@localhost jcf]# echo 0001:1b:00.3 > /sys/bus/pci/devices/0001\:1b\:00.3/driver/unbind
#找到设备的生产商&设备ID
[root@localhost jcf]# lspci -n -s 0001:1b:00.0
0001:1b:00.0 0200: 8086:1521 (rev 01)
#将设备绑定到vfio-pci驱动,这会导致一个新的设备节点“/dev/vfio/5”被创建
[root@localhost jcf]# echo 8086 1521 > /sys/bus/pci/drivers/vfio-pci/new_id
#查看刚生成的设备节点
[root@localhost jcf]# ls /dev/vfio/
此时host中已看不到之前的enP1p27s0fx网卡
4.创建虚机,添加参数 -device vfio-pci,host=xxxx,id=net0
/home/jcf/qemu-6.2.0/build/qemu-system-ppc64 -m 32G -smp 8 -boot c -hda /home/jcf/pseries.img -machine pseries --enable-kvm -device vfio-pci,host=0001:1b:00.0,id=net0 -vnc :25
通过qemu monitor可以看到该网卡已经透传到了虚机内。
若是通过libvirt创建虚机,则需添加如下xml透传配置
<devices>
<hostdev mode='subsystem' type='pci' managed='yes'>
<driver name='vfio'/>
<source>
<address domain='0x0001' bus='0x1b' slot='0x00' function='0x0'/>
</source>
</hostdev>
<devices/>