在 KVM 环境中使用 Alveo 数据中心加速器卡
概述
在数据中心环境中,有多种方式来编排资源。其中一种方法是使用容器和 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.

当使用以下 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 打开一个窗口。按
注释: 如果要完整删除该客户 OS,请关闭使用 virt-viewer 打开的 GUI 窗口,然后使用以下命令:
virsh destroy ukvm1404
virsh undefine ukvm1404
从 GUI 测试
virt-viewer 实用程序为客户 OS 打开一个基础窗口。请注意,除了发送键之外,它不会给您任何控制。如果您想要用于管理 KVM 的完整 GUI,请使用 virt-manager,如 https://virt-manager.org/上所述。

如果要安装并启动 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。

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 中使用。