StratoVirt-VFIO使用
管理设备直通
虚拟化平台使用设备直通,可以使虚拟机直接使用相关硬件设备,提升虚拟机性能。本章介绍 StratoVirt 支持的设备直通特性。
前提条件
使用设备直通,主机需要满足如下条件:
开启 IOMMU 功能
IOMMU 全称是 Input/Output Memory Management Unit,该技术可以让 PCI/PCIe 设备的资源直接分配给虚拟机。
在主机上执行如下命令,查看 IOMMU 是否已经开启。
# dmesg | grep iommu
若已开启,回显如下:
iommu: Default domain type: Translated hibmc-drm 0000:0a:00.0: Adding to iommu group 0 ehci-pci 0000:7a:01.0: Adding to iommu group 1 ehci-pci 0000:ba:01.0: Adding to iommu group 2 ohci-pci 0000:7a:00.0: Adding to iommu group 3 ohci-pci 0000:ba:00.0: Adding to iommu group 4 xhci_hcd 0000:7a:02.0: Adding to iommu group 5 ......
若未开启,则没有回显或只显示如下信息:
iommu: Default domain type: Translated
开启IOMMU:
为linux内核增加启动参数:
intel_iommu=on iommu=pt
;vim /boot/grub2/grub.cfg linux /vmlinuz-5.15.0+ root=/dev/mapper/openeuler-root ro resume=/dev/mapper/openeuler-swap rd.lvm.lv=openeuler/root rd.lvm.lv=openeuler/swap crashkernel=512M intel_iommu=on iommu=pt
重启Host OS;
加载 vfio-pci 内核模块
# modprobe vfio-pci # lsmod | grep vfio_pci
成功加载 vfio-pci 模块,则回显如下:
vfio_pci 327680 0 vfio_virqfd 327680 1 vfio_pci vfio 327680 2 vfio_iommu_type1,vfio_pci
将 PCI 设备从主机解绑,重新绑定到 vfio-pci 驱动
假设使用 VFIO 直通 Hi1822 网卡设备,首先查看网卡设备对应的 PCI 设备信息:
# lspci -v | grep "Eth" | grep 1822 03:00.0 Ethernet controller: Huawei Technologies Co., Ltd. Hi1822 Family (4*25GE) (rev 45) 04:00.0 Ethernet controller: Huawei Technologies Co., Ltd. Hi1822 Family (4*25GE) (rev 45) 05:00.0 Ethernet controller: Huawei Technologies Co., Ltd. Hi1822 Family (4*25GE) (rev 45) 06:00.0 Ethernet controller: Huawei Technologies Co., Ltd. Hi1822 Family (4*25GE) (rev 45)
选择其中 bus 号 03,slot 号 00,function 号 0 的设备,即上述的 03:00.0。然后将该 PCI 设备从主机上解绑
# echo 0000:03:00.0 > /sys/bus/pci/devices/0000:03:00.0/driver/unbind
最后将该 PCI 设备重新绑定到 vfio-pci 驱动。
lspci -ns 0000:03:00.0 |awk -F':| ' '{print $5" "$6}' > /sys/bus/pci/drivers/vfio-pci/new_id
将网卡绑定到 vfio-pci 驱动后,在主机上无法查询到对应网卡信息,只能查询到对应的 PCI 设备信息。
VFIO 设备直通
简介
VFIO(Virtual Function I/O) 是内核提供的一种用户态设备驱动方案。VFIO 驱动可以安全地把设备 I/O,中断,DMA 等能力呈现给用户空间。StratoVirt 虚拟化平台使用 VFIO 设备直通方案后,在虚拟机可以极大限度地提升 I/O 性能。
使用 VFIO 直通
StratoVirt 支持 libvirt 管理,可以使用 XML 文件配置虚拟机。以下内容介绍通过修改虚拟机 XML 文件的方式,使用 VFIO 设备直通功能。
一、修改 XML 文件
在主机上执行如下命令,查询 CPU 架构信息
# uname -m
aarch64 和 x86_64 架构分别下载 StratoVirt 自带的 XML 文件 stratovirt_aarch64.xml 或 stratovirtvirt_x86.xml,并存放到任一目录,例如 /home:
# cp stratovirt/docs/stratovirt_$arch.xml /home
根据实际需求,修改XML文件中的VFIO配置。 bus,slot,function 为上述绑定到 vfio-pci 驱动的 PCI 设备。相关配置如下:
<!-- vfio --> <hostdev mode='subsystem' type='pci' managed='yes'> <driver name='vfio'/> <source> <address domain='0x0000' bus='0x03' slot='0x00' function='0x0'/> </source> </hostdev>
上例中,设备类型为 PCI 设备,managed='yes' 表示 libvirt 将把 PCI 设备从主机解绑,并重新绑定到 vfio-pci 驱动。source 项配置了需要作为 VFIO 直通设备的 domain,bus,slot,function 信息。
二、使用 libvirt 命令行创建并登录虚拟机
# virsh create stratovirt_$arch.xml
# virsh list --all
Id Name State
--------------------
1 StratoVirt running
# virsh console 1
三、在虚拟机内查看并使用 VFIO 直通网卡。
配置前查看网卡信息
# ip a 1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000 link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00 inet 127.0.0.1/8 scope host lo valid_lft forever preferred_lft forever 2: enp1s0: <BROADCAST,MULTICAST> mtu 1500 qdisc noop state DOWN group default qlen 1000 link/ether 72:b8:51:9d:d1:27 brd ff:ff:ff:ff:ff:ff
动态配置网卡的 IP 地址
# dhclient
查询 IP 是否配置成功
# ip a 1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000 link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00 inet 127.0.0.1/8 scope host lo valid_lft forever preferred_lft forever 2: enp1s0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc mq state UP group default qlen 1000 link/ether 72:b8:51:9d:d1:27 brd ff:ff:ff:ff:ff:ff inet 192.168.1.3/16 brd 192.168.255.255 scope global dynamic enp1s0 valid_lft 86453sec preferred_lft 86453sec
如上回显可知,成功分配了 IP 地址 192.168.1.3,虚拟机可以直接使用配置的网卡
说明:使用的直通网卡如果没有连接物理网络,将获取不到网络信息。
解绑 VFIO 驱动
如果需要将直通给虚拟机使用的网卡解除绑定,可以登录主机,执行如下命令,将网卡设备重新绑定到主机上。其中,hinic是对应网卡设备驱动的类型:
# echo 0000:03:00.0 > /sys/bus/pci/drivers/vfio-pci/unbind
# echo 0000:03:00.0 > /sys/bus/pci/drivers/hinic/bind
说明:绑定 VFIO 驱动前,可以再主机上执行 ethtool -i enp0 命令,获取网卡设备驱动类型。enp0 为对应网卡名称。
SR-IOV 直通
简介
使用 VFIO 设备直通时,虚拟机能直接访问硬件,但每个设备只能被一个虚拟机独占。SR-IOV 直通技术支持将一个 PF(Physical Function) 虚拟出多个 VF (Virtual Function),并直通给不同虚拟机,解决了设备直通的独占问题,增加可用的设备。
操作步骤
创建多个 VF:
sriov_numvfs 文件用于描述 SR-IOV 提供的 VF 个数,存放在 /sys/bus/pci/devices/domain:bus:slot.function/ 路径下,例如上述例子中的 bus 号 03,slot 号 00,function 号 0 的设备,可以使用如下命令创建4个 VF:
# echo 4 > /sys/bus/pci/devices/0000\:03\:00.0/sriov_numvfs
确认 VF 设备创建成功
# lspci -v | grep "Eth" | grep 1822
回显如下,说明成功创建了4个 VF 03:00.1、03:00.2、03:00.3、03:00.4:
03:00.0 Ethernet controller: Huawei Technologies Co., Ltd. Hi1822 Family (4*25GE) (rev 45) 03:00.1 Ethernet controller: Huawei Technologies Co., Ltd. Hi1822 Family Virtual Function (rev 45) 03:00.2 Ethernet controller: Huawei Technologies Co., Ltd. Hi1822 Family Virtual Function (rev 45) 03:00.3 Ethernet controller: Huawei Technologies Co., Ltd. Hi1822 Family Virtual Function (rev 45) 03:00.4 Ethernet controller: Huawei Technologies Co., Ltd. Hi1822 Family Virtual Function (rev 45)
上述创建的 VF 设备均可以直通给虚拟机,使用 SR-IOV 设备的方法与普通 PCI 设备的直通方法相同。