管理设备直通

虚拟化平台使用设备直通,可以使虚拟机直接使用相关硬件设备,提升虚拟机性能。本章介绍 StratoVirt 支持的设备直通特性。

前提条件

使用设备直通,主机需要满足如下条件:

  1. 开启 IOMMU 功能

    IOMMU 全称是 Input/Output Memory Management Unit,该技术可以让 PCI/PCIe 设备的资源直接分配给虚拟机。

    在主机上执行如下命令,查看 IOMMU 是否已经开启。

    1. # dmesg | grep iommu

    若已开启,回显如下:

    1. iommu: Default domain type: Translated
    2. hibmc-drm 0000:0a:00.0: Adding to iommu group 0
    3. ehci-pci 0000:7a:01.0: Adding to iommu group 1
    4. ehci-pci 0000:ba:01.0: Adding to iommu group 2
    5. ohci-pci 0000:7a:00.0: Adding to iommu group 3
    6. ohci-pci 0000:ba:00.0: Adding to iommu group 4
    7. xhci_hcd 0000:7a:02.0: Adding to iommu group 5
    8. ......

    若未开启,则没有回显或只显示如下信息:

    1. iommu: Default domain type: Translated
  1. 加载 vfio-pci 内核模块

    1. # modprobe vfio-pci
    2. # lsmod | grep vfio_pci

    成功加载 vfio-pci 模块,则回显如下:

    1. vfio_pci 327680 0
    2. vfio_virqfd 327680 1 vfio_pci
    3. vfio 327680 2 vfio_iommu_type1,vfio_pci
  1. 将 PCI 设备从主机解绑,重新绑定到 vfio-pci 驱动

    假设使用 VFIO 直通 Hi1822 网卡设备,首先查看网卡设备对应的 PCI 设备信息:

    1. # lspci -v | grep "Eth" | grep 1822
    2. 03:00.0 Ethernet controller: Huawei Technologies Co., Ltd. Hi1822 Family (4*25GE) (rev 45)
    3. 04:00.0 Ethernet controller: Huawei Technologies Co., Ltd. Hi1822 Family (4*25GE) (rev 45)
    4. 05:00.0 Ethernet controller: Huawei Technologies Co., Ltd. Hi1822 Family (4*25GE) (rev 45)
    5. 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 设备从主机上解绑

    1. # echo 0000:03:00.0 > /sys/bus/pci/devices/0000:03:00.0/driver/unbind

    最后将该 PCI 设备重新绑定到 vfio-pci 驱动。

    1. 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 文件

  1. 在主机上执行如下命令,查询 CPU 架构信息

    1. # uname -m
  2. aarch64 和 x86_64 架构分别下载 StratoVirt 自带的 XML 文件 stratovirt_aarch64.xml 或 stratovirtvirt_x86.xml,并存放到任一目录,例如 /home:

    1. # cp stratovirt/docs/stratovirt_$arch.xml /home
  3. 根据实际需求,修改XML文件中的VFIO配置。 bus,slot,function 为上述绑定到 vfio-pci 驱动的 PCI 设备。相关配置如下:

    ```shell

  1. 上例中,设备类型为 PCI 设备,managed='yes' 表示 libvirt 将把 PCI 设备从主机解绑,并重新绑定到 vfio-pci 驱动。source 项配置了需要作为 VFIO 直通设备的 domainbusslotfunction 信息。
  2. 二、使用 libvirt 命令行创建并登陆虚拟机
  3. ```shell
  4. # virsh create stratovirt_$arch.xml
  5. # virsh list --all
  6. Id Name State
  7. --------------------
  8. 1 StratoVirt running
  9. # virsh console 1

三、在虚拟机内查看并使用 VFIO 直通网卡。

  1. 配置前查看网卡信息

    1. # ip a
    2. 1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000
    3. link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
    4. inet 127.0.0.1/8 scope host lo
    5. valid_lft forever preferred_lft forever
    6. 2: enp1s0: <BROADCAST,MULTICAST> mtu 1500 qdisc noop state DOWN group default qlen 1000
    7. link/ether 72:b8:51:9d:d1:27 brd ff:ff:ff:ff:ff:ff
  2. 动态配置网卡的 IP 地址

    1. # dhclient
  3. 查询 IP 是否配置成功

    1. # ip a
    2. 1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000
    3. link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
    4. inet 127.0.0.1/8 scope host lo
    5. valid_lft forever preferred_lft forever
    6. 2: enp1s0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc mq state UP group default qlen 1000
    7. link/ether 72:b8:51:9d:d1:27 brd ff:ff:ff:ff:ff:ff
    8. inet 192.168.1.3/16 brd 192.168.255.255 scope global dynamic enp1s0
    9. valid_lft 86453sec preferred_lft 86453sec

    如上回显可知,成功分配了 IP 地址 192.168.1.3,虚拟机可以直接使用配置的网卡

    说明:使用的直通网卡如果没有连接物理网络,将获取不到网络信息。

解绑 VFIO 驱动

如果需要将直通给虚拟机使用的网卡解除绑定,可以登录主机,执行如下命令,将网卡设备重新绑定到主机上。其中,hinic是对应网卡设备驱动的类型:

  1. # echo 0000:03:00.0 > /sys/bus/pci/drivers/vfio-pci/unbind
  2. # 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),并直通给不同虚拟机,解决了设备直通的独占问题,增加可用的设备。

操作步骤

  1. 创建多个 VF:

    sriov_numvfs 文件用于描述 SR-IOV 提供的 VF 个数,存放在 /sys/bus/pci/devices/domain\:bus\:slot.function/ 路径下,例如上述例子中的 bus 号 03,slot 号 00,function 号 0 的设备,可以使用如下命令创建4个 VF:

    1. # echo 4 > /sys/bus/pci/devices/0000\:03\:00.0/sriov_numvfs
  2. 确认 VF 设备创建成功

    1. # lspci -v | grep "Eth" | grep 1822

    回显如下,说明成功创建了4个 VF 03:00.1、03:00.2、03:00.3、03:00.4:

    1. 03:00.0 Ethernet controller: Huawei Technologies Co., Ltd. Hi1822 Family (4*25GE) (rev 45)
    2. 03:00.1 Ethernet controller: Huawei Technologies Co., Ltd. Hi1822 Family Virtual Function (rev 45)
    3. 03:00.2 Ethernet controller: Huawei Technologies Co., Ltd. Hi1822 Family Virtual Function (rev 45)
    4. 03:00.3 Ethernet controller: Huawei Technologies Co., Ltd. Hi1822 Family Virtual Function (rev 45)
    5. 03:00.4 Ethernet controller: Huawei Technologies Co., Ltd. Hi1822 Family Virtual Function (rev 45)
  3. 上述创建的 VF 设备均可以直通给虚拟机,使用 SR-IOV 设备的方法与普通 PCI 设备的直通方法相同。