Ceph RBD 块设备
在 Ceph 中创建 RBD pool / image,并完成本地与远端挂载、扩缩容及开机自动挂载。
环境
| 项目 | 版本 / 说明 |
|---|---|
| 操作系统 | CentOS Linux release 8.2.2004 (Core) |
| Ceph | 15.2.15(Octopus) |
| 默认 PG(示例) | osd_pool_default_pg_num = 128 |
| 默认 PGP(示例) | osd_pool_default_pgp_num = 128 |
PG 相关默认值一般写在
ceph.conf的[global],或通过ceph config set配置;建 pool 前确认,避免 PG 过少/过多。
1. 创建块设备 Pool
ceph osd pool create igo-rbd-01
ceph osd pool ls
建议: 用 Dashboard 创建/调整 pool,可选项更多、更直观(副本数、PG、应用类型等)。
初始化为 RBD 用途:
rbd pool init igo-rbd-01
创建客户端密钥(按实际 pool 名授权;须与真正使用的 pool 一致):
ceph auth get-or-create client.igo \
osd 'allow rw pool=igo-rbd-01' \
-o igo.key
查看权限:
ceph auth get client.igo
示例输出:
exported keyring for client.igo
[client.igo]
key = AQCS85Rh1EoGGBAAtthfxP7OucicmmyLsPv4mg==
caps osd = "allow rw pool=igo-rbd-01"
命名说明: 下文操作示例多使用 pool 名
igo-rbd-1。若你创建的是igo-rbd-01,请在所有命令中统一替换,并保证ceph auth中的pool=与之一致(原文中的igo-pool-1易与实际 pool 不符,属常见笔误)。
2. 创建块设备 Image
rbd create --size 1G igo-rbd-1/igo-image-2
rbd ls igo-rbd-1
示例:
igo-image-1
igo-image-2
查看占用
rbd du igo-rbd-1/igo-image-1
NAME PROVISIONED USED
igo-image-1 1 GiB 28 MiB
扩容 / 缩容
# 扩容到 2G
rbd resize igo-rbd-1/igo-image-1 --size 2G
# 缩容到 1G(必须加 --allow-shrink,且需确保文件系统/数据已收缩,否则有风险)
rbd resize igo-rbd-1/igo-image-1 --allow-shrink --size 1G
若 image 已挂载并格式化为 ext4/xfs,扩容后还需在操作系统内扩展文件系统;缩容前应先缩小文件系统。
3. 本地映射并挂载
查看 image 信息:
rbd info igo-rbd-1/igo-image-1
映射为本地块设备:
rbd map igo-rbd-1/igo-image-1
rbd showmapped
示例:
id pool namespace image snap device
0 igo-rbd-1 igo-image-1 - /dev/rbd0
格式化、挂载、写入测试:
mkfs.ext4 /dev/rbd0
mkdir -p /mnt/ceph-block-device
mount /dev/rbd0 /mnt/ceph-block-device
touch /mnt/ceph-block-device/igo.txt
删除块设备
先卸载映射,再删除 image:
# 若已 mount,先 umount
umount /mnt/ceph-block-device # 按实际挂载点
rbd unmap igo-rbd-1/igo-image-2
rbd rm igo-rbd-1/igo-image-2
4. 客户机(远端)挂载 RBD
4.1 安装并配置 ceph-common
可先配置阿里云 Octopus(el8)仓库(见文末「补充:Yum 源」),再安装:
yum -y install ceph-common
从 mon 节点拷贝配置与密钥:
scp root@igo-ceph-mon1:/etc/ceph/ceph.client.admin.keyring /etc/ceph/
scp root@igo-ceph-mon1:/etc/ceph/ceph.conf /etc/ceph/
ceph -s
生产环境建议使用最小权限的
client.igo等专用 keyring,避免在业务机长期使用client.admin。
4.2 映射、格式化、挂载
rbd ls igo-rbd-1
rbd map igo-rbd-1/igo-image-500
mkfs.ext4 /dev/rbd0
mkdir -p /mnt/ceph500
mount /dev/rbd0 /mnt/ceph500
echo igo500 > /mnt/ceph500/igo.txt
4.3 开机自动挂载
分两步:自动 map,再 自动 mount。
1)自动 mapping(rbdmap)
vim /etc/ceph/rbdmap
内容示例:
igo-rbd-1/igo-image-500 id=admin,keyring=/etc/ceph/ceph.client.admin.keyring
systemctl enable --now rbdmap.service
2)开机自动 mount
写入 /etc/fstab(示例):
/dev/rbd0 /mnt/ceph500 ext4 defaults,_netdev 0 0
或先手动验证:
mount /dev/rbd0 /mnt/ceph500
注意:
/dev/rbd0编号可能随 map 顺序变化。更稳妥可用/dev/rbd/<pool>/<image>(rbdmap 创建的设备路径)或文件系统 UUID。- 网络块设备建议加
_netdev,确保网络就绪后再挂载。- 开机顺序:
rbdmap先于依赖该设备的mount。
补充:Yum 源(Ceph Octopus / el8)
tee /etc/yum.repos.d/ceph.repo <<'EOF'
[Ceph]
name=Ceph packages for $basearch
baseurl=https://mirrors.aliyun.com/ceph/rpm-octopus/el8/$basearch
enabled=1
gpgcheck=0
type=rpm-md
[Ceph-noarch]
name=Ceph noarch packages
baseurl=https://mirrors.aliyun.com/ceph/rpm-octopus/el8/noarch
enabled=1
gpgcheck=0
type=rpm-md
[ceph-source]
name=Ceph source packages
baseurl=https://mirrors.aliyun.com/ceph/rpm-octopus/el8/SRPMS
enabled=1
gpgcheck=0
type=rpm-md
EOF
使用
<<'EOF'可避免$basearch被 shell 提前展开;若用原文的\$basearch写法,效果类似。
命令速查
| 操作 | 命令 |
|---|---|
| 建 pool | ceph osd pool create <pool> → rbd pool init <pool> |
| 建 image | rbd create --size 1G <pool>/<image> |
| 列表 / 占用 | rbd ls <pool> / rbd du <pool>/<image> |
| 扩缩容 | rbd resize ... --size <N>G(缩容加 --allow-shrink) |
| 映射 / 查看 | rbd map ... / rbd showmapped |
| 取消映射 / 删除 | rbd unmap ... / rbd rm ... |
| 开机 map | /etc/ceph/rbdmap + rbdmap.service |
常见问题
- auth 报 permission denied: 检查
caps中 pool 名是否与实际 RBD pool 一致。 - map 失败: 确认
ceph -s正常、客户端能连 mon、keyring 路径正确。 - 重启后未挂载: 确认
rbdmap.service已 enable,fstab 含_netdev,且设备路径稳定。 - 缩容后文件系统损坏: 必须先缩文件系统再
rbd resize --allow-shrink。