根本原因是OSD进程未运行或未被集群识别;需依次检查systemctl状态、journal日志、设备路径漂移(尤其SSD)、网络连通性、时间同步及元数据一致性。

OSD 处于 down 或 out 状态却无法自动上线,根本原因几乎总是「OSD 进程没起来」或「起来了但没被集群识别」,而不是配置或策略问题。自动上线只在特定条件下触发(如网络恢复、进程重启后主动注册),它不会“猜”你是不是修好了磁盘或改对了地址。
确认OSD进程是否真在运行
很多人看到 ceph osd tree 显示 down,第一反应是调 ceph osd in,但其实进程可能压根没跑起来。
- 在对应节点执行
systemctl status ceph-osd@(例如ceph-osd@1),看是否为active (running);若显示inactive (dead)或failed,说明服务根本没启动 - 检查
journalctl -u ceph-osd@,重点搜-n 100 --no-pager device not found、permission denied、failed to bind、crush location parse error - 特别注意:如果用
ceph-volume lvm activate启动,得再看/var/lib/ceph/osd/ceph-,里面常有更底层的错误(比如 LVM LV 找不到、XFS mount 失败)/stderr
检查设备路径是否漂移(尤其 SSD/NVMe 场景)
SSD 盘符漂移是 down 后无法恢复的最隐蔽高频原因——设备还在,但 OSD 找不到它了。
- 执行
ls -l /dev/disk/by-id/,对比当前实际设备名(如nvme-eui.002538594c1234567890)和 OSD 元数据中记录的路径(/var/lib/ceph/osd/ceph-是个 symlink,/block readlink它) - 若 symlink 指向的
/dev/sdb已不存在,而真实设备现在是/dev/sdc,说明盘符漂移了;此时不能直接ln -sf修复,必须用ceph-volume lvm activate --force重新绑定持久 ID - 验证方式:
ceph-volume lvm list输出里devices字段应显示 by-id 路径,而非 /dev/sdX
验证 OSD 是否能与 Monitor 正常通信
OSD 进程起来了,也绑对了设备,但仍是 down,大概率卡在心跳环节。
- 检查
ceph.conf中该 OSD 的public_addr和cluster_addr是否指向当前节点的真实 IP(不是 127.0.0.1,也不是已失效的网卡别名) - 在 OSD 节点上执行
telnet(Monitor 端口)和6789 telnet(OSD 数据端口,用于其他 OSD 通信),确认端口可达6800 - 检查防火墙:
iptables -L -n | grep 6789或ufw status,Ceph 默认需要开放 6789(MON)、6800–7300(OSD)范围 - 注意时钟偏移:若节点时间比 Monitor 快/慢 > 0.5s,OSD 会拒绝加入;用
chronyc tracking或ntpq -p验证
为什么 ceph osd in 有时无效
手动执行 ceph osd in osd. 只是把 OSD 标记为“允许接收 PG”,不解决底层问题。如果进程没起来、设备找不到、网络不通,它会立刻再次变成 down。
-
in命令生效的前提是:OSD 进程正在运行,并且已向 Monitor 发送过一次有效 heartbeat(通常在启动后几秒内) - 若执行
in后状态仍不稳,立即查ceph -w输出,看是否有osd.类日志——这说明 Monitor 主动踢掉了它addr ... marking down - 真正该用
in的场景,是确认所有底层条件都满足后,OSD 却因短暂网络抖动被标记out,且未自动恢复;此时in+ 等待 30 秒观察即可
最常被忽略的点是:OSD 的元数据(/var/lib/ceph/osd/ceph-、ceph_fsid、fsid)必须与集群全局一致。一旦误删或覆盖,即使进程跑起来,Monitor 也会拒绝认证——这种情况下 ceph auth get osd. 返回空,且 journal 里会出现 auth: unable to find a key for osd.。










