两种客户端路径
访问 RBD 有两条路:内核客户端 krbd 由内核模块直接处理 IO,映射出 /dev/rbdX 设备,路径短、延迟低;用户态客户端 librbd 把请求从应用或虚拟机经库函数发出,特性跟进快、可随宿主程序升级。两者共用同一套集群数据,差别在 IO 走哪条栈。
基本信息
| 适用平台 | Linux 主机(krbd)、QEMU 虚拟机与容器 CSI(librbd) |
|---|---|
| 内核客户端 | rbd map,需要 rbd 内核模块 |
| 用户态客户端 | librbd 库,配合 QEMU 或 rbd-nbd 使用 |
| 权限要求 | 目标池的读写 caps,映射操作需 root |
典型使用场景
- 数据库物理机直连盘:优先内核客户端,减少一层上下文切换
- 云平台虚拟机盘:QEMU 走 librbd,支持快照、克隆与在线迁移
- 内核版本偏老:新卷特性不支持时改用 rbd-nbd 折中
- 容器持久卷:CSI 驱动通过 librbd 动态供给,无需在节点装内核模块
内核客户端
内核客户端
modprobe rbd # 加载 rbd 内核模块
rbd map data/dbvol # 映射,输出 /dev/rbd0
rbd device list # 查看已映射设备与池的对应关系
rbd unmap /dev/rbd0 # 卸载映射(先 umount)用户态路径
用户态路径
rbd-nbd map data/dbvol # 内核 NBD + 用户态 librbd
rbd-nbd list-mapped # 查看已映射的 NBD 设备
qemu-system-x86_64 -drive file=rbd:data/dbvol:conf=/etc/ceph/ceph.conf # 虚拟机直用 librbd两种客户端对比
| 维度 | 内核客户端 krbd | 用户态客户端 librbd |
|---|---|---|
| IO 路径 | 内核块层直通,延迟更低 | 多一次用户态拷贝,CPU 占用略高 |
| 特性支持 | 受内核版本限制 | 随 Ceph 版本更新,新特性可用 |
| 运维方式 | 需加载模块、逐台维护内核 | 随应用或容器一起升级,无需动内核 |
映射失败常见原因是卷启用了内核不支持的特性:可先用 rbd info 看 features,必要时在建卷时关掉不需要的特性,或改用 rbd-nbd。
同一块 RBD 卷不要同时用内核与用户态两种路径挂载到不同主机,没有文件系统层的互斥保护时极易写坏数据。
选型判断顺序
- 先确认客户端内核版本是否支持卷上启用的全部特性
- 再确认是否需要在不停机的前提下升级存储访问栈
- 虚拟机场景优先使用虚拟化层自带的用户态客户端
- 容器场景交给存储插件决定路径,避免手工映射与调度冲突
- 两种路径混用时统一在一处登记映射关系,防止设备名与卷对应关系混乱
映射关系不写入开机挂载配置时,宿主机重启后卷不会自动回来,需要配合自动化脚本或系统服务单元。