创建rbd镜像前必须启用rbd应用标识并初始化池,否则rbd create会失败;映射时需确保内核支持镜像特性,否则需禁用不兼容特性如object-map等。

直接用 rbd create 创建镜像、rbd map 映射到 /dev/rbd*,再格式化挂载即可。但实际执行时,90% 的失败都卡在镜像特性与内核不兼容、密钥权限不对或 pool 没启用 RBD 应用标识上。
创建 RBD 镜像前必须初始化 pool 并启用 rbd application
很多用户执行 rbd create 报错 image format 2 requires rbd application enabled on pool,就是因为跳过了这步。
-
ceph osd pool create rbd-data 128(PG 数建议为 2 的幂,128 或 256 起步) -
ceph osd pool application enable rbd-data rbd(关键!不是可选,是强制) -
rbd pool init -p rbd-data(初始化 pool 的 RBD 元数据)
漏掉第二步,rbd create 会静默失败或报特征不支持;漏掉第三步,后续 rbd info 可能查不到完整元数据。
rbd create 必须指定 --image-format 2 和 layering 特性
format 1 已废弃,kernel 5.4+ 默认不支持;不启用 layering,后续无法做快照/克隆,且部分旧内核映射时会拒绝加载。
- 推荐命令:
rbd create rbd-data/mydisk --size 10G --image-format 2 --image-feature layering - 如果后续要支持快照分层克隆,加
exclusive-lock object-map fast-diff deep-flatten,但注意:这些特性需客户端内核 ≥ 4.17 且rbd.ko模块已加载 - 若遇到
RBD image feature set mismatch,优先禁用非必需特性:rbd feature disable rbd-data/mydisk object-map fast-diff deep-flatten
rbd map 失败常见原因和绕过方式
rbd map 报 No such device or address 或 sysfs write failed,基本不是网络问题,而是本地环境没配好。
- 确认已安装
ceph-common包(Ubuntu/Debian)或ceph-base(CentOS/RHEL) - 确认
/etc/ceph/ceph.conf和/etc/ceph/ceph.client.admin.keyring存在且权限为 600 - 检查
rbd.ko是否加载:lsmod | grep rbd;未加载则sudo modprobe rbd - 映射时显式指定 pool 和镜像名更稳妥:
rbd map rbd-data/mydisk,而非只写mydisk - 映射成功后设备名不一定是
/dev/rbd0,用rbd showmapped看真实路径
挂载前务必检查设备状态并按需扩容文件系统
映射后不能直接 mount,因为新镜像没有文件系统,且即使格式化过,resize 后也需同步更新 FS 大小。
- 格式化:
mkfs.xfs /dev/rbd0(推荐 xfs,ext4 在大镜像下e2fsck耗时长) - 挂载:
mkdir -p /mnt/rbd && mount /dev/rbd0 /mnt/rbd - 如果之前用
rbd resize扩容过镜像,必须运行xfs_growfs /mnt/rbd(xfs)或resize2fs /dev/rbd0(ext4)才能真正使用新增空间 - 写入测试:
dd if=/dev/zero of=/mnt/rbd/test bs=1M count=100 oflag=direct,避免缓存干扰判断
最容易被忽略的是:rbd resize 只改了块设备大小,不等于文件系统自动扩展——这点在自动化脚本里漏掉会导致磁盘“明明扩容了却写不满”。











