此为ai辅助生成,经过博主的实践检验,保证适配机器部署成功
openEuler 三节点 Ceph 学习集群部署教程
10 GB 磁盘精简版 · 从零到 HEALTH_OK
适用于 Ceph Tentacle 20.2.x + cephadm 容器化部署
第 0 章 先看清你的磁盘到底长什么样
关键前提 df -h 只能看到「已经挂载」的文件系统,看不到没分区、没挂载的空盘。你看到根分区 17G,并不代表机器上没有第二块盘。判断有没有可用数据盘,必须看 lsblk,而不是 df。
0.1 第一步:用 lsblk 确认有没有独立的空盘
在三台机器上各执行一次:
lsblk -f
对照下面的结果决定走哪条线:
| lsblk 看到的情况 | 含义 | 走哪条线 | 集群可用容量 |
| 除了 sda,还有 sdb 且 FSTYPE 列为空 | 有独立空盘,只是没格式化所以 df 看不到 | 第 6 章 A 方案 | 约 9 GB |
| 只有 sda 一块盘,下面只有 sda1 / sda2 | 确实只有一块系统盘 | 第 6 章 B 方案 | 约 5 – 6 GB |
提醒 后面创建 RBD 镜像时,单个镜像不要超过 2 GB(B 方案)或 5 GB(A 方案),否则写入时会直接把集群撑到只读。
第 1 章 环境规划
1.1 三台机器的角色分配
| 节点 | 主机名 | IP 地址 | 角色 | 数据盘 |
| 节点 1 | ceph40 | 192.168.128.40 | MON + MGR + OSD | /dev/sdb |
| 节点 2 | ceph44 | 192.168.128.44 | MON + MGR + OSD | /dev/sdb |
| 节点 3 | ceph45 | 192.168.128.45 | MON + MGR + OSD | /dev/sdb |
注意 请替换成你实际的 IP,名称等自定义,这里作参考。三台都跑 MON/MGR/OSD,这是三节点小型集群的标准做法。
1.2 实际配置与最低要求对照
| 项目 | 最低要求 | 你的实测值 | 结论 |
| CPU | 2 核 | 需自行确认 | nproc 查看,2 核即可运行 |
| 内存 | 4 GB | 需自行确认 | free -h 查看,4 GB 够用 |
| 系统盘 | 15 GB | 17 GB(可用 14 GB) | 达标,但需按第 7 章精简 |
| 独立数据盘 | 非必需 | 待 lsblk 确认 | 有则走 A 方案,无则走 B 方案 |
内存和 CPU 用下面两条命令确认:
free -h # 看 Mem 行的 total
nproc # 看 CPU 核数
1.3 为什么选 Ceph Tentacle 20.2.x
版本选错,等于一开始就在用过期的东西。当前(2026 年 9 月)各版本生命周期如下:
| 版本 | 状态 | 生命周期结束 | 是否推荐 |
| Reef 18.2.x | 已 EOL | 2026-03-31 | 不推荐,已停止安全修复 |
| Squid 19.2.x | 活跃 | 2026-09-19 | 即将到期,不建议新装 |
| Tentacle 20.2.x | 活跃 | 2027-11-18 | 推荐,新部署首选 |
特别提醒 openEuler 系统自带源里的 ceph 是 18.2.2(Reef),已经 EOL,不要直接用 dnf install ceph 安装。本文用官方 cephadm 脚本部署 v20,容器镜像与工具版本天然一致。
第 2 章 系统准备(三台机器都要做)
操作身份 以下全部命令都以 root 执行。你的登录用户是普通用户,请先执行 sudo -i 切换,避免每条命令都加 sudo。
2.1 切换到 root
sudo -i
2.2 设置主机名(各自执行,不要搞混)
三台机器分别执行对应的一条:
# 第 1 台(192.168.128.40)
hostnamectl set-hostname ceph40
# 第 2 台(192.168.128.44)
hostnamectl set-hostname ceph44
# 第 3 台(192.168.128.45)
hostnamectl set-hostname ceph45
虚拟机默认主机名是 localhost.localdomain,cephadm 会直接拒绝启动。改完后执行 exit 再 sudo -i 重新登录,提示符才会变。
2.3 配置 hosts(三台都执行,内容完全一样)
cat >> /etc/hosts <<'EOF'
192.168.128.40 ceph40
192.168.128.44 ceph44
192.168.128.45 ceph45
EOF
验证能否互相解析:
ping -c 2 ceph44 && ping -c 2 ceph45
2.4 时间同步(必须做)
Ceph 对时钟极其敏感,节点之间时间差过大,MON 会直接拒绝服务。
dnf install -y chrony
systemctl enable --now chronyd
chronyc sources -v
输出中某一行前面带 * 号,说明已经成功同步到时间源。
2.5 关闭 SELinux
openEuler 默认开启 SELinux,会拦截容器挂载磁盘,导致 OSD 创建失败。
setenforce 0
sed -i 's/^SELINUX=enforcing/SELINUX=permissive/' /etc/selinux/config
getenforce # 应输出 Permissive
2.6 开放防火墙端口
学习环境可以 systemctl disable --now firewalld 一关了之,但建议按下面开端口,顺便记住生产环境该开什么:
firewall-cmd --permanent --add-port=6789/tcp # MON(v1 协议)
firewall-cmd --permanent --add-port=3300/tcp # MON(v2 协议)
firewall-cmd --permanent --add-port=6800-7300/tcp # OSD 通信
firewall-cmd --permanent --add-port=8443/tcp # Dashboard 网页
firewall-cmd --reload
firewall-cmd --list-ports
2.7 安装容器运行时与依赖
dnf install -y podman lvm2 python3 chrony
systemctl enable --now podman
podman --version
关于磁盘空间 装完立刻清理一次 dnf 缓存,能回收几百 MB,10G 环境下这点空间很宝贵:dnf clean all
2.8 确认数据盘
lsblk -f
找到那块没有分区、没有 FSTYPE、没有挂载点的盘。常见名称是 /dev/sdb 或 /dev/vdb。
| 看到的情况 | 含义 | 怎么做 |
| 有 /dev/sdb 且无 FSTYPE | 干净的裸盘,正是我们要的 | 记下设备名,第 6 章直接用 |
| /dev/sdb 已有分区或文件系统 | 之前用过的盘 | 执行 wipefs -a /dev/sdb 清空 |
| 只有系统盘,没有第二块盘 | 情况 B | 关机加一块 10G 盘,或用第 6 章 B 方案的 loop 文件 |
第 3 章 初始化集群(仅在 ceph40 上执行)
3.1 下载官方 cephadm
cd /root
curl -O https://download.ceph.com/rpm-20.2.4/el9/noarch/cephadm
chmod +x cephadm
./cephadm version
如果下载失败 说明 20.2.4 的 rpm 目录尚未同步,把 URL 里的版本号改成 20.2.3 再试一次即可,两者部署流程完全一致。
3.2 引导集群(核心命令)
这是整个部署中最重要的一条命令,注意 --skip-monitoring-stack 是 10G 环境的必选项:
./cephadm bootstrap \
--mon-ip 192.168.128.40 \
--initial-dashboard-user admin \
--initial-dashboard-password Admin@123 \
--skip-monitoring-stack
这条命令自动做了什么
- 在本机拉起第一个 MON 和 MGR 容器,集群正式成立
- 生成集群专属 SSH 密钥,公钥存放在 /etc/ceph/ceph.pub
- 生成最小配置文件 /etc/ceph/ceph.conf
- 生成管理员密钥 /etc/ceph/ceph.client.admin.keyring(这是集群的命根子)
- 给本机打上 _admin 标签,允许执行 ceph 管理命令
- 跳过 Prometheus / Grafana / Alertmanager / node-exporter(本教程刻意省略)
执行过程约 3–10 分钟,主要取决于拉取容器镜像的速度。看到 Bootstrap complete. 即成功,屏幕上会打印 Dashboard 地址:
Ceph Dashboard is now available at:
URL: https://ceph40:8443/
User: admin
Password: Admin@123
3.3 配置 ceph 命令别名
推荐用容器方式调用 ceph 命令,版本永远和集群一致,不会出现客户端与集群版本不匹配的问题:
echo "alias ceph='/root/cephadm shell -- ceph'" >> ~/.bashrc #注意/root/cephadm为安装的cephadm可执行文件位置,如果更改了位置要注意修改
source ~/.bashrc
ceph -s
小提示 第一次执行会拉取镜像并启动容器,稍慢;之后就和普通命令一样快。看到 health: HEALTH_WARN 属正常,因为 OSD 还没加。
第 4 章 把另外两台加进集群
以下都在 ceph40 上执行。
4.1 分发 SSH 公钥
ssh-copy-id -f -i /etc/ceph/ceph.pub root@ceph44
ssh-copy-id -f -i /etc/ceph/ceph.pub root@ceph45
每条命令会提示输入对方 root 密码,输入即可。
4.2 把主机加入集群
ceph orch host add ceph44 192.168.128.44
ceph orch host add ceph45 192.168.128.45
ceph orch host ls
4.3 给新节点打 _admin 标签
只有带这个标签的机器才会被下发 ceph.conf 和 admin keyring,否则在那两台机器上敲 ceph 命令会连不上:
ceph orch host label add ceph44 _admin
ceph orch host label add ceph45 _admin
第 5 章 部署 MON / MGR 高可用
这一步是三节点相对两节点最大的价值:3 个 MON 构成 quorum,任意一台宕机,集群照常读写。
ceph orch apply mon --placement="ceph40,ceph44,ceph45"
ceph orch apply mgr --placement="ceph40,ceph44,ceph45"
等待 1–2 分钟让容器起来,然后确认:
ceph -s
ceph mon stat
ceph orch ps
期望结果 ceph -s 的输出里应出现 3 mons 和 2-3 mgrs。MON 数量必须是奇数,这是 quorum 选举的要求。
第 6 章 添加 OSD(真正存数据的盘)
6.1 A 方案:有独立空盘(lsblk 能看到 sdb)
在 ceph40 上执行,三台分别添加:
ceph orch daemon add osd ceph40:/dev/sdb
ceph orch daemon add osd ceph44:/dev/sdb
ceph orch daemon add osd ceph45:/dev/sdb
设备名不一致怎么办 如果三台的数据盘设备名不同(比如一台是 /dev/sdb、另一台是 /dev/vdb),分别用各自的设备名即可,不要求统一。
6.2 B 方案:只有系统盘,用稀疏文件模拟磁盘
确认只有一块系统盘时,在每台机器上造一个稀疏文件当“假磁盘”。
为什么用 truncate 而不是 dd dd 会立刻写满 6 GB 真实数据块,让你的可用空间从 14 GB 直接掉到 8 GB;truncate 创建的是稀疏文件,初始几乎不占空间,OSD 写入多少才占多少,对 17 GB 的盘友好得多。
三台机器各自执行:
# 创建一个名义 6 GB、实际几乎不占空间的稀疏文件
truncate -s 6G /var/lib/ceph-osd.img
# 挂成 loop 设备(指定 loop0,方便后面设置开机自启)
losetup /dev/loop0 /var/lib/ceph-osd.img
# 确认挂载成功
losetup -a
lsblk -f | grep loop0
然后回到 ceph40 添加 OSD,设备名换成 loop 设备:
ceph orch daemon add osd ceph40:/dev/loop0
ceph orch daemon add osd ceph44:/dev/loop0
ceph orch daemon add osd ceph45:/dev/loop0
重启后 loop 设备会丢 这是 B 方案最大的坑:机器重启后 /dev/loop0 消失,OSD 起不来。配置一个开机自启服务即可解决,三台机器各自执行一次:
cat > /etc/systemd/system/ceph-osd-loop.service <<'EOF'
[Unit]
Description=Setup loop device for Ceph OSD
DefaultDependencies=no
Before=local-fs.target
[Service]
Type=oneshot
ExecStart=/usr/sbin/losetup /dev/loop0 /var/lib/ceph-osd.img
RemainAfterExit=yes
[Install]
WantedBy=multi-user.target
EOF
systemctl daemon-reload
systemctl enable ceph-osd-loop.service
B 方案的取舍 性能比真实磁盘差,且占用根分区空间,仅适合学习练手。但集群行为、所有管理命令、扩容与故障恢复流程都与真实磁盘完全一致,作为入门环境完全够用。
6.3 确认 OSD 创建成功
ceph osd tree
ceph osd df
ceph -s
ceph osd tree 应该看到 3 个 OSD(osd.0 / osd.1 / osd.2),分别挂在 ceph40 / ceph44 / ceph45 三个 HOST 下面。
第 7 章 小盘环境必做的 6 项精简调参
这一章是 17 GB 小盘环境能不能跑稳的关键。生产环境通常不需要改这些,但小机器上每一项都有实际意义。
调优 1:降低 OSD 内存占用(最重要)
Ceph 默认给每个 OSD 预留 4 GB 内存,小机器上会和 MON、MGR 抢内存,严重时触发 OOM。
# 内存 8 GB 的机器:每个 OSD 给 2 GB
ceph config set osd osd_memory_target 2147483648
# 内存只有 4 GB 的机器:压到 1 GB
ceph config set osd osd_memory_target 1073741824
调优 2:限制系统日志体积
Ceph 容器日志默认全部进 journald,长时间运行会悄悄吃掉几 GB。
mkdir -p /etc/systemd/journald.conf.d
cat > /etc/systemd/journald.conf.d/99-ceph.conf <<'EOF'
[Journal]
SystemMaxUse=200M
RuntimeMaxUse=100M
EOF
systemctl restart systemd-journald
三台机器都要执行。
调优 3:清理 dnf 缓存
dnf clean all
rm -rf /var/cache/dnf
df -h / # 看看回收了多少
调优 4:关闭遥测上报
Ceph 默认会向社区上报匿名使用数据,学习环境关掉,既省带宽也避免后台任务:
ceph telemetry off
调优 5:允许删除存储池
Ceph 默认禁止删 pool,练习时很不方便。打开这个开关(仅学习环境):
ceph config set mon mon_allow_pool_delete true
调优 6:存储池 PG 数量取小值
PG(归置组)太多会白白消耗内存和 CPU。3 个 OSD 的小集群,每个 pool 给 32 个 PG 就足够:
# 后面创建存储池时直接指定 PG 数,见第 10 章
ceph osd pool create rbdpool 32 32
7.1 容量水位提醒
Ceph 默认的容量告警线:
| 水位 | 阈值 | 触发后表现 |
| NEARFULL(近满) | 85% | HEALTH_WARN 告警,仍可读写 |
| BACKFILLFULL | 90% | 停止数据迁移与恢复 |
| FULL(满) | 95% | 集群转为只读,无法写入 |
容量红线 走 B 方案时总可用约 5.6 GB,实际写入请控制在 4 GB 以内;走 A 方案时可用约 9 GB,控制在 6 GB 以内。根分区剩余空间也别低于 2 GB,否则系统会出问题——用 df -h / 随时检查。
第 8 章 验收清单
逐条执行,对照期望结果:
| 命令 | 期望结果 |
| ceph -s | health: HEALTH_OK;3 mons、3 osds up and in |
| ceph osd tree | 3 个 OSD,分别分布在 ceph40 / ceph44 / ceph45 |
| ceph osd df | 能看到每个 OSD 约 10 GB 的容量 |
| ceph df | 显示总容量约 30 GB,可用约 9 GB |
| ceph orch host ls | 3 台主机,均带 _admin 标签 |
| ceph orch ps | mon / mgr / osd / crash 容器状态均为 running |
8.1 打开 Dashboard 看一眼
浏览器访问(注意是 https):
https://192.168.128.40:8443
账号 admin,密码 Admin@123。首次登录会提示改密码,可以选跳过。
关于图表空白 因为我们跳过了监控栈,Dashboard 里依赖 Prometheus 的性能曲线图会是空的,但集群状态、OSD 分布、容量这些核心信息都正常显示。等以后磁盘空间充裕了,可用 ceph orch apply prometheus 补装监控栈。
第 9 章 高可用演练(三节点最有价值的一课)
这一步两节点集群根本做不了,是三节点部署最值得体验的部分:模拟一台机器宕机,看集群如何自愈。
9.1 模拟节点故障
在 ceph45 上执行(或者直接在虚拟机软件里把它关机,效果更真实):
shutdown -h now
9.2 观察集群反应
回到 ceph40 上观察:
ceph -s
watch -n 2 'ceph -s' # 想看动态变化用这个,Ctrl+C 退出
你会看到:集群状态变成 HEALTH_WARN,提示有 OSD down、MON 数量减少,但依然可以正常读写数据——这就是高可用的含义。3 个 MON 挂掉 1 个,剩下 2 个仍能构成 quorum。
9.3 恢复节点并观察数据自愈
把 ceph45 重新开机,等它起来后观察:
ceph -s
输出中会出现 recovery(恢复)进度,形如:
progress:
Rebalancing after osd.2 marked in (3s)
[=====.....................] 30%
等这个进度跑完,集群会重新回到 HEALTH_OK。整个过程数据是自动补齐的,不需要人工干预。
第 10 章 创建第一个块存储(RBD)
到目前为止集群只是“能跑”,这一章让它真正存点东西。以下在 ceph40 上执行。
10.1 创建存储池和镜像
# 创建存储池,PG 数 32(小集群取小值)
ceph osd pool create rbdpool 32 32
# 初始化为 RBD 用途
rbd pool init rbdpool
# 创建一个 2 GB 的块设备镜像(B 方案环境不要超过 2 GB)
rbd create rbdpool/disk1 --size 2G
# 查看
rbd ls rbdpool
rbd info rbdpool/disk1
10.2 映射到本地并挂载
# 映射成本地块设备
rbd map rbdpool/disk1
# 查看映射结果,通常会得到 /dev/rbd0
rbd device list
# 格式化
mkfs.xfs /dev/rbd0
# 挂载使用
mkdir -p /mnt/ceph-rbd
mount /dev/rbd0 /mnt/ceph-rbd
df -h /mnt/ceph-rbd
如果 rbd map 失败 通常是缺少内核 rbd 模块或 xfsprogs,执行 modprobe rbd 与 dnf install -y xfsprogs 后重试。若仍不行,可改用 rbd-nbd map rbdpool/disk1(需安装 ceph-common 中的 rbd-nbd)。
10.3 写入测试
echo 'hello ceph' > /mnt/ceph-rbd/test.txt
cat /mnt/ceph-rbd/test.txt
ceph df # 观察 USED 容量变化
10.4 清理(练习完想删掉)
umount /mnt/ceph-rbd
rbd unmap /dev/rbd0
rbd rm rbdpool/disk1
ceph osd pool delete rbdpool rbdpool --yes-i-really-really-mean-it
第 11 章 常见故障排查
| 现象 | 原因 | 解决办法 |
| bootstrap 报错主机名 localhost | 虚拟机默认主机名不合法 | hostnamectl set-hostname ceph40,重新登录 shell |
| bootstrap 长时间卡在拉镜像 | quay.io 国内访问慢 | 提前执行 podman pull quay.io/ceph/ceph:v20,或换网络重试 |
| orch host add 提示要密码 | SSH 公钥没分发成功 | 重跑 ssh-copy-id -f -i /etc/ceph/ceph.pub root@目标主机 |
| ceph44 上敲 ceph 命令连不上 | 该主机缺少 _admin 标签 | ceph orch host label add ceph44 _admin |
| OSD 加不进去,提示设备不可用 | 磁盘有残留分区或文件系统 | 在对应机器上执行 wipefs -a /dev/sdb 后再添加 |
| ceph -s 一直是 HEALTH_WARN | OSD 数量不足或 MON 未形成 quorum | ceph health detail 查看具体原因,按提示处理 |
| 部署中途提示磁盘空间不足 | 系统盘太小 | 执行 dnf clean all、清 journald,或把系统盘扩到 20 GB 以上 |
| 集群变成只读 | 容量达到 95% FULL 水位 | 删除部分数据,或扩容 OSD 容量 |
11.1 查看日志的正确姿势
ceph health detail # 先看健康检查详情,最有用
ceph orch ps # 看哪个容器没起来
cephadm logs --name mon.ceph40 # 看某个守护进程的日志
journalctl -u ceph-$(ceph fsid)@mon.ceph40 -f
第 12 章 推倒重来
学习阶段装坏了很正常,重来比抢救更快。在每台机器上执行:
# 1. 删除集群(每条命令会要求确认,加 --force 跳过)
cephadm rm-cluster --force --fsid $(ceph fsid)
# 2. 清空数据盘
wipefs -a /dev/sdb
# 3. 清理残留配置
rm -rf /etc/ceph/* /var/lib/ceph/* /var/lib/containers/*
注意 第 3 步会连同容器镜像一起删除,重装时需要重新拉取。如果只想重置集群而保留镜像,跳过最后一条的 /var/lib/containers/*。
附录 常用命令速查
| 命令 | 作用 |
| ceph -s | 集群总览,最常用的一条 |
| ceph health detail | 查看告警的具体原因 |
| ceph osd tree | OSD 拓扑,看数据分布在哪台机器 |
| ceph osd df | 每个 OSD 的容量使用情况 |
| ceph df | 集群整体容量 |
| ceph orch host ls | 集群中的主机列表 |
| ceph orch ps | 所有守护进程运行状态 |
| ceph orch device ls | 列出各主机可用磁盘 |
| ceph config dump | 查看所有已修改的配置项 |
| ceph osd pool ls | 列出所有存储池 |
| cephadm shell | 进入带 ceph 命令的容器环境 |
| ceph orch apply mon --placement="h1,h2,h3" | 指定 MON 部署位置 |
部署口诀:改主机名 → 装 podman → bootstrap 加 --skip-monitoring-stack → ssh-copy-id + host add → 部署 mon/mgr → daemon add osd → 精简调参。全程约 30–40 分钟可出 HEALTH_OK。
共有 0 条评论