Ceph原生命令部署:离线环境手动搭建MON/MGR/OSD集群

发布时间:2026/9/18 21:30:00
Ceph原生命令部署:离线环境手动搭建MON/MGR/OSD集群
简介本资源是一份面向IT运维工程师与存储系统架构师的Ceph集群手动部署实战指南聚焦AlmaLinux 8.9环境下使用Ceph原生命令从零构建高可用分布式存储集群的完整流程。内容覆盖MON、MGR、OSD、MDS、RGW五大核心组件的逐节点部署、源配置优化含AlmaLinux与Ceph双源替换、GPG校验关闭等关键实操、依赖安装、密钥生成及常见陷阱警示兼具原理说明与工程落地经验。资源为单文件PDF文档共1个文件大小427KB轻量易读适合作为现场部署参考手册或进阶学习笔记。目前已有115人学习下载读者可直接获取清晰的集群规划表、命令级操作序列、真实环境参数配置如Ceph 17.2.7三节点复用部署拓扑、以及epel源集成、dnf缓存更新等关键环节的排错提示显著提升部署成功率与系统理解深度。1. 不依赖 Ansible 或 Cephadm用原生命令从零搭起可运行的 Ceph 集群——适合离线环境、PVE 节点复用、或需精确控制每个服务生命周期的运维场景很多工程师第一次接触 Ceph 部署时会直接跳进cephadm bootstrap或ceph-ansible的封装里结果在 PVE 环境下因容器运行时冲突报错在离线机房因缺少 Python 包管理器卡在pip install cephadm或在审计严格的生产环境中被要求“禁用所有自动化部署脚本”。其实 Ceph 自带的一套原生命令ceph-mon,ceph-mgr,ceph-osd,ceph-authtool,ceph-create-keys等完全能构建出功能完整、符合官方推荐拓扑的集群——它不依赖 Python 环境、不拉取远程镜像、不生成临时容器所有进程直跑在宿主机上配置文件和密钥全由人工显式生成与分发。本文面向已掌握 Linux 基础服务管理systemd、firewalld、SELinux、熟悉存储节点规划OSD 数量/磁盘绑定/网络分离的中级以上运维与平台工程师目标是用纯ceph命令链完成 MON/MGR/OSD 三类核心服务的手动初始化、密钥分发、服务注册与健康验证全程无 Ansible、无 cephadm、无容器层干扰最终输出一个ceph -s显示HEALTH_OK且ceph osd tree可见全部 OSD 的真实集群。2. 用ceph-mon和ceph-authtool初始化 Monitor 节点并生成初始密钥环Monitor 是 Ceph 集群的“大脑”负责维护集群地图monmap、处理客户端认证请求、协调 Paxos 投票。原生命令部署的第一步不是写配置文件而是先生成可信的 monitor 密钥与初始 monmap——这一步若跳过或用ceph-authtool --gen-print-key随机生成再手动拼接后续 OSD 启动时会因auth: unable to find a keyring拒绝加入。2.1 创建 monitor 数据目录并生成 monitor 密钥# 在首个 monitor 节点如 node1执行 mkdir -p /var/lib/ceph/mon/ceph-node1 ceph-authtool --create-keyring /var/lib/ceph/mon/ceph-node1/keyring --gen-key -n mon. --cap mon allow *提示--cap mon allow *是 monitor 进程自身的权限声明表示允许其读写 monmap、处理选举等全部 monitor 职责。此处不能省略引号否则 shell 会将*展开为当前目录文件名。2.2 构建初始 monmap 并注入 monitor 地址# 获取 monitor 节点 IP假设 node1 IP 为 192.168.10.11 MON_IP192.168.10.11 MON_NAMEnode1 # 创建空 monmap monmaptool --create --clobber --add $MON_NAME $MON_IP:3300 --fsid $(uuidgen) /tmp/monmap # 将 monmap 注入 keyring关键步骤否则 ceph-mon 启动失败 ceph-authtool /var/lib/ceph/mon/ceph-node1/keyring --import-monmap /tmp/monmap注意--add $MON_NAME $MON_IP:3300中的端口必须是3300Ceph Monitor 默认端口不可写成6789或其他--fsid必须用uuidgen生成唯一值不能复用已有集群的 FSID否则 OSD 加入时会报fsid mismatch。2.3 启动 monitor 服务并验证监听状态# 手动启动 monitor不走 systemd便于调试 ceph-mon --id node1 --setuser ceph --setgroup ceph --mkfs --mon-data /var/lib/ceph/mon/ceph-node1 --monmap /tmp/monmap # 启动守护进程 ceph-mon --id node1 --setuser ceph --setgroup ceph --mon-data /var/lib/ceph/mon/ceph-node1 --public-addr $MON_IP:3300 # 验证端口监听 ss -tlnp | grep :3300 # 应输出LISTEN 0 128 *:3300 *:* users:((ceph-mon,pidXXXX,fd20))逻辑说明--mkfs参数会初始化 monitor 数据库leveldb生成mon_node1/目录下的store.db--public-addr显式指定对外地址避免 ceph-mon 自动解析 hostname 导致绑定到 127.0.0.1--setuser/group ceph强制以非 root 用户运行符合安全基线要求。参数作用是否必填常见误配--idmonitor 实例名必须与 keyring 中-n mon.后缀一致✅写成mon1而非node1导致 auth 失败--mon-datamonitor 数据目录路径需提前chown ceph:ceph✅路径不存在或权限为 root启动报Permission denied--public-addr客户端连接地址格式IP:PORT✅漏写端口或写成hostname:3300DNS 不可达时失败--monmap初始 monmap 文件路径仅首次启动需要⚠️首次必填复用旧 monmap 导致新节点无法加入3. 用ceph-mgr手动部署 Manager 服务并启用基础模块Managermgr是 Ceph 的“操作中枢”负责提供 REST API、Prometheus 指标、Dashboard、Zabbix 集成等扩展能力。原生命令部署 mgr 的核心在于先生成 mgr 密钥再通过ceph auth add注册到 monitor最后启动 mgr 进程绑定到已存在的 monmap。与 monitor 不同mgr 不参与 Paxos 投票因此无需嵌入 monmap但必须能连通 monitor。3.1 生成 mgr 密钥并注入集群认证库# 在 node1 上执行与 monitor 同节点或独立节点均可 mkdir -p /var/lib/ceph/mgr/ceph-node1 # 生成 mgr 密钥 ceph-authtool --create-keyring /var/lib/ceph/mgr/ceph-node1/keyring --gen-key -n mgr.node1 --cap mon profile mgr --cap osd allow * --cap mds allow * --cap pg allow * # 将密钥导入 monitor此时 monitor 已运行 ceph auth add mgr.node1 -i /var/lib/ceph/mgr/ceph-node1/keyring提示--cap mon profile mgr表示该 mgr 实例拥有 manager profile 权限可调用 monitor 的 mgr 相关接口--cap osd allow *是 dashboard 模块读取 OSD 状态所必需漏掉会导致ceph dashboard is not enabled。3.2 启动 mgr 服务并启用关键模块# 启动 mgr同样不走 systemd ceph-mgr --id node1 --setuser ceph --setgroup ceph --mgr-data /var/lib/ceph/mgr/ceph-node1 # 启用 dashboard 模块需先安装 ceph-mgr-dashboard 包 ceph mgr module enable dashboard # 配置 dashboard 监听地址假设 node1 有管理网卡 192.168.10.11 ceph dashboard set-login-banner Ceph Cluster: Production - Manual Deploy ceph dashboard set-ssl-certificate ceph dashboard set-frontend-api-host 192.168.10.11 ceph dashboard set-frontend-api-port 8443注意ceph dashboard set-ssl-certificate会自动生成自签名证书若需替换为公司 CA 签发证书应将dashboard.crt和dashboard.key放入/var/lib/ceph/mgr/ceph-node1/并执行ceph dashboard set-ssl-certificate重新加载。3.3 验证 mgr 状态与模块加载# 查看 mgr 是否在线 ceph status | grep mgr # 正常输出mgr: node1(active, since 2h ago) # 查看已启用模块 ceph mgr dump | jq .modules # 应包含 dashboard, prometheus, restful 等 # 检查 dashboard 是否响应需 curl 安装 curl -k https://192.168.10.11:8443/ # 返回 HTML 页面即成功逻辑说明ceph-mgr启动后会自动向 monitor 注册自身信息monitor 通过ceph status可感知其存活ceph mgr module enable是幂等操作重复执行无副作用set-frontend-api-host必须设为 mgr 所在节点的实际 IP不能是0.0.0.0dashboard 会拒绝绑定。4. 用ceph-osd命令逐台初始化 OSD 并加入集群OSDObject Storage Daemon是 Ceph 的数据存储单元原生命令部署 OSD 的难点在于磁盘准备、密钥分发、crush map 绑定、服务注册四步必须严格串行且每步失败都会导致ceph osd tree中缺失节点。不同于 cephadm 的自动磁盘擦除手动模式需显式调用ceph-volume lvm create或裸设备初始化本文采用更可控的 LVM 方式。4.1 准备 OSD 物理磁盘并创建 LVM 逻辑卷# 在 OSD 节点如 node2执行 # 假设 /dev/sdb 为数据盘/dev/sdc 为 WAL/DB 盘可选 pvcreate /dev/sdb vgcreate ceph-vol /dev/sdb lvcreate -l 100%FREE -n osd-data ceph-vol # 若使用独立 WAL/DB 盘提升小 IO 性能 pvcreate /dev/sdc vgcreate ceph-wal /dev/sdc lvcreate -L 20G -n osd-wal ceph-wal lvcreate -L 50G -n osd-db ceph-wal提示lvcreate -l 100%FREE确保数据 LV 占满整块盘避免后续ceph-osd初始化时报device is too smallWAL/DB 分区大小需按集群规模估算单 OSD WAL 推荐 20GDB 推荐 50G。4.2 生成 OSD 密钥并注册到 monitor# 在 node1monitor 节点执行 # 创建新 OSD ID返回数字如 0 OSD_ID$(ceph osd create) # 生成该 OSD 的密钥 ceph auth get-or-create osd.$OSD_ID osd allow * mon allow profile osd -o /var/lib/ceph/osd/ceph-$OSD_ID/keyring # 将密钥复制到 node2 的对应目录 scp /var/lib/ceph/osd/ceph-$OSD_ID/keyring node2:/var/lib/ceph/osd/ceph-$OSD_ID/注意ceph osd create返回的是 OSD 的整数 ID如0不是字符串名-o参数指定密钥输出路径必须与后续ceph-osd的--keyring路径一致mon allow profile osd是 OSD 进程向 monitor 请求 map 更新的必要权限。4.3 初始化 OSD 数据目录并启动服务# 在 node2 上执行 mkdir -p /var/lib/ceph/osd/ceph-0 # 初始化 OSDLVM 模式 ceph-osd --id 0 --mkfs --mkkey --osd-uuid $(uuidgen) --keyring /var/lib/ceph/osd/ceph-0/keyring --osd-data /var/lib/ceph/osd/ceph-0 # 格式化逻辑卷为 XFSCeph 推荐 mkfs.xfs -f -i size2048 /dev/ceph-vol/osd-data # 挂载并设置属主 mount /dev/ceph-vol/osd-data /var/lib/ceph/osd/ceph-0 chown -R ceph:ceph /var/lib/ceph/osd/ceph-0 # 启动 OSD ceph-osd --id 0 --setuser ceph --setgroup ceph --osd-data /var/lib/ceph/osd/ceph-0 --keyring /var/lib/ceph/osd/ceph-0/keyring逻辑说明--mkfs创建 OSD 元数据目录结构current/,whoami,superblock--mkkey生成 OSD 自身密钥区别于 auth 密钥--osd-uuid必须用uuidgen生成唯一值否则多 OSD 共享 UUID 会导致数据混乱挂载后chown是必须步骤否则 ceph-osd 以 ceph 用户启动时无法写入。4.4 验证 OSD 是否成功加入集群# 在 node1 上执行 ceph osd tree # 应看到类似 # ID CLASS WEIGHT TYPE NAME STATUS REWEIGHT PRI-AFF # -1 0.09396 root default # -3 0.09396 host node2 # 0 hdd 0.09396 osd.0 up 1.00000 1.00000 ceph osd stat # 输出osd: 1 up (since 2m), 1 in (since 2m)常见失败排查ceph osd tree无输出 → 检查ceph-osd进程是否存活ps aux | grep ceph-osd日志在/var/log/ceph/ceph-osd.0.logOSD 状态为down→ 检查ceph auth get osd.0是否返回密钥确认 keyring 路径与--keyring参数一致REWEIGHT为 0 → 执行ceph osd reweight 0 1.0手动恢复权重5. 用ceph orch命令补全集群拓扑并验证跨节点通信能力当单节点 MON/MGR/OSD 验证通过后真实生产环境必然需要多节点部署。原生命令不提供ceph orch的编排能力但ceph orch子命令属于ceph-common包可用于手动注册额外 monitor、mgr、osd 节点并强制刷新 crush map这是离线环境下替代 cephadm 的关键补位操作。尤其适用于 PVE 环境中多个 KVM 虚拟机共用同一物理网卡的场景。5.1 在第二 monitor 节点node2上部署 monitor# 在 node2 上创建目录并同步密钥 mkdir -p /var/lib/ceph/mon/ceph-node2 scp node1:/var/lib/ceph/mon/ceph-node1/keyring /var/lib/ceph/mon/ceph-node2/keyring scp node1:/tmp/monmap /tmp/monmap-node2 # 修改 monmap添加 node2 monmaptool /tmp/monmap-node2 --add node2 192.168.10.12:3300 monmaptool /tmp/monmap-node2 --print # 确认包含 node1 和 node2 # 初始化并启动 node2 monitor ceph-mon --id node2 --setuser ceph --setgroup ceph --mkfs --mon-data /var/lib/ceph/mon/ceph-node2 --monmap /tmp/monmap-node2 ceph-mon --id node2 --setuser ceph --setgroup ceph --mon-data /var/lib/ceph/mon/ceph-node2 --public-addr 192.168.10.12:3300提示monmaptool --add必须在 node2 上执行因为--print输出需确认新增节点已写入--public-addr使用 node2 自身 IP不可复用 node1 的地址。5.2 使用ceph orch注册新节点并触发 map 同步# 在 node1 上执行需安装 ceph-common # 注册 node2 为 monitor ceph orch host add node2 192.168.10.12 # 强制推送 monmap 到所有 monitor ceph mon dump | grep epoch\|node1\|node2 # 查看当前 epoch ceph mon failover node2 # 触发 monmap 重推模拟故障转移测试 # 验证双 monitor 状态 ceph quorum_status | jq .quorum_names # 应输出[node1, node2]注意ceph orch host add并非启动服务而是将节点元数据写入 monitor 的 CRUSH mapceph mon failover是安全的强制同步操作不会中断服务仅更新 monmap 版本号。5.3 验证跨节点 OSD 通信与数据写入# 创建测试 pool ceph osd pool create testpool 32 32 replicated # 设置 pool 的最小副本数 ceph osd pool set testpool size 2 ceph osd pool set testpool min_size 2 # 写入测试对象 echo hello ceph manual deploy | rados -p testpool put testobj - # 从另一节点读取在 node2 上执行 rados -p testpool get testobj - | cat # 应输出hello ceph manual deploy # 查看对象位置 ceph osd map testpool testobj # 输出类似osdmap e123 pool testpool (10) object testobj - pg 10.77e71a07 (10.7) - up ([0,1], p0) acting ([0,1], p0)逻辑说明rados put/get是最底层的对象读写验证绕过 RBD/CephFS 抽象层直接测试 OSD 网络连通性ceph osd map输出中的up ([0,1], p0)表示对象副本分布在 OSD 0 和 OSD 1 上证明跨节点数据分布生效若acting显示单 OSD说明 crush rule 未生效需检查ceph osd crush rule dump。6. 用ceph config命令持久化关键参数并规避 Windows/WSL 环境常见陷阱原生命令部署完成后所有配置仍停留在内存或临时文件中。ceph config是 Ceph v14 引入的集中式配置管理机制可将mon_host,osd_journal_size,ms_bind_msgr1等参数写入 monitor 的 KV 存储实现重启不丢失、跨节点自动同步。这对 Windows Subsystem for LinuxWSL或 PVE 中 Ubuntu 模板克隆场景尤为重要——避免因/etc/ceph/ceph.conf被覆盖导致集群分裂。6.1 将关键配置写入 monitor 的配置数据库# 设置全局 monitor 地址替代 ceph.conf 中的 mon_host ceph config set global mon_host 192.168.10.11:3300,192.168.10.12:3300 # 设置 OSD journal 大小若使用 filestore已弃用但兼容旧环境 ceph config set osd osd_journal_size 5120 # 启用 msgr2 协议提升网络性能v15 默认 ceph config set global ms_type async # 设置 client rbd 缓存大小影响虚拟机 I/O ceph config set client rbd_cache_size 33554432提示ceph config set的section如global,osd,client决定配置生效范围ms_type async是 msgr2 协议标识比默认的simple协议吞吐高 30% 以上rbd_cache_size单位为字节33554432 32MB。6.2 导出配置到本地文件供备份与审计# 导出全部配置含注释 ceph config dump /root/ceph-config-dump-$(date %F).txt # 导出特定 section ceph config get global | grep -E (mon_host|ms_type) # 输出mon_host 192.168.10.11:3300,192.168.10.12:3300 # ms_type async # 生成最小化 ceph.conf供 rbd/nfs-ganesha 等客户端使用 ceph config generate-minimal-conf /etc/ceph/ceph.conf注意ceph config generate-minimal-conf会自动合并global和client配置生成精简版ceph.conf比手动编写更可靠该文件可直接分发给 Windows WSL 中的rbd客户端解决msstore 执行此命令时发生意外错类问题本质是 WSL 的 DNS 解析与 Windows 主机冲突而 minimal-conf 强制指定mon_hostIP绕过 DNS。6.3 针对 PVE 离线环境的加固技巧在 Proxmox VEPVE中部署 Ceph 常遇apt update 失败或ceph-deploy 不可用。此时应预下载所有 deb 包在联网机器执行apt download ceph-base ceph-mon ceph-mgr ceph-osd拷贝到 PVE 节点后dpkg -i *.deb禁用 systemd-resolvedsystemctl disable systemd-resolved systemctl stop systemd-resolved避免与 PVE 的 dnsmasq 冲突固定内核模块版本echo blacklist rbd /etc/modprobe.d/blacklist.conf防止 PVE 自动升级内核后 rbd 模块加载失败OSD 日志重定向在/var/lib/ceph/osd/ceph-0/下创建ceph-osd.0.conf添加[osd] log_file /var/log/ceph/ceph-osd.0.log debug_osd 1/5 # 生产环境调为 0/1最后一行技术动作执行ceph health detail确认输出中无HEALTH_WARN或HEALTH_ERR且所有 OSD 的IN和UP状态均为1即完成原生命令部署的终态验证。本文还有配套的精品资源点击获取