VFIO的使用及原理

vfio设备透传主要用于将设备直通给虚拟机以提高性能,本篇以一张网卡为例讲述VFIO设备的配置使用及底层原理。其中涉及的技术背景主要有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支持。

ethtool -i ethxxx                //查看某个网卡信息

lshw -C network                //查看系统总体网络信息

记住一定要选择一个宿主机不用的网卡,如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/

若/sys/bus/pci/drivers/目录下没有vfio-pci目录,则记得insmod vfio_pci模块

此时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可以看到该网卡已经透传到了虚机内。

4.1 若是通过SR-IOV配置的网卡,就是一开始多一步创建VF,其余步骤相同。

4.2 若是通过libvirt创建虚机,则需添加如下xml透传配置(其中DBDF要自行改变)
 <devices>  
     <hostdev mode='subsystem' type='pci' managed='yes'>
       <driver name='vfio'/>
       <source>
         <address domain='0x0001' bus='0x1b' slot='0x00' function='0x0'/>
       </source>
     </hostdev>
 <devices/>

 此时上一步骤的解绑绑定都不需要了,libvirt自动设置好。

4.3 若是直通NVMe磁盘,则可以通过如下找到DBDF(ARM叫stream id)

5.登录并配置网络

qemu启动虚机后,可以通过vnc登录进虚机查看,如图发现有一张VFIO网卡。

ip addr add 10.100.11.111/24 dev enp0s2# 设置enp0s2 网口IP地址为10.100.11.111

此处VM的IP需要与Host保持在同一网段。

如果此时发现ping不通,请先确认下Host上的这张网卡是否是NO-CARRIER(没插网线),笔者曾经被它困扰了好久 -_-!

route -n  //查看路由

ip route add default via 10.100.11.254   # 设置系统默认路由

ip route add default via 10.100.11.254  dev enp0s2  # 设置enp0s2默认网关为10.100.11.254
# 或
ip route add 10.100.11.0/24  via  10.100.11.254 dev enp0s2 # 设置10.100.11.0网段的网关为10.100.11.254,数据走enp0s2接口

此时也可通过ssh直接链接到VM

将上述配置写入到/etc/sysconfig/network-scripts/ifcfg-xxx,配置好其中的IPADDR,GATEWAY,ONBOOT=yes,就可以自动联网了。

抑或将以上两项写成sh脚本,放入/etc/rc.d/rc.local或单独成一个sh文件,这样可以方便手动调试自动联网。

二、VFIO原理

1.DMA重映射

2.中断重映射

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值