SPDK模块目录分析文档

SPDK模块目录分析文档

目录

  1. 概述
  2. 模块架构
  3. 块设备模块(BDEV)
  4. 加速器模块(ACCEL)
  5. Blob存储模块
  6. Blob文件系统模块
  7. 事件子系统模块
  8. Socket模块
  9. 环境模块
  10. 模块注册机制
  11. 模块依赖关系

概述

SPDK模块目录的作用

module 目录是SPDK的模块化实现目录,包含了各种功能模块的实现。这些模块通过SPDK的模块注册机制动态加载和集成到系统中。

模块分类

根据 module/Makefile 的定义,主要模块包括:

  • bdev: 块设备模块(最多样化的模块集合)
  • blob: Blob存储模块
  • blobfs: Blob文件系统模块
  • accel: 加速器模块
  • event: 事件子系统模块
  • sock: Socket抽象模块
  • env_dpdk: DPDK环境模块(条件编译)

模块依赖关系

1
2
3
event → bdev, blob
blobfs → blob
bdev → blob

模块架构

模块结构

每个模块通常包含以下组件:

  1. 核心实现文件 (.c): 模块的主要功能实现
  2. 头文件 (.h): 模块的接口定义
  3. RPC文件 (*_rpc.c): JSON-RPC接口实现
  4. Makefile: 构建配置

模块注册机制

SPDK使用模块注册机制来管理各种功能模块:

1
2
3
4
5
6
7
8
9
10
// 块设备模块注册
static struct spdk_bdev_module bdev_module = {
.name = "module_name",
.module_init = module_init_fn,
.module_fini = module_fini_fn,
.config_text = module_config_fn,
.get_ctx_size = module_get_ctx_size,
};

SPDK_BDEV_MODULE_REGISTER(bdev_module)

块设备模块(BDEV)

块设备模块是SPDK中最丰富的模块集合,提供了各种块设备的实现和虚拟化功能。

核心块设备模块

1. NVMe块设备模块 (bdev/nvme)

功能: 将NVMe设备暴露为SPDK块设备

主要文件:

  • bdev_nvme.c: NVMe块设备实现
  • bdev_nvme.h: 接口定义
  • bdev_nvme_rpc.c: RPC接口
  • bdev_ocssd.c: Open Channel SSD支持
  • bdev_opal.c: Opal安全功能支持

关键特性:

  • 支持标准NVMe命名空间
  • 支持Open Channel SSD (OCSSD)
  • 支持NVMe-oF (网络NVMe)
  • 支持热插拔监控
  • 支持超时处理和重试
  • 支持优先级仲裁
  • 支持保护信息(PI)验证

数据结构:

1
2
3
4
5
6
7
8
9
10
11
12
13
struct spdk_bdev_nvme_opts {
enum spdk_bdev_timeout_action action_on_timeout;
uint64_t timeout_us;
uint32_t retry_count;
uint32_t arbitration_burst;
uint32_t low_priority_weight;
uint32_t medium_priority_weight;
uint32_t high_priority_weight;
uint64_t nvme_adminq_poll_period_us;
uint64_t nvme_ioq_poll_period_us;
uint32_t io_queue_requests;
bool delay_cmd_submit;
};

主要函数:

  • bdev_nvme_create(): 创建NVMe块设备
  • bdev_nvme_delete(): 删除NVMe控制器
  • bdev_nvme_get_io_qpair(): 获取IO队列对
  • bdev_nvme_set_hotplug(): 设置热插拔监控

2. Malloc块设备模块 (bdev/malloc)

功能: 在内存中创建虚拟块设备,用于测试和开发

主要文件:

  • bdev_malloc.c: Malloc块设备实现
  • bdev_malloc.h: 接口定义
  • bdev_malloc_rpc.c: RPC接口

关键特性:

  • 纯内存块设备
  • 支持动态创建和删除
  • 支持UUID
  • 用于性能测试和功能验证

主要函数:

  • create_malloc_disk(): 创建malloc磁盘
  • delete_malloc_disk(): 删除malloc磁盘

3. Null块设备模块 (bdev/null)

功能: 空块设备,丢弃所有写入,读取返回零

主要文件:

  • bdev_null.c: Null块设备实现
  • bdev_null.h: 接口定义
  • bdev_null_rpc.c: RPC接口

关键特性:

  • 丢弃所有写入操作
  • 读取操作返回零
  • 用于性能基准测试
  • 支持可配置的块大小和块数

4. AIO块设备模块 (bdev/aio) [Linux only]

功能: 将Linux AIO块设备暴露为SPDK块设备

主要文件:

  • bdev_aio.c: AIO块设备实现
  • bdev_aio.h: 接口定义
  • bdev_aio_rpc.c: RPC接口

关键特性:

  • 支持Linux异步I/O
  • 可以访问传统块设备(如 /dev/sda
  • 用于与传统存储系统集成

5. PMEM块设备模块 (bdev/pmem) [Linux only]

功能: 将持久化内存(PMEM)设备暴露为SPDK块设备

主要文件:

  • bdev_pmem.c: PMEM块设备实现
  • bdev_pmem.h: 接口定义
  • bdev_pmem_rpc.c: RPC接口

关键特性:

  • 支持Intel Optane持久化内存
  • 字节可寻址的持久化存储
  • 低延迟访问

6. iSCSI Initiator块设备模块 (bdev/iscsi)

功能: 将iSCSI目标暴露为SPDK块设备

主要文件:

  • bdev_iscsi.c: iSCSI块设备实现
  • bdev_iscsi.h: 接口定义
  • bdev_iscsi_rpc.c: RPC接口

关键特性:

  • iSCSI协议支持
  • 网络存储访问
  • 支持CHAP认证

7. Virtio块设备模块 (bdev/virtio) [Linux only]

功能: 将Virtio设备暴露为SPDK块设备

主要文件:

  • bdev_virtio_blk.c: Virtio BLK设备
  • bdev_virtio_scsi.c: Virtio SCSI设备
  • bdev_virtio.h: 接口定义
  • bdev_virtio_rpc.c: RPC接口

关键特性:

  • 支持Virtio BLK
  • 支持Virtio SCSI
  • 用于虚拟化环境

8. RBD块设备模块 (bdev/rbd) [条件编译]

功能: 将Ceph RBD设备暴露为SPDK块设备

主要文件:

  • bdev_rbd.c: RBD块设备实现
  • bdev_rbd.h: 接口定义
  • bdev_rbd_rpc.c: RPC接口

关键特性:

  • Ceph RBD集成
  • 分布式存储支持

9. io_uring块设备模块 (bdev/uring) [条件编译]

功能: 使用Linux io_uring接口访问块设备

主要文件:

  • bdev_uring.c: io_uring块设备实现
  • bdev_uring.h: 接口定义
  • bdev_uring_rpc.c: RPC接口

关键特性:

  • 使用Linux io_uring高性能接口
  • 异步I/O支持

虚拟块设备模块

1. 逻辑卷模块 (bdev/lvol)

功能: 在Blobstore上创建逻辑卷

主要文件:

  • vbdev_lvol.c: 逻辑卷实现
  • vbdev_lvol.h: 接口定义
  • vbdev_lvol_rpc.c: RPC接口

关键特性:

  • 基于Blobstore的逻辑卷管理
  • 支持快照和克隆
  • 支持精简配置(Thin Provisioning)
  • 支持在线调整大小
  • 支持只读模式

主要函数:

  • vbdev_lvs_create(): 创建逻辑卷存储
  • vbdev_lvol_create(): 创建逻辑卷
  • vbdev_lvol_create_snapshot(): 创建快照
  • vbdev_lvol_create_clone(): 创建克隆
  • vbdev_lvol_resize(): 调整逻辑卷大小
  • vbdev_lvol_set_read_only(): 设置只读模式

2. RAID模块 (bdev/raid)

功能: 在多个块设备上实现RAID功能

主要文件:

  • bdev_raid.c: RAID块设备实现
  • bdev_raid.h: 接口定义
  • bdev_raid_rpc.c: RPC接口
  • raid0.c: RAID0实现
  • raid5.c: RAID5实现

关键特性:

  • 支持RAID0 (条带化)
  • 支持RAID5 (带奇偶校验的条带化)
  • 可扩展的RAID模块架构
  • 支持热插拔
  • 支持在线重建

数据结构:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
enum raid_level {
INVALID_RAID_LEVEL = -1,
RAID0 = 0,
RAID5 = 5,
};

enum raid_bdev_state {
RAID_BDEV_STATE_ONLINE, // 在线状态
RAID_BDEV_STATE_CONFIGURING, // 配置中
RAID_BDEV_STATE_OFFLINE, // 离线状态
};

struct raid_bdev {
struct spdk_bdev bdev;
struct raid_base_bdev_info *base_bdev_info;
uint32_t strip_size;
uint32_t strip_size_kb;
enum raid_bdev_state state;
uint8_t num_base_bdevs;
enum raid_level level;
struct raid_bdev_module *module;
void *module_private;
};

RAID模块接口:

1
2
3
4
5
6
7
8
9
struct raid_bdev_module {
enum raid_level level;
uint8_t base_bdevs_min;
uint8_t base_bdevs_max_degraded;
int (*start)(struct raid_bdev *raid_bdev);
void (*stop)(struct raid_bdev *raid_bdev);
void (*submit_rw_request)(struct raid_bdev_io *raid_io);
void (*submit_null_payload_request)(struct raid_bdev_io *raid_io);
};

3. Split模块 (bdev/split)

功能: 将单个块设备分割成多个虚拟块设备

主要文件:

  • vbdev_split.c: Split块设备实现
  • vbdev_split.h: 接口定义
  • vbdev_split_rpc.c: RPC接口

关键特性:

  • 将一个块设备分割成多个部分
  • 支持可配置的分割数量和大小
  • 用于测试和资源隔离

主要函数:

  • create_vbdev_split(): 创建分割块设备
  • vbdev_split_destruct(): 删除分割块设备

4. Delay模块 (bdev/delay)

功能: 在块设备I/O中添加可配置的延迟

主要文件:

  • vbdev_delay.c: Delay块设备实现
  • vbdev_delay.h: 接口定义
  • vbdev_delay_rpc.c: RPC接口

关键特性:

  • 可配置的读取延迟(平均和P99)
  • 可配置的写入延迟(平均和P99)
  • 用于性能测试和故障模拟
  • 支持运行时更新延迟值

主要函数:

  • create_delay_disk(): 创建延迟块设备
  • delete_delay_disk(): 删除延迟块设备
  • vbdev_delay_update_latency_value(): 更新延迟值

5. Error注入模块 (bdev/error)

功能: 在块设备I/O中注入错误

主要文件:

  • vbdev_error.c: Error块设备实现
  • vbdev_error.h: 接口定义
  • vbdev_error_rpc.c: RPC接口

关键特性:

  • 可配置的错误注入
  • 支持IO失败和IO挂起
  • 用于测试错误处理逻辑
  • 支持指定错误数量

主要函数:

  • vbdev_error_create(): 创建错误注入块设备
  • vbdev_error_delete(): 删除错误注入块设备
  • vbdev_error_inject_error(): 注入错误

6. Zone Block模块 (bdev/zone_block)

功能: 将常规块设备转换为Zoned Block设备

主要文件:

  • vbdev_zone_block.c: Zone Block实现
  • vbdev_zone_block.h: 接口定义
  • vbdev_zone_block_rpc.c: RPC接口

关键特性:

  • 模拟Zoned Block设备
  • 支持Zone管理命令
  • 用于测试Zoned Block设备功能

7. GPT模块 (bdev/gpt)

功能: 解析GPT分区表并创建分区块设备

主要文件:

  • vbdev_gpt.c: GPT实现
  • gpt.c: GPT解析
  • gpt.h: GPT定义

关键特性:

  • 自动检测GPT分区
  • 为每个分区创建块设备
  • 支持标准GPT格式

8. Passthru模块 (bdev/passthru)

功能: 透传块设备,用于添加自定义功能

主要文件:

  • vbdev_passthru.c: Passthru实现
  • vbdev_passthru.h: 接口定义
  • vbdev_passthru_rpc.c: RPC接口

关键特性:

  • 透传所有I/O操作
  • 可用于添加中间层功能
  • 用于开发和测试

9. Crypto模块 (bdev/crypto) [条件编译]

功能: 在块设备上提供加密/解密功能

主要文件:

  • vbdev_crypto.c: Crypto实现
  • vbdev_crypto.h: 接口定义
  • vbdev_crypto_rpc.c: RPC接口

关键特性:

  • 透明加密/解密
  • 支持多种加密算法
  • 数据安全保护

10. Compress模块 (bdev/compress) [条件编译]

功能: 在块设备上提供压缩/解压缩功能

主要文件:

  • vbdev_compress.c: Compress实现
  • vbdev_compress.h: 接口定义
  • vbdev_compress_rpc.c: RPC接口

关键特性:

  • 透明压缩/解压缩
  • 节省存储空间
  • 使用ISA-L库

11. OCF模块 (bdev/ocf) [条件编译]

功能: Open CAS Framework集成,提供缓存功能

主要文件:

  • vbdev_ocf.c: OCF实现
  • vbdev_ocf.h: 接口定义
  • vbdev_ocf_rpc.c: RPC接口
  • ctx.c, data.c, volume.c, stats.c, utils.c: 辅助实现

关键特性:

  • 缓存加速
  • 支持多种缓存策略
  • 统计信息收集

12. FTL模块 (bdev/ftl) [Linux only]

功能: Flash Translation Layer,用于SSD管理

主要文件:

  • bdev_ftl.c: FTL实现
  • bdev_ftl.h: 接口定义
  • bdev_ftl_rpc.c: RPC接口

关键特性:

  • 磨损均衡
  • 地址转换
  • 垃圾回收

13. RPC模块 (bdev/rpc)

功能: 块设备的通用RPC接口

主要文件:

  • bdev_rpc.c: RPC实现

关键特性:

  • 统一的块设备RPC接口
  • 块设备查询和管理

加速器模块(ACCEL)

加速器模块提供了硬件加速功能的抽象。

1. IDXD加速器模块 (accel/idxd)

功能: Intel Data Streaming Accelerator (DSA) 支持

主要文件:

  • accel_engine_idxd.c: IDXD加速器实现
  • accel_engine_idxd.h: 接口定义
  • accel_engine_idxd_rpc.c: RPC接口

关键特性:

  • 硬件加速的数据移动
  • 硬件加速的CRC计算
  • 硬件加速的压缩/解压缩
  • 支持多个IDXD设备

主要函数:

  • accel_engine_idxd_enable_probe(): 启用IDXD探测

2. IOAT加速器模块 (accel/ioat)

功能: Intel I/O Acceleration Technology (IOAT) 支持

主要文件:

  • accel_engine_ioat.c: IOAT加速器实现
  • accel_engine_ioat.h: 接口定义
  • accel_engine_ioat_rpc.c: RPC接口

关键特性:

  • DMA拷贝加速
  • 内存移动优化
  • 卸载CPU负载

Blob存储模块

Blob模块 (blob)

功能: Blob存储的基础模块

主要文件:

  • blob_bdev.c: Blob与块设备的集成

关键特性:

  • 提供Blob存储的基础功能
  • 与块设备层集成

Blob文件系统模块

BlobFS模块 (blobfs)

功能: 在Blobstore上提供POSIX兼容的文件系统

主要文件:

  • blobfs_bdev.c: BlobFS与块设备的集成
  • blobfs_fuse.c: FUSE接口实现
  • blobfs_fuse.h: FUSE接口定义
  • blobfs_bdev_rpc.c: RPC接口

关键特性:

  • POSIX兼容的文件系统接口
  • FUSE支持,可挂载到文件系统
  • 基于Blobstore的高性能存储
  • 支持文件系统操作(创建、删除、读写等)

主要函数:

  • spdk_blobfs_bdev_detect(): 检测BlobFS
  • spdk_blobfs_bdev_mount(): 挂载BlobFS
  • spdk_blobfs_bdev_unmount(): 卸载BlobFS

事件子系统模块

Event模块 (event)

功能: 事件子系统的模块化实现

主要子模块:

1. BDEV子系统 (event/subsystems/bdev)

功能: 块设备子系统的事件处理

主要文件:

  • bdev.c: 块设备子系统实现

2. NVMf子系统 (event/subsystems/nvmf)

功能: NVMe over Fabrics目标子系统

主要文件:

  • nvmf_tgt.c: NVMf目标实现
  • nvmf_rpc.c: RPC接口
  • conf.c: 配置管理
  • event_nvmf.h: 事件定义

关键特性:

  • NVMe-oF目标实现
  • 支持RDMA、TCP、FC传输
  • 子系统管理
  • 命名空间管理

3. iSCSI子系统 (event/subsystems/iscsi)

功能: iSCSI目标子系统

主要文件:

  • iscsi.c: iSCSI目标实现

关键特性:

  • iSCSI协议支持
  • 目标端实现

4. Vhost子系统 (event/subsystems/vhost)

功能: Vhost用户空间实现

主要文件:

  • vhost.c: Vhost实现

关键特性:

  • 与QEMU/KVM集成
  • 高性能虚拟化I/O

5. SCSI子系统 (event/subsystems/scsi)

功能: SCSI协议支持

主要文件:

  • scsi.c: SCSI实现

6. NBD子系统 (event/subsystems/nbd)

功能: Network Block Device支持

主要文件:

  • nbd.c: NBD实现

关键特性:

  • 网络块设备导出
  • 远程块设备访问

7. VMD子系统 (event/subsystems/vmd)

功能: Volume Management Device支持

主要文件:

  • vmd.c: VMD实现
  • vmd_rpc.c: RPC接口
  • event_vmd.h: 事件定义

关键特性:

  • Intel VMD设备管理
  • 热插拔支持

8. Net子系统 (event/subsystems/net)

功能: 网络子系统

主要文件:

  • net.c: 网络实现

9. Sock子系统 (event/subsystems/sock)

功能: Socket子系统

主要文件:

  • sock.c: Socket实现

10. Accel子系统 (event/subsystems/accel)

功能: 加速器子系统

主要文件:

  • accel.c: 加速器实现

11. RPC模块 (event/rpc)

功能: 事件子系统的RPC接口

主要文件:

  • subsystem_rpc.c: 子系统RPC
  • app_rpc.c: 应用RPC

Socket模块

Sock模块 (sock)

功能: 提供可插拔的Socket实现

主要子模块:

1. POSIX Socket (sock/posix)

功能: 标准POSIX Socket实现

主要文件:

  • posix.c: POSIX Socket实现

关键特性:

  • 标准BSD Socket接口
  • 跨平台支持

2. io_uring Socket (sock/uring) [条件编译]

功能: 基于io_uring的高性能Socket实现

主要文件:

  • uring.c: io_uring Socket实现

关键特性:

  • 使用Linux io_uring接口
  • 高性能异步I/O
  • 减少系统调用开销

3. VPP Socket (sock/vpp) [条件编译]

功能: 基于VPP (Vector Packet Processing) 的Socket实现

主要文件:

  • vpp.c: VPP Socket实现

关键特性:

  • 用户空间网络栈
  • 高性能数据包处理

环境模块

env_dpdk模块 (env_dpdk)

功能: DPDK环境的RPC接口

主要文件:

  • env_dpdk_rpc.c: DPDK环境RPC实现

关键特性:

  • DPDK环境配置的RPC接口
  • 内存管理RPC
  • CPU核心管理RPC

模块注册机制

块设备模块注册

1
2
3
4
5
6
7
8
9
10
11
12
13
14
// 模块定义
static struct spdk_bdev_module bdev_module = {
.name = "module_name",
.module_init = module_init_fn,
.module_fini = module_fini_fn,
.config_text = module_config_fn,
.get_ctx_size = module_get_ctx_size,
.examine_config = module_examine_config,
.examine_disk = module_examine_disk,
.claim_opts = module_claim_opts,
};

// 注册宏
SPDK_BDEV_MODULE_REGISTER(bdev_module)

RAID模块注册

1
2
3
4
5
6
7
8
9
10
11
12
13
// RAID模块定义
static struct raid_bdev_module raid_module = {
.level = RAID0,
.base_bdevs_min = 2,
.base_bdevs_max_degraded = 0,
.start = raid0_start,
.stop = raid0_stop,
.submit_rw_request = raid0_submit_rw_request,
.submit_null_payload_request = raid0_submit_null_payload_request,
};

// 注册宏
RAID_MODULE_REGISTER(&raid_module)

加速器模块注册

1
2
3
4
5
6
7
8
9
10
// 加速器引擎注册
static struct spdk_accel_module_if g_accel_idxd_module = {
.name = "idxd",
.get_ctx_size = accel_idxd_get_ctx_size,
.init = accel_idxd_init,
.fini = accel_idxd_fini,
.submit_tasks = accel_idxd_submit_tasks,
};

SPDK_ACCEL_MODULE_REGISTER(idxd, &g_accel_idxd_module)

模块依赖关系

编译时依赖

根据 module/Makefile:

1
2
3
4
5
6
7
DEPDIRS-blob :=
DEPDIRS-accel :=
DEPDIRS-env_dpdk :=
DEPDIRS-sock :=
DEPDIRS-bdev := blob
DEPDIRS-blobfs := blob
DEPDIRS-event := bdev blob

运行时依赖

  1. bdev模块 → 依赖 blob模块

    • 某些虚拟块设备(如lvol)需要blob支持
  2. blobfs模块 → 依赖 blob模块

    • BlobFS基于Blobstore实现
  3. event模块 → 依赖 bdev模块blob模块

    • 事件子系统需要块设备和blob支持

条件编译依赖

  • CONFIG_CRYPTO: crypto模块
  • CONFIG_OCF: ocf模块
  • CONFIG_REDUCE: compress模块
  • CONFIG_URING: uring模块(bdev和sock)
  • CONFIG_ISCSI_INITIATOR: iscsi模块
  • CONFIG_VIRTIO: virtio模块
  • CONFIG_PMDK: pmem模块
  • CONFIG_RBD: rbd模块
  • CONFIG_VPP: vpp模块

模块工作流程

块设备模块工作流程

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
1. 模块初始化
└─> module_init_fn()
└─> 注册模块到bdev子系统

2. 配置解析
└─> module_config_fn()
└─> 解析配置文件

3. 设备检测
└─> module_examine_disk()
└─> 检测并创建块设备

4. I/O处理
└─> bdev_module->submit_request()
└─> 处理I/O请求

5. 模块清理
└─> module_fini_fn()
└─> 清理资源

RAID模块工作流程

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
1. RAID配置
└─> raid_bdev_config_add()
└─> 创建RAID配置

2. RAID创建
└─> raid_bdev_create()
└─> 创建RAID块设备

3. 添加基础设备
└─> raid_bdev_add_base_devices()
└─> 添加成员设备

4. RAID启动
└─> raid_module->start()
└─> 初始化RAID状态

5. I/O分发
└─> raid_module->submit_rw_request()
└─> 分发I/O到成员设备

6. I/O完成
└─> raid_bdev_io_complete()
└─> 聚合完成状态

模块设计原则

1. 模块化设计

  • 每个模块独立实现
  • 通过标准接口集成
  • 支持动态加载

2. 可扩展性

  • 模块注册机制
  • 插件式架构
  • 易于添加新模块

3. 统一接口

  • 块设备模块统一接口
  • RPC接口标准化
  • 事件处理统一

4. 性能优化

  • 零拷贝设计
  • 异步I/O
  • 硬件加速支持

5. 可测试性

  • 虚拟块设备用于测试
  • 错误注入支持
  • 延迟模拟

总结

SPDK的 module 目录提供了丰富的模块化功能实现:

  1. 块设备模块: 提供了从物理设备到虚拟设备的完整支持
  2. 加速器模块: 利用硬件加速提升性能
  3. 存储模块: Blob和BlobFS提供对象存储和文件系统
  4. 事件子系统: 模块化的事件处理框架
  5. 网络模块: 可插拔的Socket实现
  6. 环境模块: DPDK环境集成

这些模块通过统一的注册机制和接口规范,实现了高度的模块化和可扩展性,使得SPDK能够适应各种存储场景和性能需求。


文档版本: 1.0
最后更新: 2024年

文章互动

阅读 --

留言

0 条留言

正在加载留言…