2025-05-09
文件系统
0

目录

一、编译、安装spdk
1.1、下载
1.2、配置设备
二、服务端配置
三、客户端配置

使用SPDK NVMe of RDMA 实现多NVMe设备共享

一、编译、安装spdk

1.1、下载

1.1.1 下载spdk源码 首先,我们需要从GitHub上克隆SPDK的源码仓库。打开终端,输入以下命令:

bash
git clone -b v22.01 https://github.com/spdk/spdk.git cd spdk

1.1.2 下载子模块

接下来,我们需要初始化并更新SPDK的子模块。

bash
git submodule update --init

1.1.3 安装依赖

为了确保编译过程顺利进行,我们需要安装SPDK所需的依赖项。运行以下命令来自动安装这些依赖:

bash
sudo ./scripts/pkgdep.sh

1.1.4 编译

现在,我们开始编译SPDK。

bash
./configure --with-rdma --with-shared sudo make

1.1.5 执行单元测试

编译完成后,我们需要运行单元测试来验证SPDK是否安装成功。

bash
./test/unit/unittest.sh

最后如果输出 all unit test passed,代SPDK安装成功

image.png

1.2、配置设备

1.2.1 绑定设备

在开始之前,我们需要将NVMe设备绑定到SPDK。运行以下命令来完成绑定:

bash
sudo scripts/setup.sh # 正确结果: # 0000:0b:00.0 (15ad 07f0): nvme -> uio_pci_generic # 查看状态 sudo ./scripts/setup.sh status # 解绑设备 sudo ./scripts/setup.sh reset

image.png

0000:b4:00.00000:b5:00.0是设备编号,下面会用到

二、服务端配置

  1. 启动 nvmf_tgt

在服务端,我们需要启动nvmf_tgt来提供NVMe over Fabrics服务。打开一个新的终端,运行以下命令:

bash
build/bin/nvmf_tgt

终端将输出类似以下的内容:

plain
[zhousk@slave02 spdk]$ build/bin/nvmf_tgt -i 0 [2025-04-28 19:26:00.347292] Starting SPDK v22.01 git sha1 47737f1 / DPDK 21.11.0 initialization... [2025-04-28 19:26:00.347451] [ DPDK EAL parameters: [2025-04-28 19:26:00.347487] nvmf [2025-04-28 19:26:00.347515] -c 0x1 [2025-04-28 19:26:00.347543] --log-level=lib.eal:6 [2025-04-28 19:26:00.347567] --log-level=lib.cryptodev:5 [2025-04-28 19:26:00.347623] --log-level=user1:6 [2025-04-28 19:26:00.347651] --base-virtaddr=0x200000000000 [2025-04-28 19:26:00.347709] --match-allocations [2025-04-28 19:26:00.347737] --file-prefix=spdk0 [2025-04-28 19:26:00.347789] --proc-type=auto [2025-04-28 19:26:00.347815] ] EAL: No available 1048576 kB hugepages reported EAL: No free 2048 kB hugepages reported on node 1 TELEMETRY: No legacy callbacks, legacy socket not created [2025-04-28 19:26:00.532151] app.c: 601:spdk_app_start: *NOTICE*: Total cores available: 1 [2025-04-28 19:26:00.673833] reactor.c: 943:reactor_run: *NOTICE*: Reactor started on core 0 [2025-04-28 19:26:00.673911] accel_engine.c: 510:spdk_accel_engine_initialize: *NOTICE*: Accel engine initialized to use software engine.
  1. 在另一个终端,使用rpc.py脚本来配置NVMe over Fabrics
bash
# 1. 启动 RDMA scripts/rpc.py nvmf_create_transport -t RDMA -u 8192 -i 131072 -c 8192 # 2. 将 NVMe 控制器附加到 SPDK 的块设备层 # 0000:b4:00.0 是上文的 BDF ./scripts/rpc.py bdev_nvme_attach_controller -b NVMe1 -t PCIe -a 0000:b4:00.0 # output: NVMe1n1 # 3. 创建 subsystem # cnode1、SPDK00000000000001 可以自定义 ./scripts/rpc.py nvmf_create_subsystem nqn.2016-06.io.spdk:cnode1 -a -s SPDK00000000000001 -d SPDK_Controller1 # 4. 添加 namespace ./scripts/rpc.py nvmf_subsystem_add_ns nqn.2016-06.io.spdk:cnode1 NVMe1n1 # NVMe1n1 是 2 中的输出 # 5. 添加监听 # -a 是本机 ip,-s 是端口,可修改 ./scripts/rpc.py nvmf_subsystem_add_listener nqn.2016-06.io.spdk:cnode1 -t rdma -a 192.168.200.202 -s 4420 -f ipv4 # 获取 subsystem 信息 ./scripts/rpc.py nvmf_get_subsystems # 下面是删除操作(可选) # 删除 subsystem ./scripts/rpc.py nvmf_delete_subsystem nqn.2016-06.io.spdk:cnode1 # 删除 ns # ns_id 通过 nvmf_get_subsystems 获取 ./scripts/rpc.py nvmf_remove_ns <nsid> # 移除监听 ./scripts/rpc.py nvmf_subsystem_remove_listener nqn.2016-06.io.spdk:cnode1 -t rdma -a 192.168.200.202 -s 4420
  1. 获取 subsystem 信息
json
./scripts/rpc.py nvmf_get_subsystems

输出下面这些信息

json
[ { "nqn": "nqn.2014-08.org.nvmexpress.discovery", "subtype": "Discovery", "listen_addresses": [], "allow_any_host": true, "hosts": [] }, { "nqn": "nqn.2016-06.io.spdk:cnode1", "subtype": "NVMe", "listen_addresses": [ { "transport": "RDMA", "trtype": "RDMA", "adrfam": "IPv4", "traddr": "192.168.200.202", "trsvcid": "4420" } ], "allow_any_host": true, "hosts": [], "serial_number": "SPDK00000000000001", "model_number": "SPDK_Controller1", "max_namespaces": 32, "min_cntlid": 1, "max_cntlid": 65519, "namespaces": [ { "nsid": 1, "bdev_name": "NVMe1n1", "name": "NVMe1n1", "nguid": "35354A30581000030025384700000003", "uuid": "35354a30-5810-0003-0025-384700000003" } ] } ]

此时 nvmf_tgt 显示

[2025-04-28 19:26:24.621233] rdma.c:2668:nvmf_rdma_listen: NOTICE: *** NVMe/RDMA Target Listening on 192.168.200.202 port 4420 ***

这样就完成了!!!

三、客户端配置

在客户端,我们可以使用SPDK自带的测试工具来验证NVMe over Fabrics的配置是否成功。

plain
./build/examples/perf -r 'trtype:RDMA adrfam:IPv4 traddr:192.168.200.202 trsvcid:4420' -q 128 -o 4096 -w read -t 10

image.png

如果对你有用的话,可以打赏哦
打赏
ali pay
wechat pay

本文作者:司小远

本文链接:

版权声明:本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!