DOCA SNAP Virtio-fs 服务指南
本指南提供关于在 NVIDIA® BlueField®-3 DPU 之上使用 DOCA SNAP Virtio-fs 服务的说明。
DOCA SNAP Virtio-fs 服务目前处于 Beta 级别支持。
NVIDIA® BlueField® 实现了硬件加速的软件定义 virtio-fs PCIe 设备模拟。这利用了 BlueField 网络平台(DPU 或 SuperNIC)的强大功能,在裸机和虚拟化环境中提供高性能文件系统访问。使用 BlueField,用户可以将网络文件系统操作从主机/访客卸载并加速,从而释放资源用于其他任务并提高整体系统效率。在此解决方案中,主机/访客使用其自己的标准 virtio-fs 驱动程序,该驱动程序与 BlueField 中挂载的网络文件系统完全隔离。
virtio-fs 设备在 BlueField 设备上的模拟构建于 DOCA 和 SPDK 框架之上,为基于 BlueField 的解决方案和存储解决方案提供了一整套库。此架构由几个关键组件组成
DOCA DevEmu 子系统和 DOCA Virtio-fs 库 – 这些核心库负责底层硬件管理以及将携带 FUSE(用户空间文件系统)请求的 virtio 描述符转换为抽象的 virtio-fs 请求,然后由 SPDK virtio-fs DOCA 传输组件处理。
SPDK virtio-fs 传输 – 此组件负责与底层 DOCA 组件交互,并将传入的抽象 DOCA SNAP Virtio-fs 请求转换为通用的 virtio-fs 请求,然后由 virtio-fs 目标核心处理。
SPDK virtio-fs 目标 – 此组件实现和管理 virtio-fs 设备、传输以及与后端文件系统的接口。当来自传输的新通用 virtio-fs 请求到达时,它会根据 virtio-fs 和 FUSE 规范处理和转换请求,将基于 FUSE 的命令转换为通用文件系统协议。
SPDK FSdev – 此组件提供通用文件系统抽象,并与实现特定后端文件系统协议的底层文件系统模块接口。

DOCA SNAP Virtio-fs 作为容器
DOCA SNAP Virtio-fs 容器镜像可以从 NVIDIA NGC 下载,并使用 YAML 文件轻松部署在 BlueField 上。YAML 文件指向 Docker 镜像,该镜像包含与最新 spdk.nvda
版本对齐的 DOCA SNAP Virtio-fs 二进制文件。
DOCA SNAP Virtio-fs 未预装在 BFB 上,但可以根据需要手动下载。有关如何安装 DOCA SNAP Virtio-fs 容器的说明,请参阅“DOCA SNAP Virtio-fs 容器部署”部分。
本节介绍如何将 DOCA SNAP Virtio-fs 部署为容器。
DOCA SNAP Virtio-fs 不会预装在 BFB 捆绑包中。
默认的 virtio-blk 模拟提供程序设置为 DPU
。在此模式下,SNAP Virtio-fs 和 SNAP Virtio-blk 只有在分配给不同的 DPA 执行单元 (EU) 时才能同时运行。
这种分离是通过设置环境变量 dpu_helper_core_mask=0x1fffe
来实现的,该变量在 SNAP Virtio-fs 包中包含的 set_environment_variables.sh
脚本中配置。
在 BlueField 上安装完整 DOCA 镜像
要在 BlueField 上安装 BFB
[host] sudo bfb-install --rshim <rshimN> --bfb <image_path.bfb>
有关更多信息,请参阅NVIDIA DOCA Linux 安装指南中的“在 DPU 上安装完整 DOCA 镜像”部分。
固件安装
[dpu] sudo /opt/mellanox/mlnx-fw-updater/mlnx_fw_updater.pl --force-fw-update
有关更多信息,请参阅NVIDIA DOCA Linux 安装指南中的“升级固件”部分。
固件配置
固件配置可能会公开新的模拟 PCIe 功能,这些功能稍后可供主机的操作系统使用。因此,用户必须确保所有公开的 PCIe 功能(静态/热插拔)都由支持的 virtio-fs 软件配置支持。否则,这些功能将发生故障,并且主机行为将异常。
在实施所需的配置之前清除固件配置
[dpu] mst start [dpu] mlxconfig -d /dev/mst/mt41692_pciconf0 reset
验证固件配置
[dpu] mlxconfig -d /dev/mst/mt41692_pciconf0 query
输出示例
mlxconfig -d /dev/mst/mt41692_pciconf0 -e query | grep VIRTIO_FS Configurations: Default Current Next Boot * VIRTIO_FS_EMULATION_ENABLE False(0) True(1) True(1) VIRTIO_FS_EMULATION_NUM_VF 0 0 0 * VIRTIO_FS_EMULATION_NUM_PF 0 2 2 VIRTIO_FS_EMU_SUBSYSTEM_VENDOR_ID 6900 6900 6900 VIRTIO_FS_EMULATION_SUBSYSTEM_ID 4186 4186 4186 * VIRTIO_FS_EMULATION_NUM_MSIX 2 3 3
输出提供 5 列(从左到右列出)
非默认配置标记 (
*
)固件配置名称
默认固件值
当前固件值
重启后的固件值 – 显示配置更新正在等待系统重启
要启用存储模拟选项,必须将 BlueField 设置为在内部 CPU 模型中工作
[dpu] mlxconfig -d /dev/mst/mt41692_pciconf0 s INTERNAL_CPU_MODEL=1
要使用 virtio-fs 模拟 PF 启用固件配置
[dpu] mlxconfig -d /dev/mst/mt41692_pciconf0 s VIRTIO_FS_EMULATION_ENABLE=1 VIRTIO_FS_EMULATION_NUM_PF=1 VIRTIO_FS_EMULATION_NUM_MSIX=3
有关 DOCA SNAP Virtio-fs 固件配置选项的完整列表,请参阅“附录 – BlueField 固件配置”。
应用固件配置更改需要断电重启。
RDMA/RoCE 固件配置
BlueField 操作系统的默认接口(命名为 ECPF),通常为 mlx5_0
和 mlx5_1
,RoCE 通信被阻止。如果需要 RoCE 流量,则必须添加可扩展功能 (SF),这些功能是支持 RoCE 传输的网络功能。
要启用 RDMA/RoCE
[dpu] mlxconfig -d /dev/mst/mt41692_pciconf0 s PER_PF_NUM_SF=1
[dpu] mlxconfig -d /dev/mst/mt41692_pciconf0 s PF_SF_BAR_SIZE=8 PF_TOTAL_SF=2
[dpu] mlxconfig -d /dev/mst/mt41692_pciconf0.1 s PF_SF_BAR_SIZE=8 PF_TOTAL_SF=2
通过 TCP 或 InfiniBand 上的 RDMA 工作时,不需要这样做。
热插拔固件配置
启用 PCIe 交换机模拟后,BlueField 可以支持 PCI_SWITCH_EMULATION_NUM_PORT
-1 个热插拔 virtio-fs 功能。这些 PCIe 功能在所有 BlueField 用户和应用程序之间共享,并且可以容纳 NVMe、virtio-blk、virtio-fs 和更多类型(例如,virtio-net)的热插拔设备。
要启用 PCIe 交换机模拟并配置 31 个要使用的热插拔端口,请运行
[dpu] mlxconfig -d /dev/mst/mt41692_pciconf0 s PCI_SWITCH_EMULATION_ENABLE=1 PCI_SWITCH_EMULATION_NUM_PORT=32
PCI_SWITCH_EMULATION_NUM_PORT
等于 1 加上热插拔 PCIe 功能的数量。
在 AMD 机器上,不保证热插拔能够工作,并且启用PCI_SWITCH_EMULATION_ENABLE可能会影响 SR-IOV 功能。
DOCA SNAP Virtio-fs 容器部署
DOCA SNAP Virtio-fs 容器在 DOCA SNAP Virtio-fs NVIDIA™ NGC 页面上可用。
要在 BlueField 之上部署 DOCA SNAP Virtio-fs 容器,需要执行以下步骤
容器部署的设置准备和 DOCA SNAP Virtio-fs 资源下载。有关详细信息,请参阅“准备步骤”部分。
如果需要高级配置,请根据“调整 YAML 配置”部分调整
doca_vfs.yaml
。部署容器。镜像会自动从 NGC 拉取。有关详细信息,请参阅“生成 DOCA SNAP Virtio-fs 容器”部分。
准备步骤
步骤 1:分配 Hugepage
根据 DPU 操作系统的 Hugepagesize
值,为 DOCA SNAP Virtio-fs 容器分配 4GiB
hugepage
查询
Hugepagesize
值[dpu] grep Hugepagesize /proc/meminfo
在 Ubuntu 中,该值应为 2048KB。
将以下行附加到
/etc/sysctl.conf
文件的末尾vm.nr_hugepages = 2048
运行以下命令
[dpu] sysctl --system
如果在此部署中使用了实时升级,则需要为升级后的容器分配两倍于上面列出的资源量。
如果设置中同时运行其他应用程序并正在消耗 hugepage,请确保分配适当数量的 hugepage 以容纳所有应用程序。
步骤 2:创建 /etc/virtiofs 文件夹
容器使用文件夹 /etc/virtiofs
在部署后进行自动配置。
默认 YAML 配置仅挂载 /etc/virtiofs
文件夹,以便在容器和 BlueField 之间公开和共享。此文件夹用于将配置文件或本地文件后端(例如,AIO FSdev)从 DPU 公开到容器。
从 NGC 下载 YAML
DOCA SNAP Virtio-fs 容器的 .yaml
配置文件 doca_vfs.yaml
已上传到 DOCA NGC。
下载 DOCA SNAP Virtio-fs 资源需要互联网连接。
调整 YAML 配置
可以轻松编辑 .yaml
文件以进行高级配置。
默认情况下,DOCA SNAP Virtio-fs
.yaml
文件配置为支持 Ubuntu 设置(即,Hugepagesize
= 2048 kB),方法是使用 hugepages-2Mi。要支持其他设置,请根据 BlueField 操作系统的相关
Hugepagesize
值编辑 hugepage 部分。例如,要支持 CentOS 8.x,请将Hugepagesize
配置为 512MBlimits: hugepages-512Mi: "<number-of-hugepages>Gi"
以下示例编辑
.yaml
文件以请求 8 个 CPU 核心用于 DOCA SNAP Virtio-fs 容器resources: cpu: "8" limits: cpu: "8" env: - name: APP_ARGS value: "-m 0xff"
注意如果请求所有 BlueField-3 核心,则用户必须验证是否没有其他容器在 CPU 资源上发生冲突。
要在部署时自动配置 DOCA SNAP Virtio-fs 容器
在
/etc/virtiofs/
下添加spdk_rpc_init.conf
文件。文件示例fsdev_aio_create aio0 /etc/virtiofs/test virtio_fs_transport_create -t DOCA virtio_fs_transport_start -t DOCA virtio_fs_device_create --transport-name DOCA --dev-name vfsdev0 --tag docatag --fsdev aio0 --num-request-queues 1 --queue-size 32 --driver-platform x86_64 virtio_fs_doca_device_modify --dev-name vfsdev0 --manager mlx5_0 --vuid "MT2251XZ02WZVFSS0D0F3" virtio_fs_device_start --dev-name vfsdev0
相应地编辑
.yaml
文件(取消注释)env: - name: SPDK_RPC_INIT_CONF value: "/etc/virtiofs/spdk_rpc_init.conf"
注意用户有责任确保 DOCA SNAP Virtio-fs 配置与固件配置匹配。也就是说,必须在所有现有(静态/热插拔)模拟 PCIe 功能上打开模拟控制器(通过自动或手动配置)。没有支持控制器的 PCIe 功能被认为是故障的,并且主机使用它的行为是异常的。
生成 DOCA SNAP Virtio-fs 容器
运行 Kubernetes 工具
[dpu] systemctl restart containerd
[dpu] systemctl restart kubelet
[dpu] systemctl enable kubelet
[dpu] systemctl enable containerd
将更新后的 doca_vfs.yaml
文件复制到 /etc/kubelet.d
目录。
Kubelet 会自动从 YAML 文件中描述的 NGC 拉取容器镜像,并生成一个执行该容器的 pod。
cp doca_vfs.yaml /etc/kubelet.d/
DOCA SNAP Virtio-fs 服务立即开始初始化,这可能需要几秒钟。
要验证 DOCA SNAP Virtio-fs 是否正在运行,请发送 spdk_rpc.py spdk_get_version
以确认 DOCA SNAP Virtio-fs 是否正在运行或仍在初始化。
调试和日志
查看当前活动的 pod 及其 ID(pod 可能需要长达 20 秒才能启动)
crictl pods
输出示例
POD ID CREATED STATE NAME
0379ac2c4f34c About a minute ago Ready virtiofs
查看当前活动的容器及其 ID
crictl ps
查看现有容器及其 ID
crictl ps -a
检查给定容器(virtio-fs 日志)的日志
crictl logs <container_id>
如果某些内容未按预期工作,请检查 kubelet 日志
journalctl -u kubelet
容器日志文件由 Kubelet 自动保存在 /var/log/containers
下。
停止、启动、重启 DOCA SNAP Virtio-fs 容器
要停止容器,请从
/etc/kubelet.d/
中删除.yaml
文件。要启动容器,请将
.yaml
文件复制到同一路径cp doca_vfs.yaml /etc/kubelet.d
要重启容器(使用 sig-term),请使用
-t
(超时) 选项crictl stop -t 10 <container-id>
注意在 pod 中的容器退出后,kubelet 会使用指数退避延迟(10 秒、20 秒、40 秒等)重启它们,该延迟上限为五分钟。一旦容器在没有问题的情况下运行了 10 分钟,kubelet 就会重置该容器的重启退避计时器。
支持 SNAP 的 DOCA SNAP Virtio-fs
DOCA SNAP Virtio-fs 容器及其关联的软件包原生支持 DOCA SNAP-4,它被实现为 SPDK 子系统模块。此设计使 virtio-fs 和 virtio-blk 能够作为统一服务并发运行。此外,DOCA SNAP 已集成到 DOCA SNAP Virtio-fs 部署中。
DOCA SNAP 部署将 snap
、snap_nvme
和 snap_vblk
设置为 SPDK 子系统,可以根据需要禁用它们。
有关更多信息,请参阅DOCA SNAP-4 服务指南文档。
DOCA SNAP RPC 可以用作 SPDK 插件,这是使用 SPDK RPC 脚本运行 RPC 的推荐方法。用户可能需要设置 PYTHONPATH
环境变量以包含 snap_rpc.py
的路径。
此命令使用 DOCA SNAP RPC 插件创建 Virtio 块控制器,指定 --pf_id 0
并使用 Null0
作为块设备
spdk_rpc.py --plugin snap_rpc virtio_blk_controller_create --pf_id 0 --bdev Null0
有关使用 RPC 插件的更多详细信息,请参阅 SPDK 官方文档。
与其他标准 SPDK 应用程序一样,远程过程调用 (RPC) 协议用于控制 DOCA SNAP Virtio-fs 服务,并支持基于 JSON 的 RPC 协议命令,以轻松地从 CLI 控制任何资源并创建、删除、查询或修改命令。
除了扩展的 DOCA SNAP Virtio-fs 特定命令集之外,DOCA SNAP Virtio-fs 还支持所有标准 SPDK RPC 命令。标准 SPDK 命令由 spdk_rpc.py
工具执行。
要调用扩展的 DOCA SNAP Virtio-fs 特定命令集,用户必须将 --plugin rpc_virtio_fs_tgt
标志添加到 SPDK 的 rpc.py
命令中。SPDK RPC 插件 rpc_virtio_fs_tgt.py
被实现为 RPC 插件。使用容器时不需要此标志。
以下是使用来自源的 DOCA SNAP Virtio-fs 时的 RPC 示例
/opt/nvidia/spdk-subsystem/src/spdk/install-$(hostname)/bin/spdk_rpc --plugin rpc_virtio_fs_tgt --help
用户可能需要使用 PYTHONPATH
环境变量定义 virtio-fs -target 文件夹的路径。有关 RPC 插件的更多详细信息,请参阅 SPDK 官方文档。
完整的 spdk_rpc.py
命令集文档可以在 SPDK 官方文档站点中找到。
以下小节详细介绍了 DOCA SNAP Virtio-fs 扩展命令。
使用基于 JSON 的 RPC 协议
基于 JSON 的 RPC 协议可以与 DOCA SNAP Virtio-fs 容器内的 rpc.py
脚本和 crictl
工具一起使用。
DOCA SNAP Virtio-fs 容器与 CRI 兼容。
要查询活动的容器 ID
crictl ps -s running -q --name virtiofs
要使用
crictl
将 RPC 发布到容器crictl exec <container-id> spdk_rpc.py -v <RPC-method>
标志
-v
控制详细程度。例如crictl exec 0379ac2c4f34c spdk_rpc.py -v virtio_fs_doca_get_functions
或者,可以使用别名
crictl exec -it $(crictl ps -s running -q --name virtiofs) spdk_rpc.py -v virtio_fs_doca_get_functions
要打开容器的 bash shell,可用于发布 RPC
crictl exec -it <container-id> bash
PCIe 功能管理
模拟 PCIe 功能通过称为模拟管理器的 DOCA 设备进行管理。模拟管理器具有控制、操作和向主机 PCIe 子系统公开模拟 PCIe 设备的特殊权限。
要通过 DOCA 传输操作 virtio-fs 设备/功能,必须找到其合适的模拟管理器。模拟管理器维护它控制的模拟 PCIe 功能列表。这些功能中的每一个都分配了一个全局唯一的序列号,称为供应商唯一标识符或 VUID(例如,MT2251XZ02WZVFSS0D0F2),它用作识别和跟踪目的的明确参考。
命令 | 描述 |
列出 virtio-fs 的现有模拟管理器 | |
列出 virtio-fs 的功能 | |
列出 virtio-fs 的可能模拟管理器 | |
为 virtio-fs 创建模拟管理器 | |
销毁 virtio-fs 的模拟管理器 |
virtio_fs_doca_get_managers
列出 virtio-fs 的现有模拟管理器。此方法没有输入参数。
响应示例
{
"jsonrpc"
: "2.0"
,
"id"
: 1
,
"result"
: [
{
"name"
: "mlx5_0"
}
]
}
virtio_fs_doca_get_functions
列出 virtio-fs 的功能及其特性。用户可以不指定参数以列出任何模拟管理器设备管理的所有模拟 virtio-fs 功能,或者指定模拟管理器设备名称以列出由该模拟管理器设备管理的 virtio-fs 功能。
响应示例
{
"jsonrpc"
: "2.0"
,
"id"
: 1
,
"result"
: [
{
"manager"
: "mlx5_0"
,
"Function List"
: [
{
"hot pluggable"
: "false"
,
"pci_address"
: "0000:29:00.2"
,
"vuid"
: "MT2251XZ02WZVFSS0D0F2"
,
"function_type"
: "PF"
}
]
}
]
}
参数名称 | 可选/必需 | 类型 | 描述 |
| 可选 | 字符串 | 模拟管理器设备名称,用于列出特定于它的模拟 virtio-fs 功能 |
virtio_fs_doca_get_possible_managers
列出 virtio-fs 的可能模拟管理器。此方法没有输入参数。
响应示例
{
"jsonrpc"
: "2.0"
,
"id"
: 1
,
"result"
: [
{
"name"
: "mlx5_0"
,
}
]
}
virtio_fs_doca_manager_create
创建 virtio-fs 模拟管理器。
参数名称 | 可选/必需 | 类型 | 描述 |
| 必需 | 字符串 | 模拟管理器设备名称 |
virtio_fs_doca_manager_destroy
销毁 virtio-fs 模拟管理器。
参数名称 | 可选/必需 | 类型 | 描述 |
| 必需 | 字符串 | 模拟管理器设备名称 |
热插拔 PCIe 功能管理
热插拔 PCIe 功能在运行时使用 RPC 动态配置。
以下小节中概述的命令将新的 PCIe 功能热插拔到系统中。
virtio_fs_doca_get_functions
列出 virtio-fs 的 DOCA 传输功能及其特性。
用户可以不指定参数以列出任何模拟管理器设备管理的所有模拟 virtio-fs 功能,或者指定模拟管理器设备名称以列出由特定模拟管理器设备管理的 virtio-fs 功能。
参数名称 | 可选/必需 | 类型 | 描述 |
| 必需 | 字符串 | 用于创建新的 Virtio FS 功能的模拟管理器设备名称 |
virtio_fs_doca_function_create
创建 DOCA virtio FS 功能。此方法的返回值是 VUID。静态功能不需要此操作,因为可以从 virtio_fs_doca_get_functions
检索 VUID。
参数名称 | 可选/必需 | 类型 | 描述 |
| 必需 | 字符串 | 用于创建新的 virtio-fs 功能的模拟管理器设备名称 |
virtio_fs_doca_function_destroy
销毁 DOCA SNAP Virtio-fs 功能。
此功能不应与任何 virtio-fs 设备关联。
参数名称 | 可选/必需 | 类型 | 描述 |
| 必需 | 字符串 | 用于销毁 virtio-fs 功能的模拟管理器设备名称 |
| 必需 | 字符串 | 要销毁的功能的 VUID |
virtio_fs_doca_device_hotplug
热插拔 DOCA SNAP Virtio-fs 设备。必须启动 virtio-fs 设备。
参数名称 | 可选/必需 | 类型 | 描述 |
| 必需 | 字符串 | 要热插拔的 Virtio-fs 设备名称 |
| 可选 | 标志 | 如果使用,该方法将等待直到主机 PCIe 子系统可见该设备。否则,仅发出热插拔操作并退出。 |
virtio_fs_doca_device_hotunplug
热拔出 DOCA virtio FS 设备。必须启动 virtio FS 设备。
参数名称 | 可选/必需 | 类型 | 描述 |
| 必需 | 字符串 | 要热拔出的 Virtio-fs 设备名称 |
| 可选 | 标志 | 如果存在,该方法将等待直到主机 PCIe 子系统不可见该设备。否则,仅发出热拔出操作并退出。 |
SPDK FSdev 模块配置
fsdev_set_opts
设置 SPDK FSdev 模块选项。
参数名称 | 可选/必需 | 类型 | 描述 |
| 必需 | int | SPDK FSdev IO 对象池大小 |
| 必需 | int | SPDK FSdev IO 每个线程的对象缓存大小 |
fsdev_get_opts
获取 SPDK FSdev 模块选项。
SPDK FSDEV 管理
DOCA SNAP Virtio-fs 使用 SPDK 文件系统 (FSdev) 设备框架作为其 virtio-fs 控制器的后端。因此,必须提前创建和配置 SPDK FSdev。
尽管 SPDK FSdev 框架是通用的,并且允许实现不同类型的后端文件系统设备。目前,唯一可用的后端设备是 AIO。这是一种文件系统设备,它使用 Linux 原生异步 I/O 或 POSIX 异步 I/O 提供对本地文件夹的直通访问。
fsdev_get_fsdevs
获取有关 SPDK 文件系统设备 (fsdev) 的信息。用户可以不指定参数以列出所有文件系统设备,也可以按名称指定文件系统设备。
参数名称 | 可选/必需 | 类型 | 描述 |
| 可选 | 字符串 | 感兴趣的 fsdev 的名称 |
fsdev_aio_create
创建 SPDK AIO FSdev ,
参数名称 | 可选/必需 | 类型 | 描述 |
| 必需 | 字符串 | 要创建的 AIO FSdev 的名称 |
| 必需 | 字符串 | 系统目录上要作为 SPDK 文件系统公开的路径 |
| 可选 | 布尔值 | 如果设置为 |
| 可选 | 布尔值 | 如果设置为 |
| 可选 | int | 最大写入大小(以字节为单位);默认为 |
| 可选 | 布尔值 | 如果设置为 注意
仅用于调试目的。 |
fsdev_aio_delete
删除 AIO FSdev 。
参数名称 | 可选/必需 | 类型 | 描述 |
| 必需 | 字符串 | 要删除的 AIO FSdev 的名称 |
Virtio-fs 模拟管理
Virtio-fs 模拟是属于 virtio 设备系列的协议。这些挂载点在虚拟环境中找到,但在设计上看起来像虚拟机内用户的物理挂载点。暴露给主机的每个 virtio-fs 挂载点(例如,virtio-fs PCIe 条目),无论是 PF 还是 VF,都必须由 virtio-fs 控制器支持。
在主机上探测 virtio-fs 驱动程序,而没有已经运行的 virtio-fs 控制器,可能会导致主机挂起,直到成功打开此类控制器(不存在超时机制)。
命令 | 描述 |
创建 virtio-fs 传输 | |
销毁 virtio-fs 传输 | |
启动 virtio-fs 传输 | |
停止 virtio-fs 传输 | |
显示 virtio-fs 传输或请求的传输 | |
创建 virtio-fs 设备 | |
启动 virtio-fs 设备 | |
停止 virtio-fs 设备 | |
销毁 virtio-fs 设备 | |
显示 virtio-fs 设备及其特性 | |
修改从 DOCA 传输创建的 virtio-fs 设备 |
virtio_fs_transport_create
创建 virtio-fs 传输。此 RPC 包括所有传输的通用参数/选项。传输在启动后变为可操作状态。
参数名称 | 可选/必需 | 类型 | 描述 |
| 必需 | 字符串 | 传输类型名称。对于 DOCA SNAP Virtio-fs, |
virtio_fs_transport_destroy
销毁 virtio-fs 传输。
必须停止传输才能销毁。
参数名称 | 可选/必需 | 类型 | 描述 |
| 必需 | 字符串 | 传输类型名称。对于 DOCA SNAP Virtio-fs, |
virtio_fs_transport_start
启动 virtio-fs 传输。此 RPC 完成传输配置。从此时起,传输完全可操作,可用于创建新设备。
参数名称 | 可选/必需 | 类型 | 描述 |
| 必需 | 字符串 | 传输类型名称。对于 DOCA SNAP Virtio-fs, |
virtio_fs_transport_stop
停止 virtio-fs 传输。此 RPC 使传输再次可配置。
如果任何设备与传输关联,则无法停止传输。
参数名称 | 可选/必需 | 类型 | 描述 |
| 必需 | 字符串 | 传输类型名称。对于 DOCA SNAP Virtio-fs, |
virtio_fs_get_transports
显示 virtio-fs 传输或请求的传输。
参数名称 | 可选/必需 | 类型 | 描述 |
| 可选 | 字符串 | 传输类型名称。对于 DOCA SNAP Virtio-fs, |
virtio_fs_device_create
创建 virtio-fs 设备。此 RPC 创建具有通用参数的设备,这些参数对于所有传输类型都是可接受的。要配置特定于传输的参数,用户应使用 virtio_fs_doca_device_modify
命令。设备在启动后变为可操作状态。
参数名称 | 可选/必需 | 类型 | 描述 |
| 必需 | 字符串 | 传输类型名称。对于 DOCA SNAP Virtio-fs, |
| 必需 | 字符串 | 要使用的 Virtio-fs 设备名称 |
| 可选 | 字符串 | 根据 virtio 规范的 Virtio-fs 标签。 注意
必须在 |
| 可选 | 数字 | 根据 virtio 规范的 Virtio-fs |
| 可选 | 数字 | 所有 virtio 队列的最大队列大小(默认值 64,范围 8-256) |
| 可选 | 字符串 | SPDK 文件系统后端设备的名称 注意
必须在
注意
RPC 不会验证 FSdev 是否有效。如果错误的 FSdev 连接到设备,则用户在主机上挂载 FS 时会遇到故障。 |
| 可选 | 布尔值 | 向驱动程序公开打包 virtqueue 功能以进行协商。 |
| 可选 | 字符串 | 设置驱动程序的平台架构。可能的值: 使用 |
| 可选 | 布尔值 | 向驱动程序公开通知 virtqueue 功能以进行协商 |
virtio_fs_device_start
启动 virtio-fs 设备。此 RPC 完成设备配置。从此时起,传输完全可操作。
参数名称 | 可选/必需 | 类型 | 描述 |
| 必需 | 字符串 | Virtio-fs 设备名称 |
virtio_fs_device_stop
停止 virtio-fs 设备。
参数名称 | 可选/必需 | 类型 | 描述 |
| 必需 | 字符串 | Virtio-fs 设备名称 |
流量期间支持 RPC virtio_fs_device_stop
和 virtio_fs_device_start
。用户可以使用 virtio_fs_device_stop
在流量正在进行时停止设备,然后使用 virtio_fs_device_start
重新启动它,并且设备将继续处理 I/O 而不会出现任何错误。
virtio_fs_device_destroy
销毁 virtio-fs 设备。
必须先停止设备,然后才能销毁。
参数名称 | 可选/必需 | 类型 | 描述 |
| 必需 | 字符串 | Virtio-fs 设备名称 |
virtio_fs_device_modify
修改 virtio-fs 设备。此 RPC 用于修改/设置设备的所有传输都可接受的通用属性。
参数名称 | 可选/必需 | 类型 | 描述 |
| 必需 | 字符串 | 要使用的 Virtio-fs 设备名称 |
| 可选 | 字符串 | 根据 virtio 规范的 Virtio-fs 标签 注意
必须在 |
| 可选 | 数字 | 根据 virtio 规范的 Virtio-fs |
| 可选 | 数字 | 所有 virtio 队列的最大队列大小(默认值 64;范围 8-256) |
| 可选 | 字符串 | SPDK 文件系统后端设备的名称 注意
必须在
注意
RPC 不会验证 FSdev 是否有效。如果错误的 FSdev 连接到设备,则用户在主机上挂载 FS 时会遇到故障。 |
| 可选 | 布尔值 | 向驱动程序公开打包 virtqueue 功能以进行协商 |
| 可选 | 字符串 | 设置驱动程序的平台架构。可能的值: 使用 |
virtio_fs_get_devices
显示 virtio-fs 设备及其特性。
用户可以不指定参数以列出与所有传输关联的 virtio-fs 设备
用户可以指定传输的名称以列出与其关联的 virtio-fs 设备
用户可以指定 virtio-fs 设备的名称以显示其特性
传输名称和设备名称参数应互斥。
响应示例
{
"jsonrpc"
: "2.0"
,
"id"
: 1
,
"result"
: [
{
"name"
: "vfsdev0"
,
"transport_name"
: "DOCA"
,
"state"
: "idle"
,
"fsdev"
: "aio0"
,
"tag"
: "docatag"
,
"queue_size"
: 256
,
"num_request_queues"
: 1
,
"packed_ring"
: true
}
]
}
参数名称 | 可选/必需 | 类型 | 描述 |
| 可选 | 字符串 | 要列出其关联的 virtio-fs 设备的传输名称 |
| 可选 | 字符串 | Virtio-fs 设备名称 |
virtio_fs_doca_device_modify
修改从 DOCA 传输创建的 virtio-fs 设备。
此 RPC 用于配置 DOCA 目标特定参数。
参数名称 | 可选/必需 | 类型 | 描述 |
| 必需 | 字符串 | Virtio-fs 设备名称 |
| 可选(必须在启动前提供) | 字符串 | 模拟管理器 |
| 可选(必须在启动前提供) | 字符串 | 供应商唯一标识符 注意
不进行 VUID 验证。如果设置了无效的 VUID,则 |
配置示例
静态功能 – 启动
以下是使用静态物理功能创建 virtio-fs DOCA 传输并将其与 virtio-fs 设备关联的示例。
在 BlueField 中
创建 AIO FSdev 后端
rpc.py fsdev_aio_create aio0 /etc/virtiofs
列出可能的模拟管理器
rpc.py --plugin rpc_virtio_fs_tgt -v virtio_fs_doca_get_possible_managers
创建 DOCA 传输、模拟管理器并启动传输
rpc.py --plugin rpc_virtio_fs_tgt -v virtio_fs_transport_create -t DOCA rpc.py --plugin rpc_virtio_fs_tgt -v virtio_fs_doca_manager_create -m mlx5_0 rpc.py --plugin rpc_virtio_fs_tgt -v virtio_fs_transport_start -t DOCA
获取传输信息
rpc.py --plugin rpc_virtio_fs_tgt -v virtio_fs_get_transports
获取管理器信息
rpc.py --plugin rpc_virtio_fs_tgt -v virtio_fs_doca_get_managers
获取功能信息,包括其 VUID
rpc.py --plugin rpc_virtio_fs_tgt -v virtio_fs_doca_get_functions
创建与 DOCA 传输关联的 virtio-fs 设备
rpc.py --plugin rpc_virtio_fs_tgt -v virtio_fs_device_create --transport-name DOCA --dev-name vfsdev0 --tag doca_test --fsdev aio0 --num-request-queues
8
--queue-size256
--driver-platform x86_64设置和修改 virtio-fs 参数(必须在调用
virtio_fs_device_start
RPC 之前提供 VUID)rpc.py --plugin rpc_virtio_fs_tgt -v virtio_fs_doca_device_modify --dev-name vfsdev0 --manager mlx5_0 --vuid MT2333XZ0VJQVFSS0D0F2
启动 virtio-fs 设备
rpc.py --plugin rpc_virtio_fs_tgt -v virtio_fs_device_start --dev-name vfsdev0
获取设备信息
rpc.py --plugin rpc_virtio_fs_tgt -v virtio_fs_get_devices
在 VM/主机中
要挂载带有标签
docatag
的设备并在未加载时加载virtio_pci
驱动程序mkdir
"/tmp/test"
modprobe -v virtioFS mount -t virtiofs docatag /tmp/test
静态功能 – 关闭
在 BlueField 中
获取设备信息
rpc.py --plugin rpc_virtio_fs_tgt -v virtio_fs_get_devices
停止并销毁 virtio-fs 设备
rpc.py --plugin rpc_virtio_fs_tgt -v virtio_fs_device_stop --dev-name vfsdev0 rpc.py --plugin rpc_virtio_fs_tgt -v virtio_fs_device_destroy --dev-name vfsdev0
停止 DOCA 传输并销毁模拟管理器和传输
rpc.py --plugin rpc_virtio_fs_tgt -v virtio_fs_transport_stop -t DOCA rpc.py --plugin rpc_virtio_fs_tgt -v virtio_fs_doca_manager_destroy -m mlx5_0 rpc.py --plugin rpc_virtio_fs_tgt -v virtio_fs_transport_destroy -t DOCA
在 VM/主机中
要卸载设备
umount /tmp/test modprobe -rv virtiofs
热插拔功能
以下是创建 virtio-fs DOCA 传输、创建 virtio-fs 功能、将其与 virtio-fs 设备关联并热插拔它的示例
在 BlueField 中
创建 AIO FSdev 后端
rpc.py fsdev_aio_create aio0 /etc/virtiofs
列出可能的模拟管理器
rpc.py --plugin rpc_virtio_fs_tgt -v virtio_fs_doca_get_possible_managers
创建 DOCA 传输和模拟管理器并启动传输
rpc.py --plugin rpc_virtio_fs_tgt -v virtio_fs_transport_create -t DOCA rpc.py --plugin rpc_virtio_fs_tgt -v virtio_fs_doca_manager_create -m mlx5_0 rpc.py --plugin rpc_virtio_fs_tgt -v virtio_fs_transport_start -t DOCA
获取传输信息
rpc.py --plugin rpc_virtio_fs_tgt -v virtio_fs_get_transports
获取管理器信息
rpc.py --plugin rpc_virtio_fs_tgt -v virtio_fs_doca_get_managers
一些管理器会显示热插拔功能。
获取功能信息
rpc.py --plugin rpc_virtio_fs_tgt -v virtio_fs_doca_get_functions
创建 virtio-fs 功能
rpc.py --plugin rpc_virtio_fs_tgt -v virtio_fs_doca_function_create --manager mlx5_0
返回 VUID
MT2333XZ0VJQVFSS0D0F2
。获取功能信息
rpc.py --plugin rpc_virtio_fs_tgt -v virtio_fs_doca_get_functions
返回已使用相应 VUID 创建的功能。
创建与 DOCA 传输关联的 virtio-fs 设备
rpc.py --plugin rpc_virtio_fs_tgt -v virtio_fs_device_create --transport-name DOCA --dev-name vfsdev0 --tag doca_test --fsdev aio0 --num-request-queues
8
--queue-size256
--driver-platform x86_64设置和修改 virtio-fs 参数
rpc.py --plugin rpc_virtio_fs_tgt -v virtio_fs_device_create --transport-name DOCA --dev-name vfsdev0 --tag doca_test --fsdev aio0 --num-request-queues
8
--queue-size256
--driver-platform x86_64在调用
virtio_fs_device_start
RPC 之前,必须提供 VUID。启动 virtio FS 设备
rpc.py --plugin rpc_virtio_fs_tgt -v virtio_fs_device_start --dev-name vfsdev0
获取设备信息
rpc.py --plugin rpc_virtio_fs_tgt -v virtio_fs_get_devices
vfsdev0
的输出将显示它尚未插入。将 DOCA 设备热插拔到主机,并等待直到主机可见
rpc.py --plugin rpc_virtio_fs_tgt -v virtio_fs_doca_device_hotplug --dev-name vfsdev0 --wait-
for
-done
在 VM/主机中
要挂载带有标签
docatag
的设备并在未加载时加载virtio_pci
驱动程序mkdir
"/tmp/test"
modprobe -v virtiofs mount -t virtiofs docatag /tmp/test
热拔出功能
以下是清理和销毁“热插拔功能”章节中描述的流程的示例
在 VM/主机中
要卸载设备
umount /tmp/test modprobe -rv virtiofs
在 BlueField 中
获取设备信息
rpc.py --plugin rpc_virtio_fs_tgt -v virtio_fs_get_devices
从主机热拔出 DOCA 设备,并等待直到主机不可见
rpc.py --plugin rpc_virtio_fs_tgt -v virtio_fs_doca_device_hotunplug --dev-name vfsdev0 --wait-
for
-done获取设备信息
rpc.py --plugin rpc_virtio_fs_tgt -v virtio_fs_get_devices
停止并销毁 virtio-fs DOCA 设备
rpc.py --plugin rpc_virtio_fs_tgt -v virtio_fs_device_stop --dev-name vfsdev0 rpc.py --plugin rpc_virtio_fs_tgt -v virtio_fs_device_destroy --dev-name vfsdev0
销毁 virtio-fs 功能
rpc.py --plugin rpc_virtio_fs_tgt -v virtio_fs_doca_function_destroy --manager mlx5_0 --vuid MT2333XZ0VJQVFSS0D0F2
停止 DOCA 传输并销毁仿真管理器和传输
rpc.py --plugin rpc_virtio_fs_tgt -v
virtio_fs_transport_stop -t DOCA
rpc.py --plugin rpc_virtio_fs_tgt -v
virtio_fs_doca_manager_destroy -m mlx5_0
rpc.py --plugin rpc_virtio_fs_tgt -v
virtio_fs_transport_destroy -t DOCA
保存和加载配置
要恢复和重用 virtio-fs 的配置,您可以保存所需的配置,并在以后使用已保存的配置文件加载它。此过程允许快速恢复并确保设备/应用程序设置的一致性。
保存 virtio-fs 设备的配置
使用 RPC 根据需要配置您的 virtio-fs 设备/应用程序。
在每个配置周期后使用
save_config
RPC 保存配置。这将创建一个 JSON 配置文件以供将来使用spdk_rpc.py save_config -o <json_config>.json
要启动配置周期,请使用与 spdk_rpc_init.conf
文件相同的格式创建一个新的配置文件
cat
<new_config>.conf | spdk_rpc.py
<new_config>.conf
文件的最后一行必须包含对保存 RPC 配置的调用。示例
--plugin rpc_virtio_fs_tgt -v
fsdev_aio_create aio0 /tmp/fsdev-test
--plugin rpc_virtio_fs_tgt -v
virtio_fs_transport_create -t DOCA
--plugin rpc_virtio_fs_tgt -v
virtio_fs_transport_start -t DOCA
--plugin rpc_virtio_fs_tgt -v
virtio_fs_device_create --transport-name DOCA --dev-name vfsdev0 --tag docatest --fsdev aio0 --num-request-queues 1 --queue-size 256 --driver-platform x86_64
--plugin rpc_virtio_fs_tgt -v
virtio_fs_doca_device_modify --dev-name vfsdev0 --manager mlx5_0 --vuid MT2306XZ00HKVFSS0D0F4
--plugin rpc_virtio_fs_tgt -v
virtio_fs_device_start --dev-name vfsdev0
save_config -o <json_config>.json
在脚本末尾保存配置可确保仅在成功应用所有脚本更改后才保存配置。
要加载 virtio-fs 的已保存配置,请根据您的环境使用以下方法
当从容器中使用 virtio-fs 时,在 YAML 配置文件中设置以下内容
SPDK_RPC_INIT_CONF_JSON: <json_config>.json APP_ARGS: --json-ignore-init-errors
当从源代码中使用 virtio-fs 时,重新运行 DOCA SNAP Virtio-fs 应用程序,从已保存的文件中恢复配置
/opt/nvidia/spdk-subsystem/src/virtio-fs-target/app/virtio_fs_tgt -c <json_config>.json --json-ignore-init-errors
当修改控制器/功能配置时,请确保在配置更改完全应用之前,主机驱动程序保持卸载状态。否则,如果更改不完整或中断,配置恢复可能会失败。
禁用/启用 SPDK 子系统
Virtio-fs 被定义为 SPDK 子系统,可以根据需要禁用或启用。
Virtio-fs 子系统默认启用。要禁用它
在等待 RPC 命令的状态下启动 Virtio-fs 应用程序
/opt/nvidia/spdk-subsystem/src/virtio-fs-target/app/virtio_fs_tgt --wait-
for
-rpc使用以下 RPC 命令禁用
virtio_fs
子系统spdk_rpc.py framework_disable_subsystem virtio_fs
重新启动 SPDK 框架初始化
spdk_rpc.py framework_start_init
要查看所有子系统的状态
spdk_rpc.py framework_get_subsystems
此子系统配置可以保存在 SPDK 配置中,以便将来使用命令 spdk_rpc.py save_config
。这确保了配置在应用程序重启后仍然存在。
在配置 DOCA SNAP Virtio-fs 之前,用户必须确保满足所有固件配置要求。默认情况下,virtio-fs 处于禁用状态,必须通过运行通用的 DOCA SNAP Virtio-fs 配置和额外的协议特定配置来启用,具体取决于应用程序的预期用途(例如,热插拔、SR-IOV、UEFI 启动等)。
配置完成后,必须对主机进行电源循环,以使更改生效。
要验证是否满足所有配置要求,用户可以运行以下命令查询当前/下一个配置
mlxconfig -d /dev/mst/mt41692_pciconf0 -e query
系统配置参数
参数 | 描述 | 可能的值 |
| 启用 BlueField 在内部 CPU 模型中工作 注意
对于存储仿真,必须设置为 | 0/1 |
| 为仿真的 PF 启用 PCIe 交换机 | 0/1 |
| 热插拔仿真 PF 的最大数量,等于 注意
一个交换机端口为所有静态 PF 保留。 | [0-32] |
RDMA/RoCE 配置
BlueField 的 RDMA/RoCE 通信对于 BlueField 的默认 OS 接口(命名为 ECPF,通常为 mlx5_0 和 mlx5_1)被阻止。如果需要 RoCE 流量,则必须添加支持 RDMA/RoCE 流量的额外网络功能(可扩展功能)。
当通过 TCP 甚至 RDMA/IB 工作时,不需要以下内容。
要启用 RoCE 接口,请从 BlueField 设备内部运行以下命令
[dpu] mlxconfig -d /dev/mst/mt41692_pciconf0 s PER_PF_NUM_SF=1
[dpu] mlxconfig -d /dev/mst/mt41692_pciconf0 s PF_SF_BAR_SIZE=8 PF_TOTAL_SF=2
[dpu] mlxconfig -d /dev/mst/mt41692_pciconf0.1 s PF_SF_BAR_SIZE=8 PF_TOTAL_SF=2
Virtio-fs 配置
由于 virtio-fs 协议的限制,在使用静态 virtio-fs PF 时使用错误的配置可能会导致主机服务器 OS 启动失败。
在继续之前,请确保您已配置
即使主机关闭时也可以访问 Arm 的工作通道。设置此类通道不属于本文档的范围。有关更多详细信息,请参阅 NVIDIA BlueField DPU BSP 文档。
使用初始配置文件在静态 virtio-fs PF 上创建控制器。
信息有关更多信息,请参阅“Virtio-fs 仿真管理”章节
参数 | 描述 | 可能的值 |
| 启用 virtio-fs 设备仿真 | 0/1 |
| 静态仿真的 virtio-fs PF 的数量 注意
请参阅上面的警告。 | [0-2] |
| 分配给仿真的 virtio-fs PF/VF 的 MSIX 数量 | [0-63] |
在使用主机操作系统上的 Linux 环境时,可能需要额外的内核启动参数来支持 DOCA SNAP Virtio-fs 相关功能
要使用 PCIe 热插拔,必须添加
pci=realloc
对于非内置的 virtio-fs 驱动程序,
modprobe.blacklist=virtio_pci,virtiofs
对于非内置的
virtio_pci
驱动程序,modprobe.blacklist=virtio_pci
要查看启动参数值,请运行
cat /proc/cmdline
建议将以下命令与 virtio-fs 一起使用
[dpu] cat /proc/cmdline BOOT_IMAGE … pci=realloc modprobe.blacklist=virtio_pci,virtiofs
英特尔服务器性能优化
cat /proc/cmdline
BOOT_IMAGE=(hd0,msdos1)/vmlinuz-5.15.0_mlnx root=UUID=91528e6a-b7d3-4e78-9d2e-9d5ad60e8273 ro crashkernel=auto resume=UUID=06ff0f35-0282-4812-894e-111ae8d76768 rhgb quiet pci=realloc modprobe.blacklist=virtio_pci,virtiofs
AMD 服务器性能优化
cat /proc/cmdline
cat /proc/cmdline BOOT_IMAGE=(hd0,msdos1)/vmlinuz-5.15.0_mlnx root=UUID=91528e6a-b7d3-4e78-9d2e-9d5ad60e8273 ro crashkernel=auto resume=UUID=06ff0f35-0282-4812-894e-111ae8d76768 rhgb quiet pci=realloc modprobe.blacklist=virtio_pci,virtiofs
本节介绍如何使用自定义 fsdev 模块扩展 Virtio-fs 服务。提供了两种方法
构建新的生产容器(推荐用于生产环境)
在开发容器内手动构建和运行(非常适合开发和测试)
本章中提供的 Dockerfile 和命令仅作为示例,旨在与 SPDK 附带的外部 fsdev 模块示例一起使用,该示例位于 spdk/test/external_code/fsdev_passthru
。这些示例演示了集成过程,应进行调整以适应实际用例,包括针对自定义 fsdev 模块、部署环境和特定应用程序要求的调整。
构建新的生产容器
此选项允许创建包含原始服务和自定义 fsdev 模块的新容器。生成的容器将运行内置自定义功能的 Virtio-fs 服务。
环境准备
# Current working directory contain spdk sources (repo - https://github.com/Mellanox/spdk; branch - v24.01.4.nvda) and Dockerfile
git clone https://github.com/Mellanox/spdk --branch v24.01.4.nvda
root@bf:/opt/build# pwd
/opt/build
root@bf:/opt/build# ll
total 16
drwxr-xr-x 3 root root 4096 Dec 2 14:16 ./
drwxr-xr-x 6 root root 4096 Dec 2 13:30 ../
-rw-r--r-- 1 root root 723 Dec 2 14:15 Dockerfile
drwxr-xr-x 37 root root 4096 Dec 2 14:01 spdk/
Dockerfile 示例
FROM nvcr.io/nvstaging/doca/doca_vfs:1.2.0-2-doca2.10.0 as builder
RUN apt-get update && apt-get install -y autoconf libtool python3-pyelftools libaio-dev libncurses-dev libfuse3-dev patchelf libcmocka-dev make
COPY spdk/test/external_code /external_code
WORKDIR /external_code
ENV SPDK_HEADER_DIR=/opt/nvidia/spdk-subsystem/virtiofs/include
ENV SPDK_LIB_DIR=/opt/nvidia/spdk-subsystem/virtiofs/lib
ENV DPDK_LIB_DIR=/opt/nvidia/spdk-subsystem/virtiofs/include
RUN make fsdev_passthru_shared
FROM nvcr.io/nvstaging/doca/doca_vfs:1.2.0-2-doca2.10.0
COPY --from=builder /external_code/fsdev_passthru/libfsdev_passthru_external.so /opt/nvidia/spdk-subsystem/virtiofs/lib/
ENV VIRTIOFS_LD_PRELOAD=/opt/nvidia/spdk-subsystem/virtiofs/lib/libfsdev_passthru_external.so
COPY --from=builder /external_code/fsdev_passthru/fsdev_passthru.py /usr/lib/python3/dist-packages/spdk/rpc/
ENV SPDK_RPC_PLUGIN="spdk.rpc.rpc_virtio_fs_tgt:spdk.rpc.fsdev_passthru"
构建和运行容器
构建新的容器
docker build -t doca_vfs_custom_fsdev:latest -f Dockerfile .
使用 Kubelet 服务运行新的容器
docker save doca_vfs_custom_fsdev:latest > doca_vfs_custom_fsdev.
tar
ctr -n=k8s.io imagesimport
doca_vfs_custom_fsdev.tar
# Copy doca_vfs.yaml into /etc/kubelet.d/
# Open doca_vfs.yaml and change "image" section:
image: doca_vfs_custom_fsdev:latest配置运行自定义 fsdev 模块的容器
# DPU
mkdir
/etc/virtiofs/AIO0 crictlexec
$(crictlps
-s running -q --name virtiofs) spdk_rpc.py fsdev_aio_create AIO0 /etc/virtiofs/AIO0 crictlexec
$(crictlps
-s running -q --name virtiofs) spdk_rpc.py fsdev_passthru_ext_create --name CUSTOM_FSDEV_PT0 --base-fsdev-name AIO0 crictlexec
$(crictlps
-s running -q --name virtiofs) spdk_rpc.py virtio_fs_transport_create -t DOCA crictlexec
$(crictlps
-s running -q --name virtiofs) spdk_rpc.py virtio_fs_doca_manager_create -m mlx5_0 crictlexec
$(crictlps
-s running -q --name virtiofs) spdk_rpc.py virtio_fs_transport_start -t DOCA crictlexec
$(crictlps
-s running -q --name virtiofs) spdk_rpc.py virtio_fs_device_create --transport-name DOCA --dev-name vfsdev0 --tag CUSTOM_FSDEV_PT0 --fsdev CUSTOM_FSDEV_PT0 --num-request-queues 62 --queue-size 64 --driver-platform x86_64 crictlexec
$(crictlps
-s running -q --name virtiofs) spdk_rpc.py virtio_fs_doca_device_modify --dev-name vfsdev0 --manager mlx5_0 --vuid MT2334XZ0LEDVFSS0D0F3 crictlexec
$(crictlps
-s running -q --name virtiofs) spdk_rpc.py virtio_fs_device_start --dev-name vfsdev0# x86
modprobe -v
virtio_pci modprobe -v
virtiofstest
-d /tmp/CUSTOM_FSDEV_PT0 ||mkdir
-p /tmp/CUSTOM_FSDEV_PT0mount
-t virtiofs CUSTOM_FSDEV_PT0 /tmp/CUSTOM_FSDEV_PT0
在开发容器中手动构建和运行
此方法适用于需要频繁更新、构建和测试的开发工作流程。它设置了一个开发容器,其中包含手动构建和运行带有自定义 fsdev 模块的 Virtio-fs 服务所需的环境。
环境准备
# Current working directory contain spdk sources (repo - https://github.com/Mellanox/spdk; branch - v24.01.4.nvda) and Dockerfile
git clone https://github.com/Mellanox/spdk --branch v24.01.4.nvda
root@bf:/opt/build# pwd
/opt/build
root@bf:/opt/build# ll
total 16
drwxr-xr-x 3 root root 4096 Dec 2 14:16 ./
drwxr-xr-x 6 root root 4096 Dec 2 13:30 ../
-rw-r--r-- 1 root root 723 Dec 2 14:15 Dockerfile
drwxr-xr-x 37 root root 4096 Dec 2 14:01 spdk/
Dockerfile 示例
FROM nvcr.io/nvstaging/doca/doca_vfs:1.2.0-2-doca2.10.0 as builder
RUN apt-get update && apt-get install -y autoconf libtool python3-pyelftools libaio-dev libncurses-dev libfuse3-dev patchelf libcmocka-dev make
ENTRYPOINT /bin/bash
构建和运行开发容器
使用提供的
Dockerfile
构建容器docker build -t doca_vfs_custom_fsdev_dev:latest -f Dockerfile .
启动容器并进入 bash shell
docker run -ti --privileged --net=host \ --volume /dev/hugepages:/dev/hugepages \ --volume /dev/shm:/dev/shm \ --volume /dev/infiniband:/dev/infiniband \ --volume /etc/virtiofs:/etc/virtiofs \ --volume ${PWD}/spdk/test/external_code:/external_code \ doca_vfs_custom_fsdev_dev:latest
进入容器后,可以手动构建和测试自定义模块
cd
/external_code/export
SPDK_HEADER_DIR=/opt/nvidia/spdk-subsystem/virtiofs/includeexport
SPDK_LIB_DIR=/opt/nvidia/spdk-subsystem/virtiofs/libexport
DPDK_LIB_DIR=/opt/nvidia/spdk-subsystem/virtiofs/includemake
fsdev_passthru_shared启动带有自定义模块的 virtio-fs 服务进行测试
cp
/external_code/fsdev_passthru/fsdev_passthru.py /usr/bin/ /opt/nvidia/spdk-subsystem/doca_snap/bin/set_environment_variables.sh LD_PRELOAD=/external_code/fsdev_passthru/libfsdev_passthru_external.so \ /opt/nvidia/spdk-subsystem/virtiofs/bin/virtio_fs_tgt -m 0xff &配置带有自定义 fsdev 模块的服务
# DPU
mkdir
/etc/virtiofs/AIO0 spdk_rpc.py fsdev_aio_create AIO0 /etc/virtiofs/AIO0 spdk_rpc.py --plugin fsdev_passthru fsdev_passthru_ext_create --name CUSTOM_FSDEV_PT0 --base-fsdev-name AIO0 spdk_rpc.py virtio_fs_transport_create -t DOCA spdk_rpc.py virtio_fs_doca_manager_create -m mlx5_0 spdk_rpc.py virtio_fs_transport_start -t DOCA spdk_rpc.py virtio_fs_device_create --transport-name DOCA --dev-name vfsdev0 --tag CUSTOM_FSDEV_PT0 --fsdev CUSTOM_FSDEV_PT0 --num-request-queues 62 --queue-size 64 --driver-platform x86_64 spdk_rpc.py virtio_fs_doca_device_modify --dev-name vfsdev0 --manager mlx5_0 --vuid MT2334XZ0LEDVFSS0D0F2 spdk_rpc.py virtio_fs_device_start --dev-name vfsdev0# x86
modprobe -v
virtio_pci modprobe -v
virtiofstest
-d /tmp/CUSTOM_FSDEV_PT0 ||mkdir
-p /tmp/CUSTOM_FSDEV_PT0mount
-t virtiofs CUSTOM_FSDEV_PT0 /tmp/CUSTOM_FSDEV_PT0
标题 | 描述 |
NVIDIA DOCA™ SDK 使开发人员能够基于 NVIDIA® BlueField® 网络平台快速创建应用程序和服务,从而利用行业标准 API | |
BlueField 板级支持包包括用于加载和设置软件组件的引导加载程序和其他基本组件 | |
本文档详细介绍了 BlueField DPU 的接口、规格、操作设备所需的软件和固件,以及启动 DPU 的分步计划 | |
本文档提供了产品发行说明,以及有关 BlueField 软件发行版以及如何为 BlueField 平台开发和/或自定义应用程序、系统软件和文件系统映像的信息 | |
DOCA 设备仿真库文档。DOCA 设备仿真子系统为用户开发 PCIe 设备及其控制器提供了低级软件 API。 | |
DOCA 设备仿真 Virtio-fs 库文档。DOCA DevEmu Virtio-fs 库是 DOCA DevEmu Virtio 子系统的一部分。它提供了低级软件 API,这些 API 为使用 BlueField 平台的设备仿真功能开发和操作 virtio 文件系统设备提供了构建块。 | |
DOCA 设备仿真 PCI 库文档。DOCA DevEmu PCI 是 DOCA 设备仿真子系统的一部分。它提供了低级软件 API,允许使用 NVIDIA® BlueField® 网络平台的仿真功能管理仿真的 PCIe 设备。 |