根本原因是网络或容器运行时问题;常见于docker 24.0+与cephadm socket路径不匹配、ntp时间不同步、mds未启动、hostname解析异常及udev设备状态丢失。

cephadm 部署失败卡在 cephadm bootstrap 无响应
根本原因通常是网络或容器运行时问题,不是配置写错。Cephadm 默认用 podman,但很多生产环境只装了 Docker,它会静默 fallback 到 Docker,而某些 Docker 版本(如 24.0+)与 cephadm 的 socket 路径假设不一致,导致初始化挂起。
- 先确认容器引擎:运行
podman version或docker version,若两者都存在,显式指定——加--container-engine podman或--container-engine docker - 检查
/run/podman/podman.sock或/var/run/docker.sock是否可读,普通用户需加入podman或docker用户组 - 禁用防火墙临时验证:
sudo systemctl stop firewalld(centos/RHEL)或sudo ufw disable(ubuntu),cephadm 依赖大量临时端口通信 - 别用 root 以外的用户跑
cephadm bootstrap,即使加了 sudo,环境变量(如$HOME)残留也可能让 cephadm 找不到密钥目录
mon 节点选举失败,ceph -s 显示 HEALTH_WARN 且 mon_map 不完整
mon 是 Ceph 的大脑,但它的 quorum 机制对时间同步极其敏感。哪怕 0.5 秒偏差,mon 就拒绝加入集群,表现为反复重启、日志里刷 failed to join quorum。
- 强制所有节点走同一 NTP 源:
sudo chronyd -q 'pool pool.ntp.org iburst',再sudo systemctl restart chronyd - 检查 mon 节点 hostname 解析:每个 mon 主机名必须能被其他所有节点
ping通,且hostname -f输出的 FQDN 必须和cephadm bootstrap时传入的--mon-ip所属网卡地址匹配 - 别手动改
/etc/ceph/ceph.conf——cephadm 管理的集群禁止直接编辑该文件,所有配置必须用ceph config set,否则下次cephadm upgrade会覆盖
osd 添加后始终处于 down + out,ceph-volume lvm create 日志报 No data for device
这不是磁盘坏了,而是 ceph-volume 没识别到裸设备上下文。常见于用 LVM 卷、NVMe 多路径或云盘挂载后又 umount 的场景——设备节点还在,但 udev 数据已丢失。
- 运行
sudo udevadm trigger刷新内核设备树,再sudo udevadm settle等待完成 - 确认磁盘没被其他服务占用:
lsblk -f看是否挂载或有文件系统;sudo lsof /dev/sdX查进程占用 - 避免用
/dev/mapper/xxx这类名字——ceph-volume 对 device-mapper 支持不稳定,优先用/dev/disk/by-path/下的稳定路径 - 如果用了加密盘(如 LUKS),ceph-volume 不支持,必须提前解密并映射为裸块设备
客户端 mount cephfs 报错 Connection timed out 或 Permission denied
cephfs mount 失败极少是秘钥问题,绝大多数是 MDS(Metadata Server)没起来,或者 kernel client 和 ceph 版本不兼容。
- 先查 MDS 状态:
ceph mds stat,输出应为:1 {0=cephfs-a=up:active},若显示0或stopping,说明 MDS 进程崩溃,看journalctl -u ceph-mds@*.service - kernel client 在较新内核(5.15+)默认禁用旧协议,加挂载参数
,-o ms_mode=secure强制走 v2 协议;若服务端是 Octopus 以前版本,则需-o ms_mode=legacy - 不要用
ceph-fuse替代 kernel mount 做长期服务——它单线程、无缓存、CPU 占用高,仅适合调试 - 挂载命令里
name=后面的用户名必须已在 Ceph 中创建,且有mds allow rwx权限,用ceph auth get-or-create client.xxx mon 'allow r' mds 'allow rwx' osd 'allow rw pool=xxx'创建
最常被忽略的是 mon 节点间的时间差和 MDS 的启动状态,这两个点不排查清楚,其他操作都是白忙。