首页 > 文章 > 在 KVM 环境中使用 Alveo 数据中心加速器卡

在 KVM 环境中使用 Alveo 数据中心加速器卡

Kester Aernoudt 2020年04月30日

概述

在数据中心环境中,有多种方式来编排资源。其中一种方法是使用容器和 Kubernete 作为编排器。要在这样的环境中使用 Alveo™ 数据中心加速器卡,请参见 https://developer.xilinx.com/en/articles/using-alveo-in-a-kubernetes-environment.html 获得有关部署的更多信息和示例。

编排资源的另一种方法是通过虚拟化,例如使用基于内核的虚拟机 (KVM)。如需了解更多信息,请参见 https://www.linux-kvm.org. 本文展示了如何在 KVM 环境中部署 Alveo 数据中心加速器卡。


本地 KVM 设置

本文不是有关如何安装和配置 KVM 的深入教程。本节简要概述了如何配置您的服务器。

注释: 本示例使用 Dell R740 服务器上的 Ubuntu 18.04 LTS 作为示例主机环境。对于本教程,我们使用  https://fabianlee.org/2018/08/27/kvm-bare-metal-virtualization-on-ubuntu-with-kvm/上提供的指南安装和配置 KVM。

安装 KVM

要安装 KVM,请执行以下步骤:

1.       安装 KVM 和配套工具:

    sudo apt-get install qemu-system-x86 qemu-kvm qemu libvirt-bin virt-manager virtinst bridge-utils cpu-checker virt-viewer

2.      检查 KVM 是否已安装,CPU 是否具有通过 kvm-ok启用的 VT-x 虚拟化。 

    $ sudo kvm-ok

INFO: /dev/kvm exists
KVM acceleration can be used 

注释: 如果您收到以下消息,请在 BIOS 级别启用 VT-x。

INFO: /dev/kvm does not exist HINT: sudo modprobe kvm_intel
INFO: Your CPU supports KVM extensions INFO: KVM (vmx) is disabled by your BIOS
HINT: Enter your BIOS setup and enable Virtualization Technology (VT), and then hard poweroff/poweron your system
KVM acceleration can NOT be used

3.       运行 virt-host-validate 实用程序来针对您的虚拟化能力和 KVM 准备情况运行一整套检查。

QEMU: Checking if device /dev/kvm is accessible			: PASS
QEMU: Checking if device /dev/vhost-net exists			: PASS
QEMU: Checking if device /dev/net/tun exists			: PASS
QEMU: Checking for cgroup 'memory' controller support		: PASS
QEMU: Checking for cgroup 'memory' controller mount-point	: PASS
QEMU: Checking for cgroup 'cpu' controller support		: PASS
QEMU: Checking for cgroup 'cpu' controller mount-point		: PASS
QEMU: Checking for cgroup 'cpuacct' controller support		: PASS
QEMU: Checking for cgroup 'cpuacct' controller mount-point	: PASS
QEMU: Checking for cgroup 'cpuset' controller support		: PASS
QEMU: Checking for cgroup 'cpuset' controller mount-point	: PASS
QEMU: Checking for cgroup 'devices' controller support		: PASS
QEMU: Checking for cgroup 'devices' controller mount-point	: PASS
QEMU: Checking for cgroup 'blkio' controller support		: PASS
QEMU: Checking for cgroup 'blkio' controller mount-point	: PASS
QEMU: Checking for device assignment IOMMU support		: PASS
LXC: Checking for Linux >= 2.6.26				: PASS
LXC: Checking for namespace ipc					: PASS
LXC: Checking for namespace mnt					: PASS
LXC: Checking for namespace pid					: PASS
LXC: Checking for namespace uts					: PASS
LXC: Checking for namespace net					: PASS
LXC: Checking for namespace user				: PASS
LXC: Checking for cgroup 'memory' controller support		: PASS
LXC: Checking for cgroup 'memory' controller mount-point	: PASS
LXC: Checking for cgroup 'cpu' controller support		: PASS
LXC: Checking for cgroup 'cpu' controller mount-point		: PASS
LXC: Checking for cgroup 'cpuacct' controller support		: PASS
LXC: Checking for cgroup 'cpuacct' controller mount-point	: PASS
LXC: Checking for cgroup 'cpuset' controller support		: PASS
LXC: Checking for cgroup 'cpuset' controller mount-point	: PASS
LXC: Checking for cgroup 'devices' controller support		: PASS
LXC: Checking for cgroup 'devices' controller mount-point	: PASS
LXC: Checking for cgroup 'blkio' controller support		: PASS
LXC: Checking for cgroup 'blkio' controller mount-point		: PASS
LXC: Checking if device /sys/fs/fuse/connections exists		: PASS

4.       如果您没有看到每个测试的PASS提示,您应该修复您的设置。在 Ubuntu 18.04 LTS 上,IOMMU 默认未启用,因此该测试最初会失败。要启用 IOMMU,请执行以下步骤: 

a.       修改 /etc/default/grub 文件:

sudo vim /etc/default/grub

b.       添加/修改GRUB_CMDLINE_LINUX条目:

GRUB_CMDLINE_LINUX="intel_iommu=on"

c.       应用以下配置:

sudo update-grub

d.       重新启动计算机。

将用户添加到 libvirt 组

如果要允许当前用户管理客户 VM,您可以将自己添加到所有 libvirt 组(例如 libvirt、libvirt qemu)和 kvm 组。

cat /etc/group | grep libvirt | awk -F':' {'print $1'} | xargs -n1 sudo adduser $USER

# add user to kvm group also 
sudo adduser $USER kvm

# relogin, then show group membership 
exec su -l $USER
id | grep libvirt

组成员身份要求您重新登录。如果 id 命令没有显示 libvirt* 组成员身份,请注销并重新登录,或者运行 exec su -l $USER中所述。

配置网络

认情况下,KVM 会创建一个虚拟交换机,该交换机显示为使用192.168.122.0/24的名为 virbr0 的主机接口。

关虚拟交换机的信息,请参见 https://wiki.libvirt.org/page/VirtualNetworking.

Libvirt’s-Default-Network-Configuration
Libvirt 的默认网络配置由 libvirt.org 提供

当使用以下 ip 命令时,应该可以从主机看到此接口:

~$ ip addr show virbr0
12: virbr0:  mtu 1500 qdisc noqueue state DOWN group default qlen 1000 
link/ether 52:54:00:34:3e:8f brd ff:ff:ff:ff:ff:ff
inet 192.168.122.1/24 brd 192.168.122.255 scope global virbr0 
valid_lft forever preferred_lft forever


使用 virt install 命令创建基本 VM

如果要进行测试,您需要一个 OS 启动镜像。因为您在 Ubuntu 主机上,您必须为 Ubuntu 18.04 的网络安装程序下载 ISO。该文件只有 76MB,所以非常适合测试。测试完成后,您应该有一个名为 ~/Downloads/mini.iso 的本地文件。

1.       使用以下命令生成在您主机上运行的虚拟机列表:

# list VMs 
virsh list

2.       因为您还没有创建虚拟机,所以应该回空。使用默认 virbr0 NAT 网络和默认池存储创建您的第一个具有1 vcpu/1G RAM的客户VM。

$ virt-install --virt-type=kvm --name=ukvm1404 --ram 1024 --vcpus=1 --virt-type=kvm --hvm --cdrom ~/faas/mini.iso --network network=default --disk pool=default,size=20,bus=virtio,format=qcow2 --noautoconsole
WARNING  No operating system detected, VM performance may suffer. Specify an OS with --os-variant for optimal results.
 
Starting install...
Allocating 'ukvm1404.qcow2'                                |       20 GB  00:00:00    
Domain installation still in progress. You can reconnect to
the console to complete the installation process.
 
# open console to VM
$ virt-viewer ukvm1404

3.       当您在窗口中单击鼠标时, “virt-viewer”将为客户 OS 打开一个窗口。按查看初始 Ubuntu 网络安装屏幕。

注释: 如果要完整删除该客户 OS,请关闭使用 virt-viewer 打开的 GUI 窗口,然后使用以下命令:

virsh destroy ukvm1404 
virsh undefine ukvm1404

从 GUI 测试

virt-viewer 实用程序为客户 OS 打开一个基础窗口。请注意,除了发送键之外,它不会给您任何控制。如果您想要用于管理 KVM 的完整 GUI,请使用 virt-manager,如 https://virt-manager.org/上所述。

virt-manager

如果要安装并启动 virt-manager 请运行以下命令:

    sudo apt-get install qemu-system virt-manager 
    virt-manager

virt-manager 为创建或管理客户 OS 提供了方便的接口。您使用 virt-install 从 CLI 创建的任何客户 OS 也会显示在此列表中。


配置 Alveo 器件透传

当您创建一个或多个 VM 后,为其分配 Alveo 数据中心加速器卡。有关不同使用模型的更多信息, 请参见 https://xilinx.github.io/XRT/master/html/security.html#deployment-models.

1.       使用以下命令下载并安装 XRT:

    wget https://www.xilinx.com/bin/public/openDownload?filename=xrt_201920.2.3.1301_18.04-xrt.deb 
    sudo apt install ./xrt_201920.2.3.1301_18.04-xrt.deb

2.       安装完成后重新启动您的系统。

3.      如果要获取在您的系统上安装的 Alveo 数据中心加速器卡列表,请运行以下 XRT 命令。以下示例显示系统上安装了两个卡:

    $/opt/xilinx/xrt/bin/xbmgmt scan
    *0000:af:00.0 xilinx_u280-es1_xdma_201910_1(ts=0x5d1c391d) mgmt(inst=44800)
    *0000:3b:00.0 xilinx_u200_xdma_201830_2(ts=0x5d1211e8) mgmt(inst=15104)

使用 PCIe 透传

Alveo 数据中心加速卡在 PCIe® 接口上公开了两个实际功能。要为设备的客户 OS 提供完全控制,您必须同时执行这两个功能。这可以通过使用 virsh 命令完成。

1.       创建两个文件,每个文件对应一个实际功能。例如,这些文件可以用来传递 U200 文件

    $ cat pass-mgmt.xml
   
    $ cat pass-user.xml

有了这些文件,就可以使用 virsh 将 U200 卡传递到现有的 VM。有多种方法可以做到这一点,但本节中描述的流程仅允许在重新启动后在客户 OS 中使用器件。

2.       将 U200 挂接到您系统中的 VM。在下面的示例中,显示了一个名为 centos7.5 的 VM。

    $ virsh attach-device centos7.5 --file pass-user.xml --config 
    Device attached successfully

    $ virsh attach-device centos7.5 --file pass-mgmt.xml --config 
    Device attached successfully

如果在启动 VM 时您已安装正确的 XRT 和 Shell,那么您应该可以直接使用 U200。

XML-FILE

3.       与您挂接文件的方式相同,您可以使用相同的 XML 文件分离器件。

    $ virsh detach-device centos7.5 --file pass-user.xml --config 
    Device detached successfully

    $ virsh detach-device centos7.5 --file pass-mgmt.xml --config 
    Device detached successfully

用于挂接和分离 Alveo 卡的脚本

为了更方便地将 Alveo 数据中心加速器卡与不同的VM挂接和分离,您可以通过创建脚本来自动执行此任务。如果要创建脚本,请使用以下辅助 xml 文件:

    $ cat pass-user.xml_base

    $ cat pass-mgmt.xml_base
  

以下是使用两个辅助 xml 文件创建的脚本 attach.sh:

#!/bin/bash

if [ $# -ne 2 ]; then
  echo "Usage: $0  " echo "For example: $0 centos7.5 af" echo
  echo "OS list:" virsh list --all echo
  echo "========================================================"
  echo
  echo "Xilinx devices:"
  [ -f /opt/xilinx/xrt/bin/xbmgmt ] && /opt/xilinx/xrt/bin/xbmgmt scan || lspci -d 
  10ee: echo
  echo
  echo "========================================================"
  echo
    for dev in $(virsh list --all --name); do
    devices=$(virsh dumpxml $dev | grep ' pass-user-$DEV-$OS.xml 
envsubst < pass-mgmt.xml_base > pass-mgmt-$DEV-$OS.xml

CMD=$(basename $0) 
COMMAND=${CMD%.sh}
virsh $COMMAND-device $OS --file pass-mgmt-$DEV-$OS.xml --config 
virsh $COMMAND-device $OS --file pass-user-$DEV-$OS.xml --config

rm pass-mgmt-$DEV-$OS.xml pass-user-$DEV-$OS.xml

如果要使用 attach.sh 文件,您可以创建到 detach.sh 的链接,如下所示:

-rwxrwxr-x 1 alveo alveo 1159 Mar 20 10:02 attach.sh
lrwxrwxrwx 1 alveo alveo 9 Mar 20 12:15 detach.sh -> attach.sh

当在没有任何命令的情况下执行时,脚本将输出现有域 (VM)、系统中安装的 Alveo 数据中心加速器卡,并显示哪个 Alveo 卡连接到哪个VM。例如:

Usage: ./attach.sh   
For example: ./attach.sh centos7.5 af

OS list:
Id		Name			State
----------------------------------------------------
-	     centos7.5		shut off
-	     ubuntu18.04		shut off

========================================================

Xilinx devices:
*0000:af:00.0 xilinx_u280-es1_xdma_201910_1(ts=0x5d1c391d) mgmt(inst=44800)
*0000:3b:00.0 xilinx_u200_xdma_201830_2(ts=0x5d1211e8) mgmt(inst=15104)

========================================================

Attached host devices in centos7.5: 
3b
Af

Attached host devices in ubuntu18.04:

在上面显示的示例中,系统中安装了两个 VM(centos7.5 和 ubuntu18.04),但它们都没有运行。服务器中安装了两个 Alveo 数据中心加速器卡(插槽 0000:3b:00.0 中的 U200 和插槽 000:af:00.0 中的 U280),它们均挂接到 centos7.5 VM。

如果要挂接或分离 Alveo 数据中心加速器卡,请使用以下命令:

    attach.sh   

注释: 器件可以挂接到多个 VM,但这些 VM 不能同时运行。

$ ./attach.sh ubuntu18.04 3b 
Device attached successfully

Device attached successfully

$ ./attach.sh
Usage: ./attach.sh   
For example: ./attach.sh centos7.5 af

OS list:
Id		Name			State
----------------------------------------------------
-	     centos7.5		shut off
-	     ubuntu18.04		shut off

========================================================

Xilinx devices:
*0000:af:00.0 xilinx_u280-es1_xdma_201910_1(ts=0x5d1c391d) mgmt(inst=44800)
*0000:3b:00.0 xilinx_u200_xdma_201830_2(ts=0x5d1211e8) mgmt(inst=15104)

========================================================

Attached host devices in centos7.5: 
3b
af

Attached host devices in ubuntu18.04: 
3b

同样,如果要分离器件,请使用以下命令: 

    detach.sh  

U200 可以从 centos7.5 VM 分离出来,如下所示:

$ ./detach.sh centos7.5 3b 
Device detached successfully

Device detached successfully

$ ./attach.sh
Usage: ./attach.sh   
For example: ./attach.sh centos7.5 af

OS list:
Id		Name			State
----------------------------------------------------
-	     centos7.5		shut off
-	     ubuntu18.04		shut off

========================================================

Xilinx devices:
*0000:af:00.0 xilinx_u280-es1_xdma_201910_1(ts=0x5d1c391d) mgmt(inst=44800)
*0000:3b:00.0 xilinx_u200_xdma_201830_2(ts=0x5d1211e8) mgmt(inst=15104)

========================================================

Attached host devices in centos7.5: 
af

Attached host devices in ubuntu18.04: 
3b

此脚本的自动完成支持功能是通过创建包含以下代码的文件 autocomplete_faas.sh 实现的: 

    _faas()
{
    local cur prev hosts devices suggestions device_suggestions 
    COMPREPLY=()
    cur="${COMP_WORDS[COMP_CWORD]}" 
    prev="${COMP_WORDS[COMP_CWORD-1]}"
    hosts="$(virsh list --all --name)"
    devices="$(lspci -d 10ee: | grep \\.0 | awk '{print substr($0,0,2);}' | tr '\n' ' ' | head -c -1)"

    case $COMP_CWORD in 
    1)
         COMPREPLY=( $(compgen -W "${hosts}" -- ${cur}) ) 
         return 0
         ;;
    2)
        if [ "${COMP_WORDS[0]}" == "./detach.sh" ]; then
            # only return attached devices
            devices=$(virsh dumpxml $prev | grep '$(/opt/xilinx/xrt/bin/xbutil scan | grep ":${suggestions[$dev]}:" | xargs echo -n)")
           done 
           COMPREPLY=("${device_suggestions[@]}")
    fi

}
complete -F _faas ./attach.sh 
complete -F _faas ./detach.sh

然后找到此文件的来源:

    source ./autocomplete.sh

然后,您可以对 VM 名称和器件使用自动完成(使用 TAB)。


结论

本文展示了如何在 KVM 环境中使用 Alveo 数据中心加速器卡。单个Alveo 卡可以动态地与 VM 挂接和分离,因此它们可以像在服务器上本地运行一样在这些不同的 VM 中使用。


About Kester Aernoudt

About Kester Aernoudt

Kester Aernoudt 于 2002 年在根特大学获得计算机科学硕士学位。2002年,他开始在巴可技术中心担任研究工程师,研究各种处理平台,如微控制器、DSP、嵌入式处理器、FPGA、多核 CPU、GPU 等。2011年,他加入赛灵思,目前担任欧洲和以色列地区的处理器专员,为嵌入式处理器、X86 加速领域的客户和同事提供支持,特别针对我们的Zynq 器件和 Alveo。