Ceph Octopus版本添加SPDK后端OSD的方法及故障求助
我来帮你梳理下这个困扰你多日的问题,你遇到的核心矛盾其实和ceph-volume lvm的设计限制直接相关,结合你使用的Octopus版本,咱们一步步拆解解决方案:
问题根源
你在Ceph文档里看到的结论完全正确:
ceph-volume是模块化工具,当前支持legacy ceph-disk设备和lvm,而SPDK设备因直接在用户态管理NVMe,不依赖内核,LVM无法适配,这类设备已在规划中
ceph-volume lvm模块的定位就是管理内核块设备和LVM逻辑卷,而SPDK是彻底绕开内核块层的用户态存储方案,LVM根本无法识别spdk:前缀的设备,所以用ceph-volume lvm create指定SPDK设备必然会触发参数验证错误。
Octopus版本的SPDK支持现状
Ceph Octopus(15.x)版本没有正式支持通过ceph-volume创建SPDK后端的OSD,SPDK作为BlueStore后端的支持在这个版本处于早期阶段,只能通过手动调用ceph-osd命令来初始化,而非依赖ceph-volume的自动化流程。
正确的手动创建步骤
既然ceph-volume lvm走不通,咱们换用手动初始化的方式,步骤如下:
确认前置条件:你已经完成的SPDK设备绑定(
setup.sh)和功能测试(identify、hello_world)都是正确的,这部分无需重复操作。获取OSD ID:先在Ceph集群中创建一个新的OSD ID:
sudo ceph osd create执行后会输出一个数字,比如
10,这就是咱们要用到的{osd-id}。创建OSD数据目录:
sudo mkdir -p /var/lib/ceph/osd/ceph-{osd-id} sudo chown ceph:ceph /var/lib/ceph/osd/ceph-{osd-id}初始化SPDK后端的BlueStore OSD:
直接用ceph-osd命令完成格式化和密钥生成,这里假设你的SPDK设备同时作为block、db、wal存储(如果拆分设备,分别指定不同的spdk:地址即可):sudo ceph-osd -i {osd-id} --mkfs --mkkey \ --bluestore-block-path spdk:0000:0a:00.0 \ --bluestore-block-db-path spdk:0000:0a:00.0 \ --bluestore-block-wal-path spdk:0000:0a:00.0注册OSD到集群:
- 首先导入OSD密钥到集群:
sudo ceph auth add osd.{osd-id} osd 'allow *' mon 'allow profile osd' \ -i /var/lib/ceph/osd/ceph-{osd-id}/keyring - 然后将OSD添加到CRUSH映射(
{weight}是OSD的权重,比如对应磁盘容量的相对值,{host-name}是当前节点的主机名):sudo ceph osd crush add osd.{osd-id} {weight} host={host-name}
- 首先导入OSD密钥到集群:
启动OSD服务:
sudo systemctl start ceph-osd@{osd-id}可以用
systemctl enable ceph-osd@{osd-id}设置开机自启。
后续版本的简化方案
如果你后续升级到Ceph Pacific(16.x)及以上版本,ceph-volume新增了raw模块,专门用于管理非LVM的原始设备(包括SPDK用户态设备),此时可以用更简洁的命令创建:
sudo ceph-volume raw create --bluestore --data spdk:0000:0a:00.0
这个模块会自动完成OSD初始化、集群注册和服务配置,无需手动执行多步操作。
注意事项
- 确保编译Ceph时SPDK的路径配置正确,环境变量
SPDK_DIR指向你的SPDK源码目录(如果编译时没指定的话) - Octopus版本的SPDK支持存在一些已知的稳定性问题,如果生产环境使用,建议优先考虑升级到Pacific+版本
- 手动创建的OSD,ceph-volume的自动维护功能(比如故障检测、替换)无法覆盖,需要自行负责OSD的监控和运维
内容的提问来源于stack exchange,提问作者uncleDuo

