SPDK安装与使用

1 安装 FIO

为了便于对 SPDK 进行测试,需要集成 FIO。根据文档,需要先手动编译安装 FIO

1.1 下载 FIO 源码

1
git clone https://github.com/axboe/fio

1.2 编译安装

1
2
3
./configure
make
make install

2 配置 SPDK

2.1 下载 SPDK 源码

1
2
3
git clone https://github.com/spdk/spdk
cd spdk
git submodule update --init

2.2 编译 SPDK

安装依赖

1
./scripts/pkgdep.sh

编译

1
2
./configure --with-fio=/path/to/fio
make

2.3 修改 FEMU(Optional)

如果使用 FEMU 模拟固态盘,由于 FEMU 中对 NVMe 协议的部分 Admin 命令没有进行实现,需要自行完善。以下方法仅用于暂时屏蔽问题。

1
2
3
4
5
6
7
8
9
10
11
--- a/hw/femu/nvme-admin.c
+++ b/hw/femu/nvme-admin.c
@@ -999,6 +999,8 @@ static uint16_t nvme_admin_cmd(FemuCtrl *n, NvmeCmd *cmd, NvmeCqe *cqe)
case NVME_ADM_CMD_SET_DB_MEMORY:
femu_debug("admin cmd,set_db_memory\n");
return nvme_set_db_memory(n, cmd);
+ case NVME_ADM_CMD_ASYNC_EV_REQ:
+ return NVME_SUCCESS;
case NVME_ADM_CMD_ACTIVATE_FW:
case NVME_ADM_CMD_DOWNLOAD_FW:
case NVME_ADM_CMD_SECURITY_SEND:

2.4 运行

2.4.1 设备初始化

1
2
cd /path/to/spdk
sudo scripts/setup.sh

2.4.2 生成配置文件

1
sudo scripts/gen_nvme.sh --json-with-subsystems > nvme.json

以具有两个 NVMe 设备的系统为例,生成结果如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
{
"subsystems": [
{
"subsystem": "bdev",
"config": [
{
"method": "bdev_nvme_attach_controller",
"params": {
"trtype": "PCIe",
"name": "Nvme0",
"traddr": "0000:00:06.0"
}
},
{
"method": "bdev_nvme_attach_controller",
"params": {
"trtype": "PCIe",
"name": "Nvme1",
"traddr": "0000:00:07.0"
}
}
]
}
]
}

2.4.3 启动 spdk

方法一(指定配置文件启动)

1
2
3
cd /path/to/spdk
sudo scripts/setup.sh
sudo build/bin/spdk_tgt --json nvme.json

方法二(RPC 命令创建设备)

1
2
3
4
#First shell
cd /path/to/spdk
sudo scripts/setup.sh
sudo build/bin/spdk_tgt
1
2
3
#Second shell
#具体参数值可根据gen_nvme.sh的生成结果来设置
sudo scripts/rpc.py bdev_nvme_attach_controller -b nvme1 -a 00:06.0 -t pcie

如果需要帮助信息,可以通过-h参数来查看

sudo scripts/rpc.py -h

sudo scripts/rpc.py bdev_nvme_attach_controller -h

检查设备是否创建成功,可使用 SPDK 提供的 client 程序进行查看:

1
sudo scripts/spdkcli.py ls

更多工具,可查看 SPDK 项目中的 scripts 子目录


SPDK安装与使用
https://zdawng.github.io/posts/a948432a/
作者
ZDawnG
发布于
2023年7月9日
许可协议