Files
wiki/存储/Ceph/知识库/15-命令速查手册.md
T
2026-09-18 13:49:11 +08:00

4073 lines
215 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
> 基于 Ceph 官方文档整理 | 文档版本:**Tentacle v20.2.4** | 抓取日期:2026-09-17 | 源文:ceph/ceph@v20.2.4 `doc/man/8/`
> 官网入口:https://docs.ceph.com/en/tentacle/man/8/
# 第 15 册 · Ceph 命令速查手册
## 本册导读
本册是**速查型**分册,不讲解原理,只回答一个问题:**"我要做什么 → 用哪个命令、怎么敲"**。
全文覆盖 `doc/man/8/` 下的 **36 个命令**,按主题分为 8 组:集群与通用、密钥与认证、MON/OSD 工具、RADOS、RBD、CephFS、RGW、ceph-volume。每个命令一节,含:用途一句话 → 语法 → 常用选项表 → 可拷贝的示例 → 注意事项/常见坑 → 来源链接。
### 总速查表:我要做什么 → 用哪个命令
| 我要做什么 | 命令 | 一句话用法 |
|---|---|---|
| 看集群健康/状态 | `ceph` | `ceph -s` / `ceph health detail` / `ceph status` |
| 看容量使用 | `ceph` / `rados` | `ceph df detail` / `rados df` |
| 看 OSD 状态与树 | `ceph` | `ceph osd tree` / `ceph osd df tree` / `ceph osd stat` |
| 看 PG 状态/卡住的 PG | `ceph` | `ceph pg stat` / `ceph pg dump_stuck inactive` |
| 创建/删除/改池 | `ceph` | `ceph osd pool create <pool> <pg_num>` |
| 调整池的 size / pg_num | `ceph` | `ceph osd pool set <pool> size 3` |
| 在线改配置 | `ceph` | `ceph config set <who> <option> <value>` |
| 只读配置文件里的值(离线) | `ceph-conf` | `ceph-conf --name osd.0 --lookup "osd data"` |
| 创建/查看/改 keyring | `ceph-authtool` | `ceph-authtool -C -n client.foo --gen-key keyring` |
| 管理集群内的认证实体 | `ceph` | `ceph auth get-or-create client.foo mon 'allow r'` |
| 查 monmap / 改 monmap | `monmaptool` | `monmaptool --print monmap` |
| 导出/编辑/导入 CRUSH map | `crushtool` | `crushtool -d crushmap -o map.txt` |
| 从 osdmap 取/灌 CRUSH map | `osdmaptool` | `osdmaptool osdmap --export-crush cm.txt` |
| 模拟 upmap 均衡 | `osdmaptool` | `osdmaptool osdmap --upmap upmaps.out --upmap-active` |
| 评估改 CRUSH 的影响 | `crushdiff` | `crushdiff compare cm.txt` |
| 上传/下载对象 | `rados` | `rados -p foo put myobj file` / `rados -p foo get myobj out` |
| 做对象存储性能压测 | `rados` | `rados -p foo bench 60 write --no-cleanup` |
| 创建/删除/改 RBD 镜像 | `rbd` | `rbd create mypool/myimage --size 102400` |
| 快照 / 克隆 / 回滚 | `rbd` | `rbd snap create ...` / `rbd clone ...` / `rbd snap rollback ...` |
| 映射/卸载 RBD 块设备 | `rbd` / `rbd-nbd` | `rbd device map mypool/myimage` |
| 开机自动映射 RBD | `rbdmap` | `systemctl enable rbdmap.service` |
| 挂载 CephFS(内核) | `mount.ceph` | `mount -t ceph user@.fs_name=/ /mnt -o mon_addr=1.2.3.4` |
| 挂载 CephFS(FUSE) | `ceph-fuse` | `ceph-fuse -m mon1:6789 /mnt/mycephfs` |
| 交互式逛 CephFS | `cephfs-shell` | `cephfs-shell -c ~/.cephfs-shell.conf` |
| 建 RGW 用户/密钥 | `radosgw-admin` | `radosgw-admin user create --uid=johnny --display-name="johnny rotten"` |
| 查/删 RGW bucket | `radosgw-admin` | `radosgw-admin bucket stats --bucket=foo` |
| 多站点 realm/zonegroup/zone | `radosgw-admin` | `radosgw-admin realm create --rgw-realm=...` |
| 部署 OSD(LVM) | `ceph-volume` | `ceph-volume lvm create --data /dev/sda` |
| 看本机磁盘清单 | `ceph-volume` | `ceph-volume inventory --format json-pretty` |
| OSD 崩了自动拉起 | `ceph-run` | `ceph-run ceph-osd -i 0 -f` |
| 生成崩溃调试包 | `ceph-debugpack` | `ceph-debugpack debug.tar.gz` |
| 上传日志给开发者 | `ceph-post-file` | `ceph-post-file -d 'mon log' /var/log/ceph/ceph-mon.*.log` |
| 解码二进制结构体排障 | `ceph-dencoder` | `ceph-dencoder type object_info_t import /tmp/a decode dump_json` |
| 离线翻 RocksDB(omap) | `ceph-kvstore-tool` | `ceph-kvstore-tool rocksdb /var/lib/ceph/osd/ceph-0 list` |
| 查 librados 版本 | `librados-config` | `librados-config --version` |
| 压测 CephFS(合成负载) | `ceph-syn` | `ceph-syn --syn makedirs 10 5 3` |
> 💡 补充:本手册按"使用频率 + 主题"组织。`ceph`、`rbd`、`radosgw-admin` 三个命令子命令极多,已按子命令分组做表,其余命令按命令分节。
---
## 一、集群与通用
### 1.1 `ceph`
**用途**:Ceph 集群的管理与控制总入口,涵盖 auth / osd / pool / pg / mon / mgr / mds / fs / config / health / status / tell 等全部日常运维动作。
**语法(synopsis,保留原文格式)**:
```text
ceph auth [ add | caps | del | export | get | get-key | get-or-create | get-or-create-key | import | list | print-key | print_key ] ...
ceph compact
ceph config [ dump | ls | help | get | show | show-with-defaults | set | rm | log | reset | assimilate-conf | generate-minimal-conf ] ...
ceph config-key [ rm | exists | get | ls | dump | set ] ...
ceph daemon <name> | <path> <command> ...
ceph daemonperf <name> | <path> [ interval [ count ] ]
ceph df {detail}
ceph fs [ add_data_pool | authorize | dump | feature ls | flag set | get | ls | lsflags | new | rename | reset | required_client_features add | required_client_features rm | rm | rm_data_pool | set | swap ] ...
ceph fsid
ceph health {detail}
ceph injectargs <injectedargs> [ <injectedargs>... ]
ceph log <logtext> [ <logtext>... ]
ceph mds [ compat | fail | rm | rmfailed | set_state | stat | repaired ] ...
ceph mon [ add | dump | enable_stretch_mode | getmap | remove | stat ] ...
ceph osd [ blocklist | blocked-by | create | new | deep-scrub | df | down | dump | erasure-code-profile | find | getcrushmap | getmap | getmaxosd | in | ls | lspools | map | metadata | ok-to-stop | ok-to-upgrade | out | pause | perf | pg-temp | force-create-pg | primary-affinity | primary-temp | repair | reweight | reweight-by-pg | rm | destroy | purge | safe-to-destroy | scrub | set | setcrushmap | setmaxosd | stat | tree | unpause | unset ] ...
ceph osd crush [ add | add-bucket | create-or-move | dump | get-tunable | link | move | remove | rename-bucket | reweight | reweight-all | reweight-subtree | rm | rule | set | set-tunable | show-tunables | tunables | unlink ] ...
ceph osd pool [ create | delete | get | get-quota | ls | mksnap | rename | rmsnap | set | set-quota | stats ] ...
ceph osd pool application [ disable | enable | get | rm | set ] ...
ceph osd tier [ add | add-cache | cache-mode | remove | remove-overlay | set-overlay ] ...
ceph pg [ debug | deep-scrub | dump | dump_json | dump_pools_json | dump_stuck | getmap | ls | ls-by-osd | ls-by-pool | ls-by-primary | map | repair | scrub | stat ] ...
ceph quorum_status
ceph report { <tags> [ <tags>... ] }
ceph status
ceph sync force {--yes-i-really-mean-it} {--i-know-what-i-am-doing}
ceph tell <name (type.id)> <command> [options...]
ceph tell <pgid> <command> [options...]
ceph version
```
#### 常用全局选项
| 选项 | 参数 | 默认值 | 说明 |
|---|---|---|---|
| `-i infile`, `--in-file=infile` | 文件路径 | 无 | 指定输入文件,作为 payload 随命令发给 monitor 集群;仅用于特定的 monitor 命令 |
| `-o outfile`, `--out-file=outfile` | 文件路径 | 无 | 把 monitor 返回的 payload 写到文件(如 `osd getmap`) |
| `--setuser user` | 用户名/uid | 无 | 给 `-o` 指定的输出文件设置属主 |
| `--setgroup group` | 组名/gid | 无 | 给 `-o` 指定的输出文件设置属组 |
| `-c ceph.conf`, `--conf=ceph.conf` | 文件路径 | `/etc/ceph/ceph.conf` | 使用指定配置文件,启动时据此确定 monitor 地址 |
| `--id CLIENT_ID`, `--user CLIENT_ID` | id | 无 | 认证用的 client id |
| `--name CLIENT_NAME`, `-n CLIENT_NAME` | TYPE.ID | 无 | 认证用的完整 client 名 |
| `--cluster CLUSTER` | 集群名 | 无 | Ceph 集群名 |
| `--admin-daemon ADMIN_SOCKET`, `daemon DAEMON_NAME` | socket 路径/守护进程名 | 无 | 通过 `/var/run/ceph` 下的 admin socket 提交 admin-socket 命令 |
| `--admin-socket ADMIN_SOCKET_NOPE` | — | 无 | 文档原文提示:"You probably mean --admin-daemon" |
| `-s`, `--status` | — | 无 | 显示集群状态 |
| `-w`, `--watch` | — | 无 | 实时观察默认 `cluster` 通道的集群变化 |
| `-W`, `--watch-channel` | 通道名 | 无 | 实时观察任意通道(`cluster`、`audit`、`cephadm`,或 `*` 表示全部) |
| `--watch-debug` | — | 无 | 观察 debug 事件 |
| `--watch-info` | — | 无 | 观察 info 事件 |
| `--watch-sec` | — | 无 | 观察 security 事件 |
| `--watch-warn` | — | 无 | 观察 warning 事件 |
| `--watch-error` | — | 无 | 观察 error 事件 |
| `--version`, `-v` | — | 无 | 显示版本 |
| `--verbose` | — | 无 | 更详细输出 |
| `--concise` | — | 无 | 更精简输出 |
| `-f {json,json-pretty,xml,xml-pretty,plain,yaml}`, `--format` | 格式名 | 无 | 输出格式。**注意:`yaml` 仅对 `orch` 命令有效** |
| `--daemon-output-file OUTPUT_FILE` | 文件路径或 `:tmp:` | 无 | `--format=json\|json-pretty` 时,把输出流式写到**运行守护进程的那台主机**上的文件;仅用于 `ceph tell` |
| `--connect-timeout CLUSTER_TIMEOUT` | 秒 | 无 | 连接集群的超时时间 |
| `--no-increasing` | — | 默认关闭 | 用于 `reweight-by-utilization` / `test-reweight-by-utilization`:即使是低利用率 OSD 也不允许上调权重 |
| `--block` | — | 无 | 阻塞直到完成(**仅 scrub 与 deep-scrub**) |
#### 子命令分组速查
**① 全局状态与信息**
| 子命令 | 语法 | 说明 |
|---|---|---|
| `status` / `-s` | `ceph status` | 显示集群状态 |
| `health` | `ceph health {detail}` | 显示集群健康 |
| `df` | `ceph df {detail}` | 显示集群剩余空间状态 |
| `fsid` | `ceph fsid` | 显示集群 FSID/UUID |
| `version` | `ceph version` | 显示 mon 守护进程版本 |
| `features` | `ceph features` | 显示已连接守护进程/客户端的 release 与 feature 分布 |
| `report` | `ceph report {<tags> [<tags>...]}` | 汇报集群完整状态,可带标题 tag |
| `quorum_status` | `ceph quorum_status` | 汇报 monitor quorum 状态 |
| `log` | `ceph log <logtext> [<logtext>...]` | 把文本写入 monitor 日志 |
| `compact` | `ceph compact` | 触发 monitor RocksDB 存储 compaction |
| `injectargs` | `ceph injectargs <injected_args> [<injected_args>...]` | 向 monitor 注入配置参数 |
| `sync force` | `ceph sync force {--yes-i-really-mean-it} {--i-know-what-i-am-doing}` | 强制同步 |
**② `auth`(认证)**
| 子命令 | 语法 | 说明 |
|---|---|---|
| `add` | `ceph auth add [--key-type=<cipher>] <entity> {<caps> [<caps>...]}` | 从输入文件添加认证信息;无输入则生成随机 key。不输出 key 信息 |
| `caps` | `ceph auth caps <entity> <caps> [<caps>...]` | 更新 entity 的 caps |
| `del` | `ceph auth del <entity>` | 删除 entity 的全部 caps |
| `export` | `ceph auth export {<entity>}` | 导出 keyring;不指定 entity 则导出 master keyring |
| `get` | `ceph auth get <entity>` | 写出含指定 key 的 keyring 文件 |
| `get-key` | `ceph auth get-key <entity>` | 显示指定 key |
| `get-or-create` | `ceph auth get-or-create [--key-type=<cipher>] <entity> {<caps> [<caps>...]}` | 获取或创建,输出 `.ini` 格式 |
| `get-or-create-key` | `ceph auth get-or-create-key <entity> {<caps> [<caps>...]}` | key 已存在时给定 caps 必须匹配;输出纯文本 key |
| `import` | `ceph auth import` | 从输入文件读入 keyring |
| `ls` | `ceph auth ls` | 列出认证状态 |
| `print-key` / `print_key` | `ceph auth print-key <entity>` | 显示指定 key |
| `rotate` | `ceph auth rotate [--key-type=<cipher>] <entity>` | 轮换 key,输出 `.ini` 格式 |
| `dump-keys` | `ceph --format=json auth dump-keys` | 导出整个 key 数据库(含 rotating service keys);格式必须是 `json` 或 `json-pretty` |
| `wipe-rotating-service-keys` | `ceph auth wipe-rotating-service-keys` | 清除所有 rotating service keys 并强制 mon 刷新。**文档明确警告:不理解后果不要执行** |
> 说明:上述所有 `auth` 子命令中,若省略 `--key-type`,则使用集群的 preferred cipher。
**③ `config` / `config-key`**
| 子命令 | 语法 | 说明 |
|---|---|---|
| `config dump` | `ceph config dump` | 导出集群全部配置项 |
| `config ls` | `ceph config ls` | 列出全部配置项名称 |
| `config help` | `ceph config help <option>` | 描述指定配置项 |
| `config get` | `ceph config get <who> {<option>}` | 只显示 monitor 管理的选项 |
| `config show` | `ceph config show {<who>}` | 显示**实际生效**的全部配置(含编译默认值、mon 配置库、ceph.conf、运行时覆盖),因此可能与 `get` 不同 |
| `config show-with-defaults` | `ceph config show {<who>}` | 显示运行配置 + 编译内置默认值 |
| `config set` | `ceph config set <who> <option> <value> {--force}` | 设置选项 |
| `config rm` | `ceph config rm <who> <option>` | 清除选项 |
| `config log` | `ceph config log {<count>}` | 显示配置变更历史,count 省略时默认 10 |
| `config reset` | `ceph config reset <version>` | 回退配置到指定历史版本 |
| `config assimilate-conf` | `ceph config assimilate-conf -i <input-config-path> > <output-config-path>` | 从 stdin 吸收配置,输出最小 conf |
| `config generate-minimal-conf` | `ceph config generate-minimal-conf > <minimal-config-path>` | 生成最小 `ceph.conf` |
| `config-key rm/exists/get/ls/dump/set` | `ceph config-key <cmd> <key> {<val>}` | monitor 提供的通用 k/v 服务,主要给 ceph-mgr 模块存选项 |
**④ `mon` / `mgr`**
| 子命令 | 语法 | 说明 |
|---|---|---|
| `mon add` | `ceph mon add <name> <IPaddr[:port]>` | 新增 monitor |
| `mon dump` | `ceph mon dump {<int[0-]>}` | 导出格式化 monmap,可指定 epoch |
| `mon getmap` | `ceph mon getmap {<int[0-]>}` | 获取 monmap |
| `mon remove` | `ceph mon remove <name>` | 移除 monitor |
| `mon stat` | `ceph mon stat` | monitor 状态摘要 |
| `mon set` | `ceph mon set <name> <value>` | 设置 monmap 设置项。有效 name:`auth_service_cipher`、`auth_allowed_ciphers`、`auth_preferred_cipher`(取值含义见 `monmaptool`) |
| `mon enable_stretch_mode` | `ceph mon enable_stretch_mode <tiebreaker_mon> <new_crush_rule> <dividing_bucket>` | 启用 stretch mode;PG 要 peer 成功需 `min_size` 副本在**所有**(当前为两个)`<dividing_bucket>` CRUSH bucket 中都 active |
| `mgr dump` | `ceph mgr dump` | 导出最新 MgrMap(含 active/standby mgr) |
| `mgr fail` | `ceph mgr fail <name>` | 标记某 mgr 失败(若为 active,standby 接管) |
| `mgr module ls` | `ceph mgr module ls` | 列出已启用的 mgr 模块 |
| `mgr module enable` | `ceph mgr module enable <module>` | 启用模块(可用模块见 `mgr dump`) |
| `mgr module disable` | `ceph mgr module disable <module>` | 停用模块 |
| `mgr metadata` | `ceph mgr metadata [name]` | 报告 mgr 守护进程元数据 |
| `mgr versions` | `ceph mgr versions` | 统计运行中的守护进程版本数量 |
| `mgr count-metadata` | `ceph mgr count-metadata <field>` | 统计任意守护进程元数据字段 |
**⑤ `osd`(OSD 与 CRUSH)**
| 子命令 | 语法 | 说明 |
|---|---|---|
| `osd stat` | `ceph osd stat` | OSD map 摘要 |
| `osd dump` | `ceph osd dump {<int[0-]>}` | OSD map 摘要(可指定 epoch) |
| `osd tree` | `ceph osd tree {<int[0-]>}` | 打印 OSD 树 |
| `osd df` | `ceph osd df {plain\|tree}` | OSD 利用率 |
| `osd ls` | `ceph osd ls {<int[0-]>}` | 列出所有 OSD id |
| `osd lspools` | `ceph osd lspools {<int>}` | 列出池 |
| `osd find` | `ceph osd find <int[0-]>` | 在 CRUSH map 中定位某 OSD |
| `osd metadata` | `ceph osd metadata {int[0-]}`(默认全部) | 获取 OSD 元数据 |
| `osd perf` | `ceph osd perf` | OSD perf 统计摘要 |
| `osd in` / `osd out` | `ceph osd in\|out <ids> [<ids>...]` | 把 OSD 置为 in / out |
| `osd down` | `ceph osd down <ids> [<ids>...]` | 把 OSD 置为 down |
| `osd blocked-by` | `ceph osd blocked-by` | 打印哪些 OSD 正在阻塞对端的直方图 |
| `osd scrub` / `deep-scrub` / `repair` | `ceph osd scrub\|deep-scrub\|repair <who>` | 发起 scrub / deep-scrub / repair |
| `osd reweight` | `osd reweight <int[0-]> <float[0.0-1.0]>` | 调整 reweight,范围 0.0 < weight < 1.0 |
| `osd reweight-by-pg` | `ceph osd reweight-by-pg {<int[100-]>} {<poolname> [<poolname...]} {--no-increasing}` | 按 PG 分布重算权重,默认过载判定阈值 120 |
| `osd reweight-by-utilization` | `ceph osd reweight-by-utilization {<int[100-]> {<float[0.0-]> {<int[0-]>}}} {--no-increasing}` | 按利用率重算;默认:过载阈值 120、最大权重变化 0.05、最多调 4 个 OSD |
| `osd primary-affinity` | `ceph osd primary-affinity <osdname (id\|osd.id)> <float[0.0-1.0]>` | 调整 primary-affinity |
| `osd pg-temp` | `ceph osd pg-temp <pgid> {<id> [<id>...]}` | 设置 pg_temp 映射(开发者) |
| `osd primary-temp` | `ceph osd primary-temp <pgid> <id>` | 设置 primary_temp(开发者) |
| `osd force-create-pg` | `ceph osd force-create-pg <pgid>` | 强制创建 PG |
| `osd pause` / `unpause` | `ceph osd pause` / `ceph osd unpause` | 暂停 / 恢复 OSD |
| `osd set` | `ceph osd set pause\|noup\|nodown\|noout\|noin\|nobackfill\|norebalance\|norecover\|noscrub\|nodeep-scrub\|notieragent` | 设置集群级 flag |
| `osd unset` | `ceph osd unset pause\|noup\|nodown\|noout\|noin\|nobackfill\|norebalance\|norecover\|noscrub\|nodeep-scrub\|notieragent` | 取消集群级 flag |
| `osd create` | `ceph osd create {<uuid>} {<id>}` | **自 Luminous 起已 DEPRECATED**,将来会移除;请改用 `osd new` |
| `osd new` | `ceph osd new {<uuid>} {<id>} -i {<params.json>}` | 创建新 OSD 或按指定 id 重建;JSON 内可含 `cephx_secret`、`cephx_lockbox_secret`、`dmcrypt_key`、`crush_device_class` |
| `osd rm` | `ceph osd rm <ids> [<ids>...]` | 从 OSD map 移除 |
| `osd destroy` | `ceph osd destroy <id> {--yes-i-really-mean-it}` | 标记 destroyed,删除其 CephX key 与 dm-crypt / daemon-private config key;不会从 crush 或 osdmap 移除。**前提:OSD 必须先被标记 lost** |
| `osd purge` | `ceph osd purge <id> {--yes-i-really-mean-it}` | 等价于 `osd destroy` + `osd rm` + `osd crush remove` |
| `osd lost` | `ceph osd lost <int[0-]> {--yes-i-really-mean-it}` | 标记 OSD 永久丢失。**文档原警告:若无其他副本则销毁数据** |
| `osd safe-to-destroy` | `ceph osd safe-to-destroy <id> [<ids>...]` | 判断删除/销毁是否安全(成功码=安全,否则报错码+信息) |
| `osd ok-to-stop` | `ceph osd ok-to-stop <id> [<ids>...] [--max <num>]` | 判断这批 OSD 能否同时停而不影响可用性;`--max` 时额外从 CRUSH 相邻位置补齐可停 OSD |
| `osd ok-to-upgrade` | `ceph osd ok-to-upgrade <crush_bucket_name> <new_ceph_version_short> [--max <num>]` | 找出某 CRUSH bucket 内可同时安全升级的 OSD 集合;bucket 类型只能是 `rack`/`chassis`/`host`/`osd` |
| `osd setmaxosd` | `ceph osd setmaxosd <int[0-]>` | 设置新的最大 OSD 值 |
| `osd getmaxosd` | `ceph osd getmaxosd` | 显示最大 OSD id |
| `osd getmap` | `ceph osd getmap {<int[0-]>}` | 获取 OSD map |
| `osd getcrushmap` | `ceph osd getcrushmap {<int[0-]>}` | 获取 CRUSH map |
| `osd setcrushmap` | `ceph osd setcrushmap` | 从输入文件设置 CRUSH map |
| `osd set-require-min-compat-client` | `ceph osd set-require-min-compat-client <version>` | 强制集群向后兼容指定客户端版本;若有已连接守护进程/客户端不兼容则失败 |
| `osd erasure-code-profile get/ls/rm/set` | `ceph osd erasure-code-profile set <name> {<profile> [<profile>...]}` | 管理 EC profile;`set` 末尾加 `--force` 可覆盖已有 profile(**有风险**) |
| `osd blocklist add` | `ceph osd blocklist add <EntityAddr> {<float[0.0-]>}` | 加入 blocklist,可指定过期秒数 |
| `osd blocklist ls` / `rm` | `ceph osd blocklist ls` / `ceph osd blocklist rm <EntityAddr>` | 查看 / 移除 blocklist |
**⑥ `osd crush`(CRUSH 管理)**
| 子命令 | 语法 | 说明 |
|---|---|---|
| `crush add` | `ceph osd crush add <osdname (id\|osd.id)> <float[0.0-]> <args> [<args>...]` | 添加/更新 crushmap 位置与权重 |
| `crush add-bucket` | `ceph osd crush add-bucket <name> <type>` | 添加无父(通常是 root)bucket |
| `crush create-or-move` | `ceph osd crush create-or-move <osdname (id\|osd.id)> <float[0.0-]> <args> [<args>...]` | 创建或移动条目 |
| `crush dump` | `ceph osd crush dump` | 导出 crush map |
| `crush get-tunable` | `ceph osd crush get-tunable straw_calc_version` | 获取 tunable(仅 `straw_calc_version`) |
| `crush set-tunable` | `ceph osd crush set-tunable straw_calc_version <value>` | 设置 tunable(仅 `straw_calc_version`) |
| `crush show-tunables` | `ceph osd crush show-tunables` | 显示当前 tunables |
| `crush tunables` | `ceph osd crush tunables legacy\|argonaut\|bobtail\|firefly\|hammer\|optimal\|default` | 一次性把 tunables 设为某 profile |
| `crush link` / `unlink` | `ceph osd crush link\|unlink <name> <args> [<args>...]` | 在指定位置挂接 / 摘除条目 |
| `crush move` | `ceph osd crush move <name> <args> [<args>...]` | 移动条目 |
| `crush remove` / `rm` | `ceph osd crush remove\|rm <name> {<ancestor>}` | 从 crush map 移除(全局或仅某祖先下) |
| `crush rename-bucket` | `ceph osd crush rename-bucket <srcname> <dstname>` | 重命名 bucket |
| `crush reweight` | `ceph osd crush reweight <name> <float[0.0-]>` | 改权重 |
| `crush reweight-all` | `ceph osd crush reweight-all` | 重算整树权重使其求和正确 |
| `crush reweight-subtree` | `ceph osd crush reweight-subtree <name> <weight>` | 改某 name 下所有叶子权重 |
| `crush tree` | `ceph osd crush tree` | 树形展示 bucket 与 item |
| `crush set` | `ceph osd crush set`(单独使用:从输入文件设置 crush map)<br>`ceph osd crush set <osdname (id\|osd.id)> <float[0.0-]> <args> [<args>...]` | 见左 |
| `crush rule create-erasure` | `ceph osd crush rule create-erasure <name> {<profile>}` | 为 EC 池创建规则(profile 默认 `default`) |
| `crush rule create-simple` | `ceph osd crush rule create-simple <name> <root> <type> {firstn\|indep}` | 创建简单规则;默认 `firstn`,EC 池推荐 `indep` |
| `crush rule dump` | `ceph osd crush rule dump {<name>}`(默认全部) | 导出规则 |
| `crush rule ls` / `rm` | `ceph osd crush rule ls` / `ceph osd crush rule rm <name>` | 列出 / 删除规则 |
**⑦ `osd pool`(存储池)**
| 子命令 | 语法 | 说明 |
|---|---|---|
| `pool create` | `ceph osd pool create <poolname> {<int[0-]>} {<int[0-]>} {replicated\|erasure} {<erasure_code_profile>} {<rule>} {<int>} {--autoscale-mode=<on,off,warn>}` | 创建池 |
| `pool delete` | `ceph osd pool delete <poolname> {<poolname>} {--yes-i-really-really-mean-it}` | 删除池 |
| `pool ls` | `ceph osd pool ls {detail}` | 列出池 |
| `pool rename` | `ceph osd pool rename <poolname> <poolname>` | 重命名 |
| `pool get` | `ceph osd pool get <poolname> size\|min_size\|pg_num\|pgp_num\|crush_rule\|write_fadvise_dontneed` | 取池参数;另有 tier 专用项、EC 专用 `erasure_code_profile`;`all` 取全部适用参数 |
| `pool set` | `ceph osd pool set <poolname> size\|min_size\|pg_num\|pgp_num\|crush_rule\|hashpspool\|nodelete\|nopgchange\|nosizechange\|hit_set_type\|hit_set_period\|hit_set_count\|hit_set_fpp\|debug_fake_ec_pool\|target_max_bytes\|target_max_objects\|cache_target_dirty_ratio\|cache_target_dirty_high_ratio\|cache_target_full_ratio\|cache_min_flush_age\|cache_min_evict_age\|min_read_recency_for_promote\|write_fadvise_dontneed\|hit_set_grade_decay_rate\|hit_set_search_last_n <val> {--yes-i-really-mean-it}` | 设置池参数 |
| `pool get-quota` | `ceph osd pool get-quota <poolname>` | 取对象/字节限额 |
| `pool set-quota` | `ceph osd pool set-quota <poolname> max_objects\|max_bytes <val>` | 设置限额 |
| `pool stats` | `ceph osd pool stats {<name>}` | 池统计 |
| `pool mksnap` / `rmsnap` | `ceph osd pool mksnap\|rmsnap <poolname> <snap>` | 创建 / 删除池快照 |
| `pool application enable` | `ceph osd pool application enable <pool-name> <app> {--yes-i-really-mean-it}` | 给池打应用注解(`rgw`/`rbd`/`cephfs`) |
| `pool application disable` | `ceph osd pool application disable <pool-name> <app> {--yes-i-really-mean-it}` | 取消注解 |
| `pool application get` | `ceph osd pool application get {<pool-name>} {<app>} {<key>}` | 查注解(都不传则显示全部池全部应用的键值) |
| `pool application set` / `rm` | `ceph osd pool application set <pool-name> <app> <key> <value>` / `... rm <pool-name> <app> <key>` | 设置 / 删除键值 |
**⑧ `osd tier`(分层)**
| 子命令 | 语法 | 说明 |
|---|---|---|
| `tier add` | `ceph osd tier add <poolname> <poolname> {--force-nonempty}` | 把第二个池作为 tier 加到第一个(base)池 |
| `tier add-cache` | `ceph osd tier add-cache <poolname> <poolname> <int[0-]>` | 添加指定大小的 cache tier |
| `tier cache-mode` | `ceph osd tier cache-mode <poolname> writeback\|proxy\|readproxy\|readonly\|none` | 设置 cache 模式 |
| `tier remove` | `ceph osd tier remove <poolname> <poolname>` | 移除 tier |
| `tier set-overlay` | `ceph osd tier set-overlay <poolname> <poolname>` | 设置 overlay 池 |
| `tier remove-overlay` | `ceph osd tier remove-overlay <poolname>` | 移除 overlay 池 |
**⑨ `pg`(放置组)**
| 子命令 | 语法 | 说明 |
|---|---|---|
| `pg stat` | `ceph pg stat` | PG 状态 |
| `pg dump` | `ceph pg dump {all\|summary\|sum\|delta\|pools\|osds\|pgs\|pgs_brief} [...]` | 人类可读的 pg map(只有 `all` 可与 plain 同用) |
| `pg dump_json` | `ceph pg dump_json {all\|summary\|sum\|delta\|pools\|osds\|pgs\|pgs_brief} [...]` | JSON 版 |
| `pg dump_pools_json` | `ceph pg dump_pools_json` | 仅池信息,JSON |
| `pg dump_stuck` | `ceph pg dump_stuck {inactive\|unclean\|stale\|undersized\|degraded [...]} {<int>}` | 卡住的 PG |
| `pg ls` | `ceph pg ls {<int>} {<pg-state> [<pg-state>...]}` | 按池/OSD/状态列出 PG |
| `pg ls-by-osd` | `ceph pg ls-by-osd <osdname (id\|osd.id)> {<int>} {<pg-state>...}` | 按 OSD 列 |
| `pg ls-by-pool` | `ceph pg ls-by-pool <poolstr> {<int>} {<pg-state>...}` | 按池列 |
| `pg ls-by-primary` | `ceph pg ls-by-primary <osdname (id\|osd.id)> {<int>} {<pg-state>...}` | 按 primary OSD 列 |
| `pg map` | `ceph pg map <pgid>` | 显示 PG→OSD 映射 |
| `pg scrub` / `deep-scrub` / `repair` | `ceph pg scrub\|deep-scrub\|repair <pgid>` | 发起 scrub / deep-scrub / repair |
| `pg debug` | `ceph pg debug unfound_objects_exist\|degraded_pgs_exist` | PG 调试信息 |
| `pg getmap` | `ceph pg getmap` | 获取二进制 pg map 到 `-o`/stdout |
| `tell <pgid> scrub` | `ceph tell <pgid> scrub` | 向该 PG 当前 primary OSD 发命令 |
| `tell <pgid> deep-scrub` | `ceph tell <pgid> deep-scrub` | 同上,deep-scrub |
| `tell <pgid> scrub-abort` | `ceph tell <pgid> scrub-abort` | 中止进行中的 scrub,并清除之前的 scrub/deep-scrub 操作请求 |
**⑩ `fs` / `mds`(CephFS 管理)**
| 子命令 | 语法 | 说明 |
|---|---|---|
| `fs ls` | `ceph fs ls` | 列出文件系统 |
| `fs new` | `ceph fs new <fs_name> <metadata> <data>` | 用指定元数据池/数据池创建 FS |
| `fs get` | `ceph fs get <fs-name>` | 显示 FS 信息(设置 + ranks),是 `fs dump` 的子集 |
| `fs dump` | `ceph fs dump [epoch]` | 显示指定 epoch(默认当前)的 FSMap |
| `fs set` | `ceph fs set <fs-name> <fs-setting> <value>` | 设置 FS 参数 |
| `fs rm` | `ceph fs rm <fs_name> {--yes-i-really-mean-it}` | 停用(删除)文件系统 |
| `fs rename` | `ceph fs rename <fs-name> <new-fs-name> {--yes-i-really-mean-it}` | 重命名,并同步更新池上的 application tag |
| `fs swap` | `ceph fs swap <fs1-name> <fs1-id> <fs2-name> <fs2-id> [--swap-fscids] {--yes-i-really-meant-it}` | 交换两个 FS 的名字(可选同时交换 FSID) |
| `fs reset` | `ceph fs reset <fs_name> {--yes-i-really-mean-it}` | **仅用于灾难恢复**:重置为单 MDS map |
| `fs add_data_pool` | `ceph fs add_data_pool <fs-name> <pool name/id>` | 添加数据池 |
| `fs rm_data_pool` | `ceph fs rm_data_pool <fs-name> <pool name/id>` | 移除数据池(该池上文件数据将不可用;默认数据池不可移除) |
| `fs authorize` | `ceph fs authorize [--key-type=<cipher>] <fs_name> client.<client_id> <path> <perms> [<path> <perms>...]` | 给某路径授权客户端,`<perms>` 可为 `r`/`rw`/`rwp` |
| `fs flag set` | `ceph fs flag set <flag-name> <flag-val> --yes-i-really-mean-it` | 设置全局 CephFS flag(目前只有 `enable_multiple`) |
| `fs lsflags` | `ceph fs lsflags <fs-name>` | 显示 FS 上所有 flag |
| `fs feature ls` | `ceph fs feature ls` | 列出当前版本支持的所有 CephFS 特性 |
| `fs required_client_features add/rm` | `ceph fs required_client_features <fs name> add\|rm <feature-name>` | 增删客户端必备特性要求 |
| `mds stat` | `ceph mds stat` | MDS 状态 |
| `mds fail` | `ceph mds fail <role\|gid>` | 强制 MDS 进入 fail 状态 |
| `mds rm` | `ceph mds rm <int[0-]> <name> (type.id)>` | 移除非活跃 MDS |
| `mds rmfailed` | `ceph mds rmfailed <int[0-]>` | 移除已失败的 MDS |
| `mds set_state` | `ceph mds set_state <int[0-]> <int[0-20]>` | 设置 MDS 状态为数值状态 |
| `mds repaired` | `ceph mds repaired <role>` | 把损坏的 MDS rank 标记为已修复 |
| `mds compat show` | `ceph mds compat show` | 显示 MDS 兼容性设置 |
| `mds compat rm_compat` / `rm_incompat` | `ceph mds compat rm_compat\|rm_incompat <int[0-]>` | 移除兼容/不兼容特性 |
**⑪ `daemon` / `daemonperf` / `tell` / `quorum` / `heap`**
| 子命令 | 语法 | 说明 |
|---|---|---|
| `daemon` | `ceph daemon {daemon_name\|socket_path} {command} ...` | 通过 admin socket 提交命令 |
| `daemonperf` | `ceph daemonperf {daemon_name\|socket_path} [{interval} [{count}]]` | 实时观察某守护进程的性能计数器 |
| `tell` | `ceph tell <name (type.id)> <command> [options...]` | 向指定守护进程发命令 |
| `tell help` | `ceph tell <name (type.id)> help` | 列出该守护进程所有可用命令 |
| `quorum` | `ceph tell mon.<id> quorum enter\|exit` | 让指定 MON 进入/退出 quorum |
| `heap` | `ceph tell <name (type.id)> heap dump\|start_profiler\|stop_profiler\|stats` | 显示堆使用信息(**仅在使用 tcmalloc 编译时可用**) |
| `heap release` | `ceph tell <name (type.id)> heap release` | 让 TCMalloc 立即把不再使用的内存归还内核 |
| `heap get_release_rate` / `set_release_rate` | `ceph tell <name (type.id)> heap get_release_rate\|set_release_rate {<val>}` | 获取/设置 TCMalloc 内存释放速率;`0`=永不归还,`1`=每归还 1 页后等 1000 页;**默认 1.0** |
#### 典型示例
```bash
# 集群概览
ceph -s
ceph health detail
ceph df detail
ceph fsid
ceph version
ceph features
# 实时观察
ceph -w # 观察 cluster 通道
ceph -W cephadm # 观察 cephadm 通道
ceph --watch-warn # 只看 warning 事件
# 认证
ceph auth get-or-create client.foo mon 'allow r' osd 'allow rw pool=mypool'
ceph auth caps client.foo mon 'allow r' osd 'allow rw pool=mypool'
ceph auth ls
ceph auth print-key client.foo
ceph --format=json auth dump-keys
# 配置
ceph config dump
ceph config get osd.0 osd_memory_target
ceph config set osd osd_memory_target 4294967296
ceph config show osd.0
ceph config log 20
ceph config reset 3
ceph config generate-minimal-conf > /tmp/minimal.conf
# MON / MGR
ceph mon dump
ceph mon add mon4 10.0.0.14:3300
ceph mon enable_stretch_mode mon5 stretch_rule datacenter
ceph mgr module ls
ceph mgr module enable dashboard
ceph mgr fail mon1
# OSD 日常
ceph osd tree
ceph osd df tree
ceph osd perf
ceph osd out 3
ceph osd in 3
ceph osd reweight 3 0.8
ceph osd reweight-by-utilization 120 0.05 4
ceph osd primary-affinity osd.3 0.5
ceph osd scrub 3
ceph osd deep-scrub 3 --block
ceph osd ok-to-stop 3 --max 4
ceph osd safe-to-destroy 3
ceph osd set noout
ceph osd unset noout
# OSD 生命周期
ceph osd new 6d92a3c2-... 5 -i params.json # JSON 内含 cephx_secret 等
ceph osd lost 5 --yes-i-really-mean-it
ceph osd destroy 5 --yes-i-really-mean-it
ceph osd purge 5 --yes-i-really-mean-it
ceph osd setmaxosd 100
# CRUSH
ceph osd crush add-bucket rack1 rack
ceph osd crush move rack1 root=default
ceph osd crush add osd.3 1.0 host=node1 rack=rack1
ceph osd crush reweight osd.3 0.9
ceph osd crush rule create-simple myrule default host firstn
ceph osd crush rule dump myrule
ceph osd crush tunables optimal
ceph osd getcrushmap -o /tmp/crush.bin
ceph osd setcrushmap -i /tmp/crush.bin
# 池
ceph osd pool create mypool 128 128 replicated --autoscale-mode=on
ceph osd pool ls detail
ceph osd pool set mypool size 3
ceph osd pool set mypool pg_num 256 --yes-i-really-mean-it
ceph osd pool get mypool all
ceph osd pool set-quota mypool max_bytes 100G
ceph osd pool application enable mypool rbd --yes-i-really-mean-it
ceph osd pool stats mypool
ceph osd erasure-code-profile set ec42 k=4 m=2 crush-failure-domain=host
ceph osd pool create ecpool 64 64 erasure ec42
# PG
ceph pg stat
ceph pg dump_stuck inactive unclean stale
ceph pg ls-by-pool mypool
ceph pg map 3.1f
ceph pg repair 3.1f
ceph tell 3.1f scrub-abort
# CephFS / MDS
ceph fs ls
ceph fs new myfs cephfs_metadata cephfs_data
ceph fs authorize myfs client.foo / rw
ceph fs set myfs max_mds 2
ceph mds stat
ceph mds fail 0
ceph mds repaired 0
# 守护进程直连
ceph daemon osd.0 help
ceph daemon osd.0 config show
ceph daemonperf osd.0 1 10
ceph tell osd.0 help
ceph tell mon.a quorum enter
# 输出格式
ceph -f json-pretty status
ceph osd tree --format json
```
#### 注意事项 / 常见坑
- `ceph osd create` 自 Luminous 起**已废弃**,请用 `ceph osd new`;`osd new` 的 JSON 参数文件里必须提供 `client.osd.<id>` 的 base64 CephX key,若指定 dm-crypt 则必须同时给出对应的 lockbox CephX key。
- `osd destroy` 不会把 OSD 从 crush 或 osdmap 移除,只标记为 destroyed;**执行前该 OSD 必须先被标记为 lost**。要彻底清理用 `osd purge`。
- `osd lost` 在没有其他副本时会**销毁数据**,文档明确警告。
- `ceph osd set full` 自 Mimic 起不再被支持;`full` flag 在 Octopus 已不支持。
- `config get` 只显示 monitor 管理的选项,`config show` 显示实际生效值,两者**可能不一致**,排障时应以 `show` 为准。
- `auth dump-keys` 的输出格式必须是 `json` 或 `json-pretty`。
- `--daemon-output-file` 写文件在**运行守护进程的那台机器**上,通常不是你敲命令的机器。
- `-f yaml` 只对 `orch` 命令有效。
- `--block` 只对 scrub / deep-scrub 有效。
- `ceph auth wipe-rotating-service-keys` 文档明确要求"充分理解后果后再执行"。
- 未显式指定 `--key-type` 的 `auth` 子命令,使用集群 preferred cipher。
- `osd ok-to-upgrade` 的 CRUSH bucket 类型限制为 `rack`/`chassis`/`host`/`osd`,这是为避免大故障域带来的性能问题。
- `heap` 相关命令仅在以 tcmalloc 编译时可用。
> 💡 补充:本 man 页的 synopsis 中**未收录** `ceph orch`(cephadm 编排)与 `ceph telemetry` 子命令,仅在全局选项 `-f/--format` 处提到 `yaml` 仅对 `orch` 有效。这两个子命令族已在下方 **⑫ `ceph orch`** 与 **⑬ `ceph telemetry`** 补齐,内容取自官方文档仓库中的 `mgr/orchestrator.rst`、`mgr/telemetry.rst`、`cephadm/` 相关页面(非本 man 页)。
> 引自:[ceph](https://docs.ceph.com/en/tentacle/man/8/ceph/)
#### ⑫ `orch`(Orchestrator / cephadm 编排)
**用途**:`ceph orch` 是 Orchestrator CLI,为 orchestrator 模块(cephadm、rook 等)提供统一的命令行入口,用于声明式地部署/扩容/缩容/删除服务、管理主机与设备、升级集群。
> 💡 补充:`ceph` man 页未给出 `orch` 的 synopsis。下面的 synopsis 由官方文档中出现的各条 `ceph orch ...` 用法归纳而成,非原文逐字引用。
**语法(synopsis)**:
```text
ceph orch status [--detail]
ceph orch ls [--service_type <type>] [--service_name <name>] [--export] [--format <f>] [--refresh]
ceph orch ps [--hostname <host>] [--daemon_type <type>] [--service_name <name>] [--daemon_id <id>] [--format <f>] [--refresh]
ceph orch apply <service_type> [<svc_id>] [--placement=<placement>] [--dry-run] [--unmanaged]
ceph orch apply -i <spec.yaml> [--dry-run]
ceph orch rm <service_name> [--force]
ceph orch <start|stop|restart|redeploy|reconfig> <service_name>
ceph orch host ls [--format yaml] [--host-pattern <name>] [--label <label>] [--host-status <status>] [--detail]
ceph orch host add <hostname> [<ip>] [--labels <label>[,<label>...]]
ceph orch host rm <host> [--offline] [--force] [--rm-crush-entry]
ceph orch host drain <host> [--keep-conf-keyring] [--zap-osd-devices]
ceph orch host label add|rm <hostname> <label>
ceph orch host set-addr <hostname> <addr>
ceph orch host maintenance enter|exit <hostname> [--force] [--yes-i-really-mean-it] [--offline]
ceph orch host rescan <hostname> [--with-summary]
ceph orch device ls [--hostname=...] [--wide] [--refresh]
ceph orch device zap <hostname> <path>
ceph orch daemon add <daemon-type> --placement=<placement spec>
ceph orch daemon rm <daemon name>... [--force]
ceph orch daemon <start|stop|restart|redeploy|reconfig> <daemon name>
ceph orch daemon redeploy <daemon name> --image <new-image-name>
ceph orch upgrade start [--image <image-name> | --ceph-version <version>] [--daemon-types <types>] [--hosts <hosts>] [--services <services>] [--limit <n>]
ceph orch upgrade status
ceph orch upgrade stop
ceph orch set backend <module>
ceph orch set-unmanaged|set-managed <service_name>
ceph orch pause
ceph orch resume
```
**术语(Definition of Terms,源文原义)**:
| 术语 | 含义 |
|---|---|
| `host` | 物理主机的 hostname(**不是** DNS 名、pod 名、容器名或容器内 hostname) |
| `service type` | 服务类型,如 `nfs`、`mds`、`osd`、`mon`、`rgw`、`mgr`、`iscsi` |
| `service` | 逻辑服务,通常由分布在多主机上的多个实例组成以实现 HA;`mds` 用 `fs_name` 标识,`rgw` 用 `rgw_zone`,`nfs` 用 `ganesha_cluster_id` |
| `daemon` | service 的单个实例(通常是一个守护进程,也可能是 LIO、knfsd 之类的内核服务) |
**子命令表**:
| 子命令 | 参数 | 说明 | 示例 |
|---|---|---|---|
| `status` | `[--detail]` | 显示当前 orchestrator 模式及其高层状态(插件是否可用/可操作) | `ceph orch status` |
| `ls` | `[--service_type <type>] [--service_name <name>] [--export] [--format <f>] [--refresh]` | 列出 orchestrator 已知的服务;`--export` 导出为 YAML,可直接喂给 `ceph orch apply -i` | `ceph orch ls --service_name=rgw.foo --export > rgw.yaml` |
| `ps` | `[--hostname <host>] [--daemon_type <type>] [--service_name <name>] [--daemon_id <id>] [--format <f>] [--refresh]` | 列出所有守护进程(systemd unit)及其状态 | `ceph orch ps --daemon_type osd --daemon_id 0` |
| `apply` | `<service_type> [<svc_id>] [--placement=<placement>] [--dry-run]` | 声明式部署/扩容/缩容服务。**每条 `ceph orch apply <svc>` 会覆盖前一条同类型命令** | `ceph orch apply mds myfs --placement="3 host1 host2 host3"` |
| `apply -i` | `<spec.yaml> [--dry-run]` | 从 YAML(支持多文档)批量 apply 服务规格 | `ceph orch apply -i cluster.yaml` |
| `apply osd` | `--all-available-devices [--dry-run] [--unmanaged=true]` | 用所有可用设备部署 OSD | `ceph orch apply osd --all-available-devices --dry-run` |
| `rm` | `<service_name> [--force]` | 删除服务及其全部守护进程 | `ceph orch rm rgw.myrgw` |
| `start` / `stop` / `restart` | `<service_name>` | 启停/重启服务。**仅对 cephadm 容器化守护进程生效** | `ceph orch restart rgw.myrgw` |
| `redeploy` | `<service_name>` | 重建 `/var/lib/ceph/<fsid>/<daemon-name>` 目录结构(若不存在)、刷新配置、重新生成 unit 文件并重启 systemd 守护进程 | `ceph orch redeploy grafana` |
| `reconfig` | `<service_name>` | 刷新配置文件后重启守护进程(**假定 daemon 目录已存在**) | `ceph orch reconfig prometheus` |
| `host ls` | `[--format yaml] [--host-pattern <name>] [--label <label>] [--host-status <status>] [--detail]` | 列出主机(含 label、status);`--detail` 输出更详细信息 | `ceph orch host ls --detail` |
| `host add` | `<hostname> [<ip>] [--labels <l1>,<l2>]` | 纳管新主机;建议显式给出主机 IP(否则依赖 DNS 解析) | `ceph orch host add host2 10.10.0.102 --labels _admin` |
| `host rm` | `<host> [--offline] [--force] [--rm-crush-entry]` | 移除主机;`--offline --force` 用于离线主机(**文档警告:可能导致数据丢失**);默认不会移除关联的 CRUSH bucket,需显式 `--rm-crush-entry` | `ceph orch host rm host2` |
| `host drain` | `<host> [--keep-conf-keyring] [--zap-osd-devices]` | 排空主机:打上 `_no_schedule`(和 `_no_conf_keyring`)标签并迁移/移除守护进程;`--zap-osd-devices` 同时擦除被移除 OSD 的设备 | `ceph orch host drain host2` |
| `host label add` / `rm` | `<hostname> <label>` | 给主机增删标签(配合 `placement: label:xxx` 使用) | `ceph orch host label add host1 rgw` |
| `host set-addr` | `<hostname> <addr>` | 修改主机地址 | `ceph orch host set-addr reef1 192.168.160.11` |
| `host maintenance enter` / `exit` | `<hostname> [--force] [--yes-i-really-mean-it] [--offline]` | 进入/退出维护模式;`enter --force` 可绕过安全检查 | `ceph orch host maintenance enter host1` |
| `host rescan` | `<hostname> [--with-summary]` | 重新扫描主机设备;`--with-summary` 给出 HBA 数量等汇总 | `ceph orch host rescan host1 --with-summary` |
| `device ls` | `[--hostname=...] [--wide] [--refresh]` | 列出 `ceph-volume` 发现的磁盘;`--wide` 额外显示不可用原因(Reef 起有 `REJECT REASONS` 列)。**列会随版本变化** | `ceph orch device ls --wide` |
| `device zap` | `<hostname> <path>` | 擦除设备以便重新使用 | `ceph orch device zap my_hostname /dev/sdx` |
| `daemon add` | `<daemon-type> --placement=<placement spec>` | 在指定位置手工部署一个守护进程(仅 `unmanaged: true` 场景,官方标注"用例非常有限") | `ceph orch daemon add osd host1:/dev/sdb` |
| `daemon rm` | `<daemon name>... [--force]` | 手工移除守护进程;受管服务(`unmanaged=False`)会在数秒后自动补一个新的 | `ceph orch daemon rm mgr.my_host.xyzxyz` |
| `daemon start/stop/restart/redeploy/reconfig` | `<daemon name>` | 对单个守护进程执行动作 | `ceph orch daemon restart mgr.host1.abcdef` |
| `daemon redeploy --image` | `<daemon name> --image <new-image-name>` | 用指定镜像重新部署单个守护进程 | `ceph orch daemon redeploy mgr.example1.abcdef --image quay.io/ceph/ceph:v18` |
| `upgrade start` | `[--image <image-name> \| --ceph-version <version>] [--daemon-types <types>] [--hosts <hosts>] [--services <services>] [--limit <n>]` | 开始集群升级。自 v16.2.6 起 Docker Hub 不再使用,需指向 quay.io 镜像 | `ceph orch upgrade start --ceph-version 18.2.4` |
| `upgrade status` | — | 查看是否正在升级、目标版本。orchestrator 崩溃时会返回 `Error ENOENT: Module not found` | `ceph orch upgrade status` |
| `upgrade stop` | — | 随时停止升级 | `ceph orch upgrade stop` |
| `set backend` | `<module>` | 选择 orchestrator 后端模块;空字符串 `""` 表示禁用 | `ceph orch set backend cephadm` |
| `set-unmanaged` / `set-managed` | `<service_name>` | 设 `unmanaged: true/false`,停用/恢复该服务的自动部署与移除。对特殊的 `osd` 服务无效(会报 `No service of name osd found...`) | `ceph orch set-unmanaged mon` |
| `pause` / `resume` | — | 暂停/恢复 cephadm 后台工作。暂停后仍做被动监控(检查主机与守护进程状态),但不做任何变更(不部署/不移除) | `ceph orch pause` |
**典型示例**:
```bash
# 查看编排器状态与已部署服务
ceph orch status
ceph orch ls
ceph orch ps
# 部署监控栈(--placement 支持主机列表 / count / label / host_pattern / 正则)
ceph orch apply prometheus --placement="count:2"
ceph orch apply node-exporter --placement='*'
ceph orch apply grafana
# 部署 RGW / MDS / NFS
ceph orch apply rgw foo --port=8000 --placement="2 host1 host2"
ceph orch apply mds myfs --placement="3 host1 host2 host3"
ceph orch apply nfs foo mypool --placement="host1"
# 用 YAML 规格 apply(推荐做法:避免 apply 互相覆盖)
ceph orch ls --service-name rgw.foo --export > rgw.foo.yaml
ceph orch apply -i rgw.foo.yaml --dry-run
ceph orch apply -i rgw.foo.yaml
# 主机管理
ceph orch host ls
ceph orch host add host3 10.10.0.103
ceph orch host label add host3 mds
ceph orch host drain host3
ceph orch host rm host3 --rm-crush-entry
# 磁盘与 OSD
ceph orch device ls --wide
ceph orch apply osd --all-available-devices --dry-run
ceph orch daemon add osd host1:/dev/sdb
# 服务/守护进程动作
ceph orch restart rgw.foo
ceph orch redeploy prometheus
ceph orch daemon rm mon.oldhost1 --force
# 升级
ceph -s # 先确认集群健康、主机在线
ceph orch upgrade start --ceph-version 18.2.4
ceph orch upgrade start --image quay.io/ceph/ceph:v18.2.4
ceph orch upgrade status
ceph orch upgrade stop
# 暂停 cephadm 后台动作
ceph orch pause
ceph orch resume
```
**注意事项 / 常见坑**:
- `ceph orch apply <service>` 每条都会**覆盖**同类型的前一条命令。连续执行 `ceph orch apply mon host1`、`host2`、`host3`,最终只有 host3 上有 mon;正确写法是 `ceph orch apply mon "host1,host2,host3"` 或用 YAML 规格。
- `ceph orch ps` 默认状态每 10 分钟才刷新一次;可用 `ceph config set mgr mgr/cephadm/daemon_cache_timeout 60` 缩短,或加 `--refresh` 立即刷新(大集群会耗时)。
- `start`/`stop`/`restart`/`redeploy`/`reconfig` **仅对 cephadm 容器化守护进程生效**。
- `host rm --offline --force` 文档明确警告**可能导致数据丢失**;且默认不删除 CRUSH bucket,需要 `--rm-crush-entry`。
- 带 `_no_schedule` 标签的主机不会被 cephadm 部署守护进程。
- `-f yaml` **只对 `orch` 命令有效**(这也是 `ceph` man 页唯一提到 `orch` 的地方)。
- orchestrator 各后端(Rook / Cephadm)对上述命令的实现程度不同:例如 `host maintenance`、`upgrade` 在 Rook 上未实现或不适用,`apply prometheus`/`alertmanager`/`node-exporter` 在 Rook 上不适用。
- `orch device ls` 的输出列在不同 release 间会变化;`Health`/`Ident`/`Fault` 列依赖 `libstoragemgmt` 集成,需先 `ceph config set mgr mgr/cephadm/device_enhanced_scan true`(文档提醒先在硬件上验证兼容性)。
> 💡 补充:`ceph orch sd dump cert`、`ceph orch cert-store get cert cephadm_root_ca_cert`、`ceph orch osd ident-on|ident-off|fault-on|fault-off` 等命令在官方文档中出现过,但本手册整理时未在稳定章节中给出完整选项说明,具体参数以 `ceph orch --help` 为准(文档未明确)。
> 引自:[ceph](https://docs.ceph.com/en/tentacle/man/8/ceph/)
#### ⑬ `telemetry`(遥测上报)
**用途**:telemetry 是 ceph-mgr 模块,把集群的**匿名**数据发回 Ceph 开发者,用于统计 Ceph 的使用方式与用户遇到的问题。数据公示在公共面板 `https://telemetry-public.ceph.com/`(可看到上报集群数、总容量、OSD 数量、版本分布趋势等)。
> 💡 补充:`ceph` man 页未收录 `telemetry`。下面的 synopsis 由 `mgr/telemetry.rst` 中出现的命令归纳而成,非 man 页原文。
**语法(synopsis)**:
```text
ceph telemetry on [--license sharing-1-0]
ceph telemetry off
ceph telemetry status
ceph telemetry show [<channel_name>]
ceph telemetry show-device
ceph telemetry show-all
ceph telemetry preview [<channel_name>]
ceph telemetry preview-device
ceph telemetry preview-all
ceph telemetry channel ls
ceph telemetry enable channel <channel_name> [<channel_name>...] | all
ceph telemetry disable channel <channel_name> [<channel_name>...] | all
ceph telemetry collection ls
ceph telemetry diff
ceph telemetry send [--license sharing-1-0]
```
**上报什么(Channels)**:遥测报告按"通道(channel)"拆分,telemetry 开启时各通道可单独开关;**telemetry 关闭时每通道设置不生效**。
| 通道 | 默认值 | 上报内容 |
|---|---|---|
| `basic` | on | 集群基本信息:容量;mon/mgr/osd/mds/rgw 等守护进程数量;当前软件版本;RADOS 池与 CephFS 的数量和类型;**被改动过的配置项名称**(**不含取值**) |
| `crash` | on | 守护进程崩溃信息:守护进程类型、版本、操作系统(发行版、内核版本)、stack trace(定位崩溃发生在 Ceph 代码何处) |
| `device` | on | 设备指标:匿名化后的 SMART 指标 |
| `ident` | off | 用户主动提供的集群标识信息:集群描述、联系邮箱 |
| `perf` | off | 集群性能指标:整体健康、负载模式、延迟/限流/内存等问题的排查、按守护进程的性能监控 |
- 上报数据**不含任何敏感数据**:不含 pool 名、object 名、object 内容、**hostname**、设备序列号。
- 数据通过 HTTPS 发往 `https://telemetry.ceph.com`。
- 设备报告**单独生成**:hostname 与设备序列号会被匿名化,发往**不同的 endpoint**,且不与特定集群关联。
- 生成设备报告需要 `smartmontools` **7.0 或更高**版本(否则无法输出/解析 JSON)。
**如何关闭**:`ceph telemetry off`(可随时执行,立即停止上报)。若只想停掉某一类数据,用 `ceph telemetry disable channel <channel_name>`。
**子命令表**:
| 子命令 | 参数 | 说明 | 示例 |
|---|---|---|---|
| `on` | `[--license sharing-1-0]` | 开启 telemetry。**必须先加 `--license sharing-1-0`**(遥测数据采用 CDLA-Sharing-1.0 许可),开启后命令输出会列出启用默认关闭通道(如 `perf`)的确切命令 | `ceph telemetry on --license sharing-1-0` |
| `off` | — | 关闭 telemetry;通道级设置随之失效 | `ceph telemetry off` |
| `status` | — | 打印 telemetry 模块当前配置 | `ceph telemetry status` |
| `show` | `[<channel_name>]` | 显示实际将上报的数据;给通道名则只显示该通道。**若 telemetry 开启但该通道被关闭,仍会按你已加入的 collection 输出样本,但该数据不会真的上报** | `ceph telemetry show crash` |
| `preview` | `[<channel_name>]` | telemetry 关闭时预览样本报告(不发送) | `ceph telemetry preview perf` |
| `show-device` | — | 显示设备报告样本(含匿名化后的 SMART 数据) | `ceph telemetry show-device` |
| `preview-device` | — | telemetry 关闭时预览设备报告 | `ceph telemetry preview-device` |
| `show-all` | — | telemetry 开启时,一次性生成并输出上述两份报告 | `ceph telemetry show-all` |
| `preview-all` | — | telemetry 关闭时,一次性预览两份报告 | `ceph telemetry preview-all` |
| `channel ls` | — | 列出所有通道及 `ENABLED`(当前)/ `DEFAULT`(默认)状态与描述 | `ceph telemetry channel ls` |
| `enable channel` | `<channel_name>...` 或 `all` | 启用一个或多个/全部通道;**必须 telemetry 已开启才生效** | `ceph telemetry enable channel basic crash device ident perf` |
| `disable channel` | `<channel_name>...` 或 `all` | 停用一个或多个/全部通道 | `ceph telemetry disable channel ident` |
| `collection ls` | — | 列出所有 collection(通道内的数据方面),含 `NAME` / `STATUS` / `DESC` | `ceph telemetry collection ls` |
| `diff` | — | 显示「你已加入的 collection」与「新增可用 collection」之间的差异 | `ceph telemetry diff` |
| `send` | `[--license sharing-1-0]` | 异步一次性上报;若 telemetry 未开启需加 `--license sharing-1-0` | `ceph telemetry send` |
**相关配置(通过 `ceph config set mgr` 设置)**:
| 配置项 | 默认值 | 说明 | 示例 |
|---|---|---|---|
| `mgr/telemetry/interval` | 24(小时) | 报告编译与发送间隔 | `ceph config set mgr mgr/telemetry/interval 72` |
| `mgr/telemetry/proxy` | 无 | 集群无法直连 `telemetry.ceph.com` 时配置 HTTP/HTTPS 代理,可带 `user:pass` | `ceph config set mgr mgr/telemetry/proxy https://ceph:telemetry@10.0.0.1:8080` |
| `mgr/telemetry/contact` | 无 | 报告中的联系人(可选,默认关闭) | `ceph config set mgr mgr/telemetry/contact 'John Doe <john.doe@example.com>'` |
| `mgr/telemetry/description` | 无 | 集群描述(可选,默认关闭) | `ceph config set mgr mgr/telemetry/description 'My first Ceph cluster'` |
| `mgr/telemetry/channel_ident` | false | 是否启用 `ident` 通道上报联系人/描述 | `ceph config set mgr mgr/telemetry/channel_ident true` |
| `mgr/telemetry/leaderboard` | false | 是否参与公共面板排行榜(展示总容量与 OSD 数) | `ceph config set mgr mgr/telemetry/leaderboard true` |
| `mgr/telemetry/leaderboard_description` | 无 | 排行榜上的集群描述 | `ceph config set mgr mgr/telemetry/leaderboard_description 'Ceph cluster for Computational Biology at the University of XYZ'` |
**典型示例**:
```bash
# 开启 / 关闭 telemetry
ceph telemetry on --license sharing-1-0
ceph telemetry off
# 查看状态、通道与 collection
ceph telemetry status
ceph telemetry channel ls
ceph telemetry collection ls
# 开启默认关闭的 perf 通道;关闭 ident 通道
ceph telemetry enable channel perf
ceph telemetry disable channel ident
ceph telemetry enable channel basic crash device ident perf
ceph telemetry disable channel all
# 查看将要上报的内容(开启时)/ 预览样本(关闭时)
ceph telemetry show
ceph telemetry show crash
ceph telemetry preview
ceph telemetry preview perf
ceph telemetry show-all
ceph telemetry preview-all
# 设备报告
ceph telemetry show-device
ceph telemetry preview-device
# 一次性上报、查看新增 collection 差异
ceph telemetry send
ceph telemetry diff
# 调整上报间隔为 72 小时、走代理
ceph config set mgr mgr/telemetry/interval 72
ceph config set mgr mgr/telemetry/proxy https://10.0.0.1:8080
```
**注意事项 / 常见坑**:
- `ceph telemetry on` **必须带 `--license sharing-1-0`**,否则无法开启(CDLA-Sharing-1.0 许可要求)。
- 通道级开关**只有在 telemetry 开启时才有效**;telemetry 关闭时改通道没有任何效果。
- telemetry 开启但某通道被关闭时,`ceph telemetry show <channel>` 仍会输出样本数据,但**这部分数据不会上报**——不要误判为"已在上报"。
- 大集群(数百 OSD 以上)生成样本报告**可能需要一些时间**。
- 设备报告依赖 `smartmontools` ≥ 7.0;且设备数据发往**独立 endpoint**、与集群不关联。
- `ident` 通道若启用,其详情**不会**显示在排行榜上。
> 引自:[ceph](https://docs.ceph.com/en/tentacle/man/8/ceph/)
---
### 1.2 `ceph-conf`
**用途**:从 Ceph **配置文件**(而非 monitor)中读取配置信息的工具。
**语法(synopsis,保留原文格式)**:
```text
ceph-conf -c conffile --list-all-sections
ceph-conf -c conffile -L
ceph-conf -c conffile -l prefix
ceph-conf key -s section1 ...
ceph-conf [-s section ] [-r] --lookup key
ceph-conf [-s section ] key
```
#### 常用选项表
| 选项 | 参数 | 默认值 | 说明 |
|---|---|---|---|
| `-L`, `--list-all-sections` | — | 无 | 列出配置文件中所有 section |
| `-l`, `--list-sections *prefix*` | prefix | 无 | 列出以 prefix 开头的 section(如 `--list-sections mon`) |
| `--lookup *key*` | key | **默认动作** | 查找并打印指定配置项;若命令行未给其他动作则默认执行 lookup |
| `-h`, `--help` | — | 无 | 打印用法摘要 |
| `-c *conffile*` | 文件路径 | 无 | 指定 Ceph 配置文件 |
| `--filter-key *key*` | key | 无 | 过滤 section 列表,只保留定义了该 key 的 section |
| `--filter-key-value *key*=*value*` | key=value | 无 | 只保留具有指定 key/value 对的 section |
| `--name *type.id*` | type.id | `client.admin` | 指定搜索用的 Ceph 名;如 `--name osd.0` 会依次搜索 `[osd.0]`、`[osd]`、`[global]` |
| `--pid *pid*` | pid | 本进程 PID | 展开 `$pid` 时覆盖 PID |
| `-r`, `--resolve-search` | — | 无 | 在逗号分隔的搜索列表中,找出第一个存在且可打开的文件 |
| `-s`, `--section` | section | 无 | 额外搜索的 section,优先于常规搜索;返回首个匹配项 |
#### 典型示例
```bash
# 查 osd 0 使用的 "osd data" 值
ceph-conf -c foo.conf --name osd.0 --lookup "osd data"
# 同上,省略 --lookup(默认动作)
ceph-conf -c foo.conf --name mds.a "log file"
# 列出所有以 osd 开头的 section
ceph-conf -c foo.conf -l osd
# 列出所有 section
ceph-conf -c foo.conf -L
# 打印 client.0 使用的 keyring 路径
ceph-conf --name client.0 -r -l keyring
```
#### 注意事项 / 常见坑
- **与其他 Ceph 工具不同**:`ceph-conf` **只读配置文件**(或返回编译内置默认值),**不会从 monitor 集群取配置**。官方建议只在严格基于配置文件的遗留环境使用。
- 新部署/新工具应改用 `ceph config get <daemon> <option>`,或让守护进程自己取生效值,例如 `ceph-osd -i 123 --show-config-value osd_data`——后者能同时覆盖编译默认值、配置文件和 monitor 配置库,得到该守护进程真正使用的值。
- 相关文件:`/etc/ceph/$cluster.conf`、`~/.ceph/$cluster.conf`、`$cluster.conf`(未指定 `-c` 时使用)。
> 引自:[ceph-conf](https://docs.ceph.com/en/tentacle/man/8/ceph-conf/)
---
### 1.3 `ceph-run`
**用途**:一个简单的包装器,当被包装的守护进程因崩溃(可能 core dump)退出时自动重启它。
**语法(synopsis,保留原文格式)**:
```text
ceph-run command ...
```
#### 常用选项表
| 选项 | 参数 | 默认值 | 说明 |
|---|---|---|---|
| (无) | — | — | Options: **None**(文档原文明确写 None) |
#### 典型示例
```bash
# 用 ceph-run 包住前台运行的 OSD(注意守护进程需 -f 前台运行)
ceph-run ceph-osd -i 0 -f
# 包住 mon / mds
ceph-run ceph-mon -i mon.a -f
ceph-run ceph-mds -i mds.a -f
```
#### 注意事项 / 常见坑
- 只有在进程以**信号 3、4、5、6、8 或 11** 退出时才会重启(即崩溃/可能 core dump 的信号)。
- 被包装的命令必须让守护进程**在前台运行**;对 Ceph 守护进程来说就是加 `-f` 选项。
- 它不自带任何日志/重启次数限制,生产环境通常仍由 systemd 管理。
> 引自:[ceph-run](https://docs.ceph.com/en/tentacle/man/8/ceph-run/)
---
### 1.4 `ceph-syn`
**用途**:Ceph 分布式文件系统的**合成负载生成器**,通过用户态客户端库对正在运行的文件系统产生简单负载。
**语法(synopsis,保留原文格式)**:
```text
ceph-syn [ -m monaddr:port ] --syn command ...
```
#### 常用选项表
| 选项 | 参数 | 默认值 | 说明 |
|---|---|---|---|
| `-d` | — | 无 | 启动后脱离控制台并 daemonize |
| `-c ceph.conf`, `--conf=ceph.conf` | 文件路径 | `/etc/ceph/ceph.conf` | 使用指定配置文件来确定 monitor 地址 |
| `-m monaddress[:port]` | 地址 | 无 | 直连指定 monitor(跳过 ceph.conf 查找) |
| `--num_client num` | 数量 | 无 | 运行 num 个不同客户端,各占一个线程 |
| `--syn workloadspec` | 负载规格 | 无 | 运行给定负载,可重复指定多次;负载通常**顺序执行** |
#### 工作负载(Workloads,每个都要前置 `--syn`)
| 负载 | 语法 | 说明 |
|---|---|---|
| `mknap` | `mknap *path* *snapname*` | 在 path 上创建名为 snapname 的快照 |
| `rmsnap` | `rmsnap *path* *snapname*` | 删除 path 上名为 snapname 的快照 |
| `rmfile` | `rmfile *path*` | 删除 / unlink path |
| `writefile` | `writefile *sizeinmb* *blocksize*` | 创建以客户端 id 命名的文件,按 blocksize 块写入,共 sizeinmb MB |
| `readfile` | `readfile *sizeinmb* *blocksize*` | 按 blocksize 读取以客户端 id 命名的文件 |
| `rw` | `rw *sizeinmb* *blocksize*` | 先写后读回 |
| `makedirs` | `makedirs *numsubdirs* *numfiles* *depth*` | 创建 depth 层深的目录树,每层每目录 numsubdirs 个子目录 + numfiles 个文件 |
| `walk` | `walk` | 递归遍历文件系统(类似 find) |
> 文档注明"这不是完整列表"。
#### 典型示例
```bash
# 单客户端:建目录树 + 遍历
ceph-syn -m 192.168.0.1:6789 --syn makedirs 5 10 3 --syn walk
# 写 100MB 文件、再读回
ceph-syn --syn writefile 100 1048576 --syn readfile 100 1048576
# 5 个并发客户端跑读写
ceph-syn --num_client 5 --syn rw 50 65536
# 建快照后删除
ceph-syn --syn mknap / snap1 --syn rmsnap / snap1
```
#### 注意事项 / 常见坑
- 文件系统**无需**通过 `ceph-fuse` 或内核客户端挂载即可产生负载。
- 多个 `--syn` 负载通常**顺序**执行,不是并发;并发靠 `--num_client`。
> 引自:[ceph-syn](https://docs.ceph.com/en/tentacle/man/8/ceph-syn/)
---
### 1.5 `ceph-post-file`
**用途**:把文件或目录上传到 ceph.com,供 Ceph 开发者后续分析。
**语法(synopsis,保留原文格式)**:
```text
ceph-post-file [-d description] [-u user] file or dir ...
```
#### 常用选项表
| 选项 | 参数 | 默认值 | 说明 |
|---|---|---|---|
| `-d *description*`, `--description *description*` | 描述文本 | **无默认值** | 为本次上传添加简短描述;适合引用 bug 号 |
| `-u *user*` | 用户标识 | `whoami`@`hostname -f` | 设置上传的用户元数据 |
#### 典型示例
```bash
# 上传单个日志
ceph-post-file /var/log/ceph/ceph-mon.`hostname`.log
# 上传多个目录,并附描述
ceph-post-file -d 'mon data directories' /var/log/ceph/mon/*
```
#### 注意事项 / 常见坑
- **安全警告**:官方仅采取基本措施保证数据只对有权访问 ceph.com 基础设施的开发者可见。上传日志、含 Ceph 密钥的数据目录等**敏感数据前请三思**或先做脱敏。
- 每次调用会上传到**带唯一 tag 的独立目录**;该 tag 可交给开发者或引用在 bug 报告(http://tracker.ceph.com/)里。
- 上传完成后,目录会被标记为**不可读、不可写**,防止他人访问或修改。
> 引自:[ceph-post-file](https://docs.ceph.com/en/tentacle/man/8/ceph-post-file/)
---
### 1.6 `librados-config`
**用途**:显示已安装的 `librados` 信息的工具。
**语法(synopsis,保留原文格式)**:
```text
librados-config [ --version ] [ --vernum ]
```
#### 常用选项表
| 选项 | 参数 | 默认值 | 说明 |
|---|---|---|---|
| `--version` | — | 无 | 显示 `librados` 版本 |
| `--vernum` | — | 无 | 显示 `librados` 版本代码(version code) |
#### 典型示例
```bash
librados-config --version
librados-config --vernum
```
#### 注意事项 / 常见坑
- 无。文档未列出其他选项或限制。
> 引自:[librados-config](https://docs.ceph.com/en/tentacle/man/8/librados-config/)
---
## 二、密钥与认证
### 2.1 `ceph-authtool`
**用途**:创建、查看和修改 Ceph keyring 文件的工具(keyring 保存一个或多个 Ceph 认证密钥及可选的能力声明)。
**语法(synopsis,保留原文格式)**:
```text
ceph-authtool keyringfile
[ -l | --list ]
[ -p | --print-key ]
[ -C | --create-keyring ]
[ -g | --gen-key ]
[ --gen-print-key ]
[ --import-keyring otherkeyringfile ]
[ -n | --name entityname ]
[ -a | --add-key base64_key ]
[ -t | --key-type KEY_TYPE ]
[ --cap subsystem capability ]
[ --caps capfile ]
[ --mode mode ]
```
#### 常用选项表
| 选项 | 参数 | 默认值 | 说明 |
|---|---|---|---|
| `-l`, `--list` | — | 无 | 列出 keyring 中所有 key 与 capabilities |
| `-p`, `--print-key` | — | 无 | 打印指定 entityname 的编码后 key,适合用于 `mount -o secret=` |
| `-C`, `--create-keyring` | — | 无 | 创建新 keyring,**覆盖**已存在的 keyringfile |
| `-g`, `--gen-key` | — | 无 | 为指定 entityname 生成新的 secret key |
| `--gen-print-key` | — | 无 | 生成新 secret key 但**不修改 keyringfile**,直接打到 stdout |
| `--import-keyring *secondkeyringfile*` | 文件路径 | 无 | 把另一个 keyring 的内容导入到当前 keyringfile |
| `-n`, `--name *name*` | entityname(形如 `{client,mon,mds,osd}.name`) | 无 | 指定要操作的实体名 |
| `-a`, `--add-key *base64_key*` | base64 key | 无 | 向 keyring 添加一个编码后的 key |
| `--cap *subsystem* *capability*` | 子系统 + 能力串 | 无 | 设置指定子系统的 capability |
| `--caps *capsfile*` | 文件路径 | 无 | 一次性设置某 key 在**所有子系统**上的 capabilities |
| `--mode *mode*` | 如 `0644` | **`0600`** | 设置 keyring 文件的权限模式 |
| `--key-type *KEY_TYPE*` | `aes` / `aes256k` / `preferred` | **`preferred`** | 设置生成 key 的类型(`preferred` = 由 Ceph operator 选定的默认) |
#### Capabilities 速查
- subsystem(子系统):`mon`、`mds`、`osd`。
- capability:逗号分隔的 allow 子句 + 权限说明符(`r`/`w`/`x`);`allow *` 表示对该子系统的完全超级用户权限。
| 场景 | 示例 caps |
|---|---|
| 可读写执行对象 | `osd = "allow rwx"` |
| 可访问 mds | `mds = "allow"` |
| 可修改集群状态(守护进程) | `mon = "allow rwx"` |
| 限定单个池的 librados 用户 | `mon = "allow r"` + `osd = "allow rw pool foo"` |
| rbd 客户端(一池只读、一池读写) | `mon = "allow r"` + `osd = "allow class-read object_prefix rbd_children, allow pool templates r class-read, allow pool vms rwx"` |
| 挂载文件系统最小权限 | `mds = "allow"` + `osd = "allow rw pool data"` + `mon = "allow r"` |
**OSD capability 语法**:
```text
osdcap := grant[,grant...]
grant := allow (match capspec | capspec match)
match := [ pool[=]<poolname> | object_prefix <prefix>
| namespace[=]<rados-namespace>
| tag <application-name> <key>=<value> ]
capspec := * | [r][w][x] [class-read] [class-write]
```
| capspec | 含义 |
|---|---|
| `r` | 对象读权限 |
| `w` | 对象写权限 |
| `x` | 可调用任意 class 方法(等价于 `class-read class-write`) |
| `class-read` | 可调用只读 class 方法 |
| `class-write` | 可调用写 class 方法 |
| `*` 或 `all` | 等价 rwx,另加执行 osd 管理命令的能力(如 `ceph osd tell ...`) |
> 授权是**叠加**的:只要客户端满足某个 grant 的 match 条件,就获得该 grant 的权限。
**caps 文件格式**:每行一个 key/value,用 `=` 分隔;值若含空白必须用 `'` 或 `"` 引起来;key 是子系统名(`osd`/`mds`/`mon`),value 是能力串。
#### 典型示例
```bash
# 新建 keyring,含 client.foo 的 key,文件权限 0644
ceph-authtool -C -n client.foo --gen-key keyring --mode 0644
# 给该 key 关联能力(可挂载 CephFS)
ceph-authtool -n client.foo --cap mds 'allow' --cap osd 'allow rw pool=data' --cap mon 'allow r' keyring
# 查看 keyring 内容
ceph-authtool -l keyring
# 挂载时直接取用编码后的 secret
mount -t ceph serverhost:/ mountpoint -o name=foo,secret=`ceph-authtool -p -n client.foo keyring`
# 只生成并打印一个 key,不改动 keyring
ceph-authtool --gen-print-key -n client.bar
# 从 caps 文件批量设置
printf 'mon = "allow r"\nosd = "allow rw pool=data"\n' > caps.txt
ceph-authtool -n client.foo --caps caps.txt keyring
```
#### 注意事项 / 常见坑
- **安全警告**:Ceph 提供认证和中间人攻击防护,但**线路上的数据不加密**(包括配置密钥的消息)。该系统主要面向可信环境使用。
- `-C` 会**覆盖**已有 keyring 文件。
- 默认 `--mode` 为 `0600`,若需要其他进程读取(如某些 Web 服务)才放宽。
- `--key-type` 默认 `preferred`,即由 Ceph operator 选定的默认算法。
> 引自:[ceph-authtool](https://docs.ceph.com/en/tentacle/man/8/ceph-authtool/)
---
### 2.2 `ceph-clsinfo`
**用途**:显示某个 class object(RADOS class 对象文件)的名称、版本与架构信息。
**语法(synopsis,保留原文格式)**:
```text
ceph-clsinfo [ options ] ... filename
```
#### 常用选项表
| 选项 | 参数 | 默认值 | 说明 |
|---|---|---|---|
| `-n`, `--name` | — | 无 | 显示 class 名称 |
| `-v`, `--version` | — | 无 | 显示 class 版本 |
| `-a`, `--arch` | — | 无 | 显示 class 架构 |
#### 典型示例
```bash
ceph-clsinfo -n /usr/lib64/rados-classes/libcls_rbd.so
ceph-clsinfo -v /usr/lib64/rados-classes/libcls_rbd.so
ceph-clsinfo -a /usr/lib64/rados-classes/libcls_rbd.so
```
#### 注意事项 / 常见坑
- 文档未说明多个选项能否同时给出,也未给出输出格式示例;实际行为请以 `--help` 或命令输出为准。
> 引自:[ceph-clsinfo](https://docs.ceph.com/en/tentacle/man/8/ceph-clsinfo/)
---
## 三、MON / OSD 工具
### 3.1 `ceph-mon`
**用途**:Ceph 集群的 monitor 守护进程;一个或多个 `ceph-mon` 组成 Paxos part-time parliament 集群,提供集群成员、配置与状态的高可靠持久存储。
**语法(synopsis,保留原文格式)**:
```text
ceph-mon -i monid [ --mon-data mondatapath ]
```
#### 常用选项表
| 选项 | 参数 | 默认值 | 说明 |
|---|---|---|---|
| `-i *monid*` | mon id | 无(必填) | 指定 monitor 的 id |
| `--mon-data *mondatapath*` | 目录路径 | 配置文件中的 `mon data` | 存放 monitor 数据的本地目录 |
| `-f`, `--foreground` | — | 无 | 前台运行,不 daemonize,不生成 pid 文件;配合 `ceph-run` 使用 |
| `-d` | — | 无 | 调试模式:同 `-f`,但把所有日志输出到 stderr |
| `--setuser userorgid` | 用户名或 uid | 无 | 启动后设置 uid;给用户名时会查用户记录得到 uid 与 gid(除非同时给了 `--setgroup`) |
| `--setgroup grouporgid` | 组名或 gid | 无 | 启动后设置 gid |
| `-c ceph.conf`, `--conf=ceph.conf` | 文件路径 | `/etc/ceph/ceph.conf` | 使用指定配置文件确定 monitor 地址 |
| `--mkfs` | — | 无 | 用 seed 信息初始化 `mon data` 目录(见下方"三要素") |
| `--keyring` | 路径 | 无 | 指定 `--mkfs` 时使用的 keyring |
| `--use-mon-keyring` | — | 无 | 以 mon 的 keyring 文件作为 `mon.` secret 的权威来源(通常用的是 mons' auth database 中的 key) |
| `--no-config-file` | — | 无 | 声明不依赖任何 ceph.conf(无论用户提供的还是默认的),所有必要选项都必须通过命令行参数提供 |
#### `--mkfs` 必须提供的三要素
1. **cluster fsid**:来自 monmap(`--monmap <path>`)或通过 `--fsid <uuid>` 显式给出。
2. **monitor 列表及地址**:来自 monmap、`mon host` 配置值(ceph.conf 或 `-m host1,host2,...`),或(向后兼容)ceph.conf 中**已废弃**的 `mon addr` 行。若该 monitor 要成为新集群初始 quorum 的一员,则它必须出现在初始列表中(按名字或地址匹配);按地址匹配时可用 `public addr` 或 `public subnet`。
3. **monitor secret key `mon.`**:必须通过 `--keyring <path>` 提供的 keyring 包含它。
#### 典型示例
```bash
# 前台运行(便于 ceph-run 包装或排障)
ceph-mon -i mon.a -f
# 调试模式
ceph-mon -i mon.a -d
# 初始化 mon 数据目录(新建集群)
ceph-mon -i mon.a --mkfs --monmap /tmp/monmap --keyring /tmp/ceph.mon.keyring
# 初始化时显式给 fsid
ceph-mon -i mon.a --mkfs --fsid $(uuidgen) --keyring /var/lib/ceph/mon/ceph-a/keyring
# 以 mon 自己的 keyring 为权威
ceph-mon -i mon.a --mkfs --use-mon-keyring --keyring /var/lib/ceph/mon/ceph-a/keyring
# 不使用任何配置文件,全部参数走命令行
ceph-mon -i mon.a --no-config-file --mon-data /var/lib/ceph/mon/ceph-a
```
#### 注意事项 / 常见坑
- `--mkfs` 三要素缺一不可,尤其是 keyring 中必须有 `mon.` secret。
- `mon addr` 配置方式**已废弃**,未来版本会移除支持,请使用 `mon host`。
- `--no-config-file` 意味着所有必要选项都得在命令行给全,漏一个就起不来。
- 用 `ceph-run` 包装时必须加 `-f`(前台),否则 `ceph-run` 无法判断崩溃。
> 引自:[ceph-mon](https://docs.ceph.com/en/tentacle/man/8/ceph-mon/)
---
### 3.2 `ceph-osd`
**用途**:Ceph 的**对象存储守护进程**,管理本地存储上的数据并提供网络访问。
**语法(synopsis,保留原文格式)**:
```text
ceph-osd -i osdnum [ --osd-data datapath ] [ --osd-journal journal ] [ --mkfs ] [ --mkjournal ] [--flush-journal] [--check-allows-journal] [--check-wants-journal] [--check-needs-journal] [ --mkkey ] [ --osdspec-affinity ]
```
#### 常用选项表
| 选项 | 参数 | 默认值 | 说明 |
|---|---|---|---|
| `-i *osdnum*` | OSD 编号 | 无(必填) | 指定 OSD 编号 |
| `-f`, `--foreground` | — | 无 | 前台运行,不 daemonize,不生成 pid 文件;配合 `ceph-run` 使用 |
| `-d` | — | 无 | 调试模式:同 `-f`,但所有日志输出到 stderr |
| `--setuser userorgid` | 用户名或 uid | 无 | 启动后设置 uid(给用户名时同时设 gid,除非另有 `--setgroup`) |
| `--setgroup grouporgid` | 组名或 gid | 无 | 启动后设置 gid |
| `--osd-data osddata` | 目录路径 | 无 | 使用该路径下的 object store(Filestore 时代应为 XFS 文件系统上的目录) |
| `--osd-journal journal` | 路径 | 无 | journal 更新写入该 journal |
| `--check-wants-journal` | — | 无 | 检查是否需要 journal |
| `--check-allows-journal` | — | 无 | 检查是否允许 journal |
| `--check-needs-journal` | — | 无 | 检查是否必须有 journal |
| `--mkfs` | — | 无 | 创建空的 object repository(若定义了 journal 也会一并初始化) |
| `--mkkey` | — | 无 | 生成新 secret key;通常与 `--mkfs` 合用(比手工用 `ceph-authtool` 方便) |
| `--mkjournal` | — | 无 | 为已有的 object repository 创建新的 journal 文件(journal 设备/文件被清空后重建用) |
| `--flush-journal` | — | 无 | 把 journal 刷到持久存储;**前台运行**以便知道何时完成。在调整 journal 大小或销毁 journal 前使用可保证不丢数据 |
| `--get-cluster-fsid` | — | 无 | 打印集群 fsid(uuid)并退出 |
| `--get-osd-fsid` | — | 无 | 打印该 OSD 的 fsid(在 `--mkfs` 时生成,唯一标识该次实例化) |
| `--get-journal-fsid` | — | 无 | 打印 journal 的 uuid(`--mkfs` 时被设为与 OSD fsid 相同) |
| `-c ceph.conf`, `--conf=ceph.conf` | 文件路径 | `/etc/ceph/ceph.conf` | 运行时配置使用指定文件 |
| `-m monaddress[:port]` | 地址 | 无 | 直连指定 monitor |
| `--osdspec-affinity` | — | 无 | 设置对某个 OSDSpec 的亲和性;**只能与 `--mkfs` 同时使用** |
#### 典型示例
```bash
# 前台运行 OSD 0(配合 ceph-run)
ceph-run ceph-osd -i 0 -f
# 初始化一个 OSD 数据目录并生成 key
ceph-osd -i 0 --mkfs --mkkey --osd-data /var/lib/ceph/osd/ceph-0
# 重建 journal
ceph-osd -i 0 --mkjournal --osd-data /var/lib/ceph/osd/ceph-0
# 调整/销毁 journal 前先刷盘
ceph-osd -i 0 --flush-journal --osd-data /var/lib/ceph/osd/ceph-0
# 查询各类 fsid
ceph-osd -i 0 --get-cluster-fsid
ceph-osd -i 0 --get-osd-fsid --osd-data /var/lib/ceph/osd/ceph-0
ceph-osd -i 0 --get-journal-fsid --osd-data /var/lib/ceph/osd/ceph-0
# 检查 journal 需求情况
ceph-osd -i 0 --check-needs-journal --osd-data /var/lib/ceph/osd/ceph-0
# 随 OSDSpec 亲和性初始化
ceph-osd -i 0 --mkfs --osdspec-affinity --osd-data /var/lib/ceph/osd/ceph-0
```
#### 注意事项 / 常见坑
- `--osdspec-affinity` **只能**和 `--mkfs` 一起用,单独使用无效。
- `--flush-journal` 是前台执行的,正是为了让你确认它何时完成——销毁 journal 前务必先执行。
- 文档关于 journal 的说明是面向 Filestore 的:journal 只有在与 `datapath` **不同盘**时才提升性能,且应放在低延迟介质(理想是 SSD)上。
- `--mkkey` 通常配合 `--mkfs`,避免手工用 `ceph-authtool` 生成 key。
> 引自:[ceph-osd](https://docs.ceph.com/en/tentacle/man/8/ceph-osd/)
---
### 3.3 `ceph-mds`
**用途**:Ceph 分布式文件系统的**元数据服务器守护进程**;多个实例协同管理文件系统命名空间,协调对共享 OSD 集群的访问。
**语法(synopsis,保留原文格式)**:
```text
ceph-mds -i <ID> [flags]
```
#### 常用选项表
| 选项 | 参数 | 默认值 | 说明 |
|---|---|---|---|
| `-f`, `--foreground` | — | 无 | 前台运行,不 daemonize,不生成 pid 文件;配合 `ceph-run` 使用 |
| `-d` | — | 无 | 调试模式:同 `-f`,但所有日志输出到 stderr |
| `--setuser userorgid` | 用户名或 uid | 无 | 启动后设置 uid(给用户名时同时设 gid,除非另有 `--setgroup`) |
| `--setgroup grouporgid` | 组名或 gid | 无 | 启动后设置 gid |
| `-c ceph.conf`, `--conf=ceph.conf` | 文件路径 | `/etc/ceph/ceph.conf` | 使用指定配置文件确定 monitor 地址 |
| `-m monaddress[:port]` | 地址 | 无 | 直连指定 monitor |
| `--id` / `-i` *ID* | ID | 无 | 设置 MDS 名称中的 ID 部分;**ID 不应以数字开头** |
| `--name` / `-n` *TYPE.ID* | TYPE.ID(TYPE 显然为 `mds`) | 无 | 设置完整 MDS 名;**ID 不应以数字开头** |
#### 典型示例
```bash
# 前台启动一个 MDS
ceph-run ceph-mds -i mds.a -f
# 指定 monitor 与配置文件
ceph-mds -i mds.a -m 192.168.0.1:6789 -c /etc/ceph/ceph.conf
# 用完整名字启动
ceph-mds -n mds.b -f
# 以指定用户/组运行
ceph-mds -i mds.a --setuser ceph --setgroup ceph -f
```
#### 注意事项 / 常见坑
- 每个 `ceph-mds` 实例应有**唯一名称**,该名称用于在 `ceph.conf` 中标识实例。
- ID **不应以数字开头**。
- 守护进程启动后,monitor 集群通常会为其分配一个逻辑 rank,或放入 standby 池以接管崩溃的守护进程;某些指定选项会导致不同行为。
> 引自:[ceph-mds](https://docs.ceph.com/en/tentacle/man/8/ceph-mds/)
---
### 3.4 `monmaptool`
**用途**:创建、查看和修改 Ceph monitor 集群映射(monmap)的工具;monmap 指定了 Ceph 分布式系统中**唯一固定的地址**。
**语法(synopsis,保留原文格式)**:
```text
monmaptool <action> [options] mapfilename
```
#### 常用选项表
| 选项 | 参数 | 默认值 | 说明 |
|---|---|---|---|
| `--print` | — | 无 | 在完成所有修改后,打印 map 的纯文本 dump |
| `--feature-list [plain\|parseable]` | 格式 | 人类可读(plain) | 列出已启用及可用的特性 |
| `--create` | — | 无 | 创建带**新 UUID** 的新 monmap(随之是一个新的空 Ceph 集群) |
| `--clobber` | — | 无 | 允许用新 map 覆盖已存在的 mapfilename;**仅在 `--create` 时有用** |
| `--generate` | — | 无 | 基于命令行或 ceph 配置生成新 monmap,优先顺序:① `--monmap filename` ② `--mon-host 'host1,ip2'` ③ 配置中 `[mon.foo]` 段的 `mon addr`(**不推荐,未来版本将移除**) |
| `--filter-initial-members` | — | 无 | 按 `mon initial members` 过滤初始 monmap:不在列表中的 monitor 会被移除,列表中但不在 map 里的会用 dummy 地址加入 |
| `--add name ip[:port]` | name + ip[:port] | 无 | 添加一个 monitor。若启用了 *nautilus* 特性且未指定 port,会同时为两种 messenger 协议添加 |
| `--addv name [protocol:ip:port[,...]]` | name + 版本化地址 | 无 | 按 `protocol:ip:port` 添加 monitor |
| `--rm name` | name | 无 | 移除指定名称的 monitor |
| `--fsid uuid` | uuid | 随机生成 | 设置 fsid;若 `--create` 时未指定则随机生成 |
| `--feature-set value [--optional\|--persistent]` | value | 无 | 启用某个特性 |
| `--feature-unset value [--optional\|--persistent]` | value | 无 | 关闭某个特性 |
| `--enable-all-features` | — | 无 | 启用所有受支持的特性 |
| `--set-min-mon-release release` | release | 无 | 设置 `min_mon_release` |
| `--auth-service-cipher=<cipher>` | cipher | **`aes256k`** | 设置 rotating service keys 的加密类型 |
| `--auth-allowed-ciphers=<cipher1,cipher2,...>` | 列表 | **`aes256k`** | 设置守护进程(含 Monitor)与客户端认证时允许的加密类型 |
| `--auth-preferred-cipher=<cipher>` | cipher | **`aes256k`** | 设置新凭据或 key 轮换时的首选加密类型 |
#### 典型示例
```bash
# 为全新集群创建含三个 monitor 的 monmap
monmaptool --create --add nodeA 192.168.0.10 --add nodeB 192.168.0.11 \
--add nodeC 192.168.0.12 --enable-all-features --clobber monmap
# 显示 map 内容
monmaptool --print monmap
# 替换一个 monitor(先删后加)
monmaptool --rm nodeA monmap
monmaptool --add nodeA 192.168.0.9 monmap
# 指定 fsid 与 min_mon_release
monmaptool --create --fsid $(uuidgen) --set-min-mon-release tentacle --add nodeA 10.0.0.1 monmap
# 按 v2 协议显式指定地址
monmaptool --addv nodeA v2:10.0.0.1:3300,v1:10.0.0.1:6789 monmap
```
#### 注意事项 / 常见坑
- 默认 Ceph monitor 端口:**messenger v1 为 6789,v2 为 3300**。
- **一次调用可执行多个 action**。
- `--clobber` 只在配合 `--create` 时才有意义。
- 通过配置中 `[mon.foo]` 段的 `mon addr` 生成 monmap 的方式**不推荐**,未来版本会移除支持。
- 除 monitor 外,其他所有守护进程都绑定任意地址并向 monitor 注册——monmap 是唯一固定地址所在。
> 引自:[monmaptool](https://docs.ceph.com/en/tentacle/man/8/monmaptool/)
---
### 3.5 `osdmaptool`
**用途**:创建、查看和操作 OSD 集群映射(osdmap)的工具;可抽取/导入 CRUSH map,并可**模拟 upmap 均衡器**以评估 PG 均衡所需操作。
**语法(synopsis,保留原文格式)**:
```text
osdmaptool mapfilename [--print] [--createsimple numosd [--pgbits bitsperosd ] ] [--clobber]
osdmaptool mapfilename [--import-crush crushmap]
osdmaptool mapfilename [--export-crush crushmap]
osdmaptool mapfilename [--upmap file] [--upmap-max max-optimizations] [--upmap-deviation max-deviation] [--upmap-pool poolname] [--save] [--upmap-active]
osdmaptool mapfilename [--upmap-cleanup] [--upmap file]
```
#### 常用选项表
| 选项 | 参数 | 默认值 | 说明 |
|---|---|---|---|
| `--print` | — | 无 | 在完成所有修改后打印 map 的纯文本 dump |
| `--dump <format>` | `plain` 或 `json` | 无 | 以纯文本(plain)或 json 显示 map;是 `--print` 的替代 |
| `--clobber` | — | 无 | 允许在有修改时覆盖 mapfilename |
| `--import-crush mapfile` | 文件路径 | 无 | 从文件加载 CRUSH map 并嵌入 osdmap |
| `--export-crush mapfile` | 文件路径 | 无 | 从 osdmap 抽取 CRUSH map 写到文件 |
| `--createsimple numosd [--pg-bits bitsperosd] [--pgp-bits bits]` | 数量/位数 | 无 | 创建通用 osdmap;`pg_num = numosd << bitsperosd`,`pgp_num = numosd << bits` |
| `--create-from-conf` | — | 无 | 用默认配置创建 osdmap |
| `--test-map-pgs [--pool poolid] [--range-first <first> --range-last <last>]` | — | 无 | 打印 PG→OSD 映射 |
| `--test-map-pgs-dump [--pool poolid] [--range-first ... --range-last ...]` | — | 无 | 打印全部 PG 摘要及其到**已映射 OSD** 的映射 |
| `--test-map-pgs-dump-all [--pool poolid] [--range-first ... --range-last ...]` | — | 无 | 打印全部 PG 摘要及其到**全部 OSD** 的映射 |
| `--test-random` | — | 无 | 随机映射 PG 到 OSD |
| `--test-map-pg <pgid>` | pgid | 无 | 映射某个 PG 到 OSD |
| `--test-map-object <objectname> [--pool <poolid>]` | 对象名 | 无 | 映射某个对象到 PG/OSD |
| `--test-crush [--range-first ... --range-last ...]` | — | 无 | 把 PG 映射到 acting OSD |
| `--mark-up-in` | — | 无 | 标记 osd 为 up 且 in(**不持久化**) |
| `--mark-out` | — | 无 | 标记某 osd 为 out(**不持久化**) |
| `--mark-up <osdid>` | osd id | 无 | 标记某 osd 为 up(**不持久化**) |
| `--mark-in <osdid>` | osd id | 无 | 标记某 osd 为 in(**不持久化**) |
| `--tree` | — | 无 | 以层次树展示 map |
| `--clear-temp` | — | 无 | 清除 pg_temp 与 primary_temp 变量 |
| `--clean-temps` | — | 无 | 清理 pg_temps |
| `--health` | — | 无 | 导出健康检查 |
| `--with-default-pool` | — | 无 | 创建 map 时包含默认池 |
| `--upmap-cleanup <file>` | 文件路径 | `-`(stdout) | 清理 pg_upmap[_items] 条目,把命令写入 file |
| `--upmap <file>` | 文件路径 | `-`(stdout) | 计算用于均衡 PG 布局的 upmap 条目,写入 file |
| `--upmap-max <max-optimizations>` | 数量 | **10** | 最多计算多少条 upmap 条目 |
| `--upmap-deviation <max-deviation>` | 数值 | **5** | 允许的最大偏差 |
| `--upmap-pool <poolname>` | 池名 | 无 | 把 upmap 均衡限制在某池;可重复指定多个池 |
| `--upmap-active` | — | 无 | 像 active balancer 一样持续应用变更直到均衡 |
| `--adjust-crush-weight <osdid:weight>[,<osdid:weight>,...]` | 列表 | 无 | 修改指定 OSD 的 CRUSH 权重 |
| `--save` | — | 无 | 把含 upmap 或 crush-adjust 变更的 osdmap 写回 |
| `--read <file>` | 文件路径 | 无 | 计算用于均衡 PG primary 的 upmap 条目(read 模式) |
| `--read-pool <poolname>` | 池名 | 无 | 指定 read balancer 调整的池 |
| `--vstart` | — | 无 | 给 upmap / read 输出加 `./bin/` 前缀 |
#### 典型示例
```bash
# 创建一个含 16 个设备的简单 map
osdmaptool --createsimple 16 osdmap --clobber
# 查看结果
osdmaptool --print osdmap
# 查看 pool 1 的 PG 映射分布
osdmaptool osdmap --test-map-pgs-dump --pool 1
# 导出 / 导入 CRUSH map
osdmaptool osdmap --export-crush cm.txt
osdmaptool osdmap --import-crush cm.txt --clobber
# 模拟 active balancer(upmap 模式)
osdmaptool --upmap upmaps.out --upmap-active --upmap-deviation 6 --upmap-max 11 osdmap
# 只清理 upmap 条目
osdmaptool osdmap --upmap-cleanup cleanup.out
# 修改 CRUSH 权重并保存
osdmaptool osdmap --adjust-crush-weight 3:0.8 --save
# 模拟 read 均衡(先确保容量已用 upmap 均衡过)
osdmaptool osdmap --read read.out --read-pool <pool name>
```
#### 输出解读(`--test-map-pgs-dump`)
```text
pool 1 pg_num 8
1.0 [0,2,1] 0
...
#osd count first primary c wt wt
osd.0 8 5 5 1 1
in 3
avg 8 stddev 0 (0x) (expected 2.3094 0.288675x))
min osd.0 8
max osd.0 8
```
- PG 表三列:**PG id / acting set / primary OSD**。
- OSD 表五列:**映射到该 OSD 的 PG 数 / acting set 中排第一的次数 / 作为 primary 的次数 / CRUSH 权重 / 权重**。
- 统计段:PG 数量的平均值、标准差、标准差/均值、期望标准差、期望标准差/均值,以及 min/max。
- 最后是"映射到 n 个 OSD 的 PG 数量"分布。
#### 注意事项 / 常见坑
- `--mark-*`、`--clear-temp` 等标记类操作**不会持久化**,除非配合 `--save`。
- `--upmap-max` 默认 10、`--upmap-deviation` 默认 5;`--upmap` / `--upmap-cleanup` 的默认输出文件是 `-`(stdout)。
- read 模式(read balancer)**必须在先用 upmap 模式把容量均衡好之后**再跑。
- 文档提示:`--test-map-pgs-dump` 等带 `--range-first/--range-last` 时会遍历 osdmap 目录下名为 first..last 的文件。
- `--clobber` 在有修改时才需要。
> 引自:[osdmaptool](https://docs.ceph.com/en/tentacle/man/8/osdmaptool/)
---
### 3.6 `crushtool`
**用途**:创建、编译、反编译和测试 CRUSH map 文件的工具。
**语法(synopsis,保留原文格式)**:
```text
crushtool ( -d map | -c map.txt | --build --num_osds numosds layer1 ... | --test ) [ -o outfile ]
```
#### 四种模式与常用选项
| 选项 | 参数 | 默认值 | 说明 |
|---|---|---|---|
| `--compile` / `-c map.txt` | 纯文本 map | 无 | 把明文 map.txt 编译为二进制 map 文件 |
| `--decompile` / `-d map` | 二进制 map | 无 | 把已编译 map 反编译为适合编辑的明文源文件 |
| `--build --num_osds {num-osds} layer1 ...` | 层数与每层定义 | 无 | 按给定层结构创建 map(见"构建"段) |
| `--test` | — | 无 | 对输入范围 `[--min-x,--max-x]`(默认 `[0,1023]`)做 CRUSH 映射干跑 |
| `-o outfile` | 文件路径 | 无 | 输出文件 |
**`--test` 模式下的报告选项**:
| 选项 | 参数 | 默认值 | 说明 |
|---|---|---|---|
| `--show-statistics` | — | 无 | 显示分布摘要,如 `rule 1 (metadata) num_rep 5 result size == 5: 1024/1024` |
| `--show-mappings` | — | 无 | 显示 `[--min-x,--max-x]` 内每个值的映射,如 `CRUSH rule 1 x 24 [11,6]`。**必须**配合 `--num-rep`,或同时给 `--min-rep` + `--max-rep` |
| `--show-bad-mappings` | — | 无 | 显示映射失败(未达到要求副本数)的值 |
| `--show-utilization` | — | 无 | 显示每个设备在每个副本数下的期望与实际利用率(隐含 `--show-statistics`) |
| `--show-utilization-all` | — | 无 | 同上,但不抑制权重为 0 的设备输出(隐含 `--show-statistics`) |
| `--show-choose-tries` | — | 无 | 显示找到映射所需的尝试次数分布;行数等于 `--set-choose-total-tries` |
| `--output-csv` | — | 无 | 在当前目录生成 CSV 文件(文件名取自规则名,如 `metadata-absolute_weights.csv`) |
| `--output-name NAME` | 前缀 | 无 | 给 `--output-csv` 生成的文件名加前缀,如 `FOO-metadata-...csv` |
| `--num-rep` / `--min-rep` + `--max-rep` | 副本数 | 无 | 指定精确副本数或副本数范围 |
| `--min-x` / `--max-x` | 数值 | `0` / `1023` | 模拟输入值范围(可视为模拟的 PG) |
| `--set-...`(tunables) | 如 `--set-choose-total-tries 500` | 无 | 在内存中修改输入 crush map 的 tunables |
| `--simulate` | — | 无 | 随机放置(random placement)模拟 |
> 更多 `--test` 相关选项与 `--set-...` tunables 的完整清单见官方 man 页。
#### 构建 map(`--build`)
每层语法:
```text
bucket ( uniform | list | tree | straw | straw2 ) size
```
- **bucket**:该层 bucket 的类型(如 `rack`);每个 bucket 名 = bucket 字符串 + 唯一数字(`rack0`、`rack1`...)。
- **类型**:多数情况下应使用 `straw`。
- **size**:bucket 的最大容量;**0 表示无限容量**。
#### 典型示例
```bash
# 反编译 → 编辑 → 重新编译
crushtool -d crushmap -o map.txt
$EDITOR map.txt
crushtool -c map.txt -o crushmap
# 构建一个 320 OSD 的层级 map(2 row × 2 rack × 20 node × 4 osd)
crushtool -o crushmap --build --num_osds 320 \
node straw 4 \
rack straw 20 \
row straw 2 \
root straw 0
# 测试并查看统计 / 坏映射
crushtool -i mymap --test --show-statistics
crushtool -i mymap --test --show-bad-mappings
crushtool -i mymap --test --show-mappings --num-rep 3
crushtool -i mymap --test --show-mappings --min-rep 1 --max-rep 10
crushtool -i mymap --test --show-utilization
# 通过增大 choose-total-tries 修复坏映射
crushtool -i mymap --test --show-bad-mappings --set-choose-total-tries 500
# 导出 CSV 报告
crushtool -i mymap --test --output-csv --output-name FOO
```
#### 注意事项 / 常见坑
- **与其他 Ceph 工具不同**:`crushtool` **不接受** `--debug-crush` 之类的通用命令行选项;它们只能通过 `CEPH_ARGS` 环境变量传入,例如 `CEPH_ARGS="--debug-crush 0" crushtool ...`。
- `crushtool` **不了解 PG 或 pool**,它只是对 `[--min-x,--max-x]` 范围内的值做映射模拟。PG 的整数 ID 可从 `ceph pg dump` 获得(如 PG `2.2f` = pool id 2、PG id 32),pool 与 PG ID 经组合函数得到一个值再交给 CRUSH。
- `--show-mappings` 必须配 `--num-rep` 或同时配 `--min-rep`+`--max-rep`。
- `--build` 生成的 CRUSH rule 与新建 Ceph 集群时的默认规则相同,可再编辑。
- **Reclassify**:可把旧式并行层级(按 OSD 类型分多个层级)迁移到使用 *device class* 特性的现代 CRUSH map(详见官方 CRUSH map 编辑文档)。
> 引自:[crushtool](https://docs.ceph.com/en/tentacle/man/8/crushtool/)
---
### 3.7 `crushdiff`
**用途**:测试 CRUSH map 变更影响的工具——会移动多少 PG、多少对象、多少字节。它是 `osdmaptool --test-map-pgs-dump` 的封装,并结合 pg stats 计算对象与字节迁移量。
**语法(synopsis,保留原文格式)**:
```text
crushdiff [ --osdmap osdmap ] [ --pg-dump pg-dump ] [ --compiled ] [ --verbose ] command crushmap
```
#### 常用选项表
| 选项 | 参数 | 默认值 | 说明 |
|---|---|---|---|
| `--compiled` | — | 无 | 输入/输出 crushmap 是**已编译**格式;不指定则为 txt(反编译)格式 |
| `--pg-dump <pg-dump>` | JSON 文件 | 自行执行 `ceph pg dump` 获取 | `ceph pg dump` 的 JSON 输出 |
| `--osdmap <osdmap>` | 文件 | 自行执行 `ceph osd getmap` 获取 | 集群 osdmap |
| `--verbose` | — | 无 | 输出诊断信息(含受影响的 PG 明细) |
#### 命令(Commands)
| 命令 | 语法 | 说明 |
|---|---|---|
| `compare` | `compare *crushmap*` | 把文件中的 crushmap 与集群 osdmap 中的 crushmap 比较,输出安装新 map 后会移动的 PG/对象/字节数 |
| `export` | `export *crushmap*` | 从集群 osdmap 导出 crushmap 到文件 |
| `import` | `import *crushmap*` | 把文件中的 crushmap 导入到集群 osdmap |
#### 典型示例
```bash
# 1) 取当前 crushmap
crushdiff export cm.txt
# 2) 编辑
$EDITOR cm.txt
# 3) 看影响
crushdiff compare cm.txt
# 4) 满意后安装
crushdiff import cm.txt
# 带诊断信息
crushdiff compare cm.txt --verbose
# 使用已保存的离线数据(不需要连集群)
crushdiff --osdmap /tmp/osdmap --pg-dump /tmp/pgdump.json compare cm.txt
# 处理已编译的 crushmap
crushdiff --compiled compare cm.bin
```
#### 输出示例
```text
79/416 (18.99%) pgs affected
281/1392 (20.19%) objects affected
80/1248 (6.41%) pg shards to move
281/4176 (6.73%) pg object shards to move
730.52Mi/10.55Gi (6.76%) bytes to move
```
加 `--verbose` 还会列出受影响的 PG 明细(PG 号 + 旧/新 OSD active set):
```text
4.3 [0, 2, 1] -> [1, 4, 2]
4.b [0, 1, 3] -> [2, 1, 3]
4.c [4, 0, 1] -> [4, 1, 2]
```
#### 注意事项 / 常见坑
- **默认需要访问集群**(会用集群当前 osdmap 与 pg stats);离线评估请用 `--osdmap` + `--pg-dump`。
- 输出的"对象数/字节数"依赖 pg stats,因此与真实迁移量是估算关系。
- `--compiled` 决定输入/输出格式,与 `crushtool` 的 `-c/-d` 对应关系要理清,避免格式不匹配。
> 引自:[crushdiff](https://docs.ceph.com/en/tentacle/man/8/crushdiff/)
---
### 3.8 `ceph-kvstore-tool`
**用途**:kvstore(键值存储)操作工具,允许**离线**操作 RocksDB 中的数据(如 OSD 的 omap)。
**语法(synopsis,保留原文格式)**:
```text
ceph-kvstore-tool <rocksdb|bluestore-kv> <store path> command [args...]
```
#### 命令表
| 命令 | 语法 | 说明 |
|---|---|---|
| `list` | `list [prefix]` | 打印带该 URL 编码 prefix 的所有 KV 对的 key |
| `list-crc` | `list-crc [prefix]` | 打印带该 prefix 的所有 KV 对的 CRC |
| `dump` | `dump [prefix]` | 打印带该 prefix 的所有 KV 对的 key 与 value |
| `exists` | `exists <prefix> [key]` | 检查是否存在该 prefix 的 KV 对;给了 key 则检查该 key |
| `get` | `get <prefix> <key> [out <file>]` | 取指定 prefix+key 的 value;给了 file 则写入文件 |
| `crc` | `crc <prefix> <key>` | 取指定 KV 对的 CRC |
| `get-size` | `get-size [<prefix> <key>]` | 取预估的 store 大小,或指定 prefix+key 的 value 大小 |
| `set` | `set <prefix> <key> [ver <N>\|in <file>]` | 设置 value;value 可以是 *version_t* 或文本 |
| `rm` | `rm <prefix> <key>` | 删除指定 KV 对 |
| `rm-prefix` | `rm-prefix <prefix>` | 删除该 prefix 下的所有 KV 对 |
| `store-copy` | `store-copy <path> [num-keys-per-tx]` | 把所有 KV 对复制到 path 指定目录;`num-keys-per-tx` = 每事务复制的 KV 对数 |
| `store-crc` | `store-crc <path>` | 把所有 KV 对的 CRC 存到 path 指定文件 |
| `compact` | `compact` | 打开数据库并触发 compaction;之后**可能释放部分磁盘空间** |
| `compact-prefix` | `compact-prefix <prefix>` | 只 compact 该 prefix 下的条目 |
| `compact-range` | `compact-range <prefix> <start> <end>` | 只 compact 该 prefix 下指定范围的条目 |
| `destructive-repair` | `destructive-repair` | 尽力(**可能具破坏性**)恢复损坏的数据库 |
| `stats` | `stats` | 打印底层 KV 数据库的统计信息(仅供参考,格式与内容可能随版本变化) |
| `histogram` | `histogram` | 展示底层 KV 数据库中 key/value 大小的分布统计 |
#### 典型示例
```bash
# 列出某 OSD 的 RocksDB 中所有 key
ceph-kvstore-tool rocksdb /var/lib/ceph/osd/ceph-0 list
# 查看某 prefix 下的全部键值
ceph-kvstore-tool rocksdb /var/lib/ceph/osd/ceph-0 dump O_
# 取某个 key 的值并写入文件
ceph-kvstore-tool rocksdb /var/lib/ceph/osd/ceph-0 get O_ mykey out /tmp/val.bin
# 估算大小 / 看统计
ceph-kvstore-tool rocksdb /var/lib/ceph/osd/ceph-0 get-size
ceph-kvstore-tool rocksdb /var/lib/ceph/osd/ceph-0 stats
ceph-kvstore-tool rocksdb /var/lib/ceph/osd/ceph-0 histogram
# 触发 compaction 释放空间
ceph-kvstore-tool rocksdb /var/lib/ceph/osd/ceph-0 compact
# bluestore-kv 类型
ceph-kvstore-tool bluestore-kv /var/lib/ceph/osd/ceph-0 list
# 复制整个 store(每事务 1000 个 key)
ceph-kvstore-tool rocksdb /var/lib/ceph/osd/ceph-0 store-copy /tmp/kvbackup 1000
```
#### 注意事项 / 常见坑
- `destructive-repair` 是**最后手段**:对 rocksdb 而言,它可能**损坏一个本来没坏的数据库**。
- **离线工具**:操作前必须先停止对应 OSD,否则会与运行中的进程争抢数据库。
- `stats` 仅供信息参考,其格式与内容**可能随版本变化**。
- prefix 是**URL 编码**的。
- 该工具直接改动底层数据,任何 `set`/`rm`/`rm-prefix` 都应先备份(可用 `store-copy`)。
> 引自:[ceph-kvstore-tool](https://docs.ceph.com/en/tentacle/man/8/ceph-kvstore-tool/)
---
### 3.9 `ceph-dencoder`
**用途**:Ceph 数据结构的编码/解码/转储工具,用于调试和测试跨版本兼容性;接收一个简单命令列表并**按顺序执行**。
**语法(synopsis,保留原文格式)**:
```text
ceph-dencoder [commands...]
```
#### 命令表
| 命令 | 参数 | 说明 |
|---|---|---|
| `version` | — | 打印 `ceph-dencoder` 二进制的版本字符串 |
| `import <file>` | 文件路径 | 从文件读入一段编码后的二进制数据到内存 buffer |
| `export <file>` | 文件路径 | 把当前内存 buffer 的内容写到文件 |
| `list_types` | — | 列出本构建所知的全部数据类型 |
| `type <name>` | 类型名 | 为后续 encode/decode 选择类型 |
| `skip <bytes>` | 字节数 | 在导入的文件中先跳过 bytes 再读数据结构(用于对象前有 preamble/header 的情况) |
| `decode` | — | 把内存 buffer 解码为先前选定类型的实例;出错会报告 |
| `encode` | — | 把内存中该类型的实例编码到内存 buffer |
| `dump_json` | — | 打印内存中对象的 JSON 描述 |
| `count_tests` | — | 打印本工具可为选定类型生成的内置测试实例数量 |
| `select_test <n>` | 序号 | 选择第 n 个内置测试实例作为内存中的实例 |
| `get_features` | — | 打印本版本支持的 feature set 的十进制值(每个 bit 一个 feature,对应 `src/include/ceph_features.h` 中的 `CEPH_FEATURE_*`) |
| `set_features <f>` | 数值 | 设置 encode 时使用的 feature bits,以便编码出**旧版本软件能理解**的对象(仅对支持该能力的类型有效) |
#### 典型示例
```bash
# 查看 ceph-osd 存储的某个对象的属性
cd /mnt/osd.12/current/2.b_head
attr -l foo_bar_head_EFE6384B
# Attribute "ceph.snapset" has a 31 byte value for foo_bar_head_EFE6384B
# Attribute "ceph._" has a 195 byte value for foo_bar_head_EFE6384B
attr foo_bar_head_EFE6384B -g ceph._ -q > /tmp/a
ceph-dencoder type object_info_t import /tmp/a decode dump_json
# 转储 CephFS 内部元数据对象(跳过 8 字节 preamble)
rados -p metadata get mds_snaptable mds_snaptable.bin
ceph-dencoder type SnapServer skip 8 import mds_snaptable.bin decode dump_json
# 列出所有已知类型
ceph-dencoder list_types
# 用内置测试实例编码,并设定 feature bits 以兼容旧版本
ceph-dencoder type osdmap_t count_tests
ceph-dencoder type osdmap_t select_test 0 set_features 12345 encode export /tmp/om.bin
```
#### 注意事项 / 常见坑
- 命令是**顺序执行**的,`type` 必须先于 `encode`/`decode` 指定。
- 对象前有 header 时要先用 `skip <bytes>` 跳过(CephFS 元数据对象常见 8 字节 preamble)。
- `set_features` 只对**支持该能力**的类型有效。
> 引自:[ceph-dencoder](https://docs.ceph.com/en/tentacle/man/8/ceph-dencoder/)
---
### 3.10 `ceph-debugpack`
**用途**:打包一个含崩溃调试所需材料的 tarball,便于与 Ceph 开发者共享来定位问题。
**语法(synopsis,保留原文格式)**:
```text
ceph-debugpack [ options ] filename.tar.gz
```
#### 常用选项表
| 选项 | 参数 | 默认值 | 说明 |
|---|---|---|---|
| `-c ceph.conf`, `--conf=ceph.conf` | 文件路径 | `/etc/ceph/ceph.conf` | 使用指定配置文件确定 monitor 地址 |
#### 打包内容
tarball 会包含:`ceph-mds`、`ceph-osd`、`ceph-mon`、`radosgw` 的二进制,所有日志文件,`ceph.conf` 配置文件,能找到的 core 文件,以及(若系统在运行)由 `ceph report` 输出的当前集群状态 dump。
#### 典型示例
```bash
# 生成调试包
ceph-debugpack /tmp/debug.tar.gz
# 指定配置文件
ceph-debugpack -c /etc/ceph/foo.conf /tmp/debug.tar.gz
# 生成后用 ceph-post-file 上传
ceph-post-file -d 'osd crash debugpack' /tmp/debug.tar.gz
```
#### 注意事项 / 常见坑
- 包内可能包含日志与 core 文件,**上传前注意脱敏**(见 `ceph-post-file` 的安全警告)。
- 若集群在运行,会执行 `ceph report`,需要能连上集群。
> 引自:[ceph-debugpack](https://docs.ceph.com/en/tentacle/man/8/ceph-debugpack/)
---
## 四、RADOS
### 4.1 `rados`
**用途**:与 Ceph 对象存储集群(RADOS)交互的工具——对象增删改查、池快照、omap/xattr 操作、性能压测等。
**语法(synopsis,保留原文格式)**:
```text
rados [ options ] [ command ]
```
#### 全局选项表
| 选项 | 参数 | 默认值 | 说明 |
|---|---|---|---|
| `--object-locator object_locator` | locator | 无 | 为操作设置 object_locator |
| `-p pool`, `--pool pool` | 池名 | 无(多数命令**必需**) | 指定操作的池 |
| `--target-pool pool` | 池名 | 无 | 按名字选择目标池 |
| `--pgid` | PG id | 无 | 替代 `--pool`,把命令定向到指定 PG;例如 `ls` 只列该 PG 内的对象 |
| `-N namespace`, `--namespace namespace` | namespace | 无 | 指定 rados namespace |
| `--all` | — | 无 | 配合 `ls` 列出**所有** namespace 的对象;放进 `CEPH_ARGS` 可设为默认 |
| `--default` | — | 无 | 配合 `ls` 只列默认 namespace;**优先于** `--all`(即使 `--all` 在环境变量里) |
| `-s snap`, `--snap snap` | 快照名 | 无 | 从指定池快照读取;对**所有**池相关的读操作有效 |
| `--create` | — | 无 | 创建指定的池或目录 |
| `-i infile` | 文件路径 | 无 | 指定输入文件作为 payload 随命令发给 monitor;仅用于特定 monitor 命令 |
| `-m monaddress[:port]` | 地址 | 无 | 直连指定 monitor |
| `-b block_size` | 字节数 | 无 | 设置 put/get/append 以及写压测使用的块大小 |
| `--striper` | — | 无 | 使用 rados 的 striping API(而非默认);适用于 stat、stat2、get、put、append、truncate、rm、ls 及所有 xattr 相关操作 |
| `-O object_size`, `--object-size object_size` | 字节数 | 无 | 设置 put/get 与写压测的对象大小 |
| `--max-objects` | 数量 | 无 | 写压测的最大对象数 |
| `--lock-cookie locker-cookie` | cookie | 无 | 设置获取 advisory lock 的 cookie(`lock get`);cookie 非空时,`lock break` 必须带上它才能找到并释放正确的锁 |
| `--target-locator` | locator | 无 | 配合 `cp` 指定新对象的 locator |
| `--target-nspace` | namespace | 无 | 配合 `cp` 指定新对象的 namespace |
| `--with-clones` | — | 无 | Cache pool 选项:flush/evict 时包含克隆 |
| `--omap-key-file file` | 文件路径 | 无 | 从文件读取 omap key |
**Bench 选项**:
| 选项 | 参数 | 说明 |
|---|---|---|
| `-t N`, `--concurrent-ios=N` | 数量 | 并发 I/O 数 |
| `--show-time` | — | 输出前加日期/时间前缀 |
| `--no-verify` | — | 不校验读取到的对象内容 |
| `--write-object` | — | 向对象中写内容 |
| `--write-omap` | — | 向 omap 写内容 |
| `--write-xattr` | — | 向扩展属性写内容 |
**Load gen 选项**:
| 选项 | 参数 | 说明 |
|---|---|---|
| `--num-objects` | 数量 | 对象总数 |
| `--min-object-size` / `--max-object-size` | 字节 | 最小/最大对象大小 |
| `--min-op-len` / `--max-op-len` | 字节 | 最小/最大 I/O 操作大小 |
| `--max-ops` | 数量 | 最大操作数 |
| `--max-backlog` | 大小 | 最大 backlog |
| `--read-percent` | 百分比 | 读操作占比 |
| `--target-throughput` | 字节 | 目标吞吐 |
| `--run-length` | 秒 | 总运行时长 |
| `--offset-align` | 边界 | 随机操作偏移对齐边界 |
**通用选项(Generic)**:
| 选项 | 参数 | 默认值 | 说明 |
|---|---|---|---|
| `-c FILE`, `--conf FILE` | 文件路径 | 无 | 从指定配置文件读取配置 |
| `--id ID` | id | 无 | 设置 client entity 的 ID 部分(如 admin → client.admin) |
| `-n TYPE.ID`, `--name TYPE.ID` | TYPE.ID | 无 | 设置完整实体名(如 client.admin) |
| `--cluster NAME` | 集群名 | **ceph** | 设置集群名 |
| `--setuser USER` | 用户/uid | 无 | 设置 uid(及用户的 gid) |
| `--setgroup GROUP` | 组/gid | 无 | 设置 gid |
| `--version` | — | 无 | 显示版本并退出 |
#### 命令表
**全局命令**:
| 命令 | 语法 | 说明 |
|---|---|---|
| `lspools` | `lspools` | 列出对象池 |
| `df` | `df` | 显示利用率统计(磁盘字节数 + 对象数),含全系统与按池拆分 |
| `list-inconsistent-pg` | `list-inconsistent-pg *pool*` | 列出指定池中的不一致 PG |
| `list-inconsistent-obj` | `list-inconsistent-obj *pgid*` | 列出指定 PG 中的不一致对象 |
| `list-inconsistent-snapset` | `list-inconsistent-snapset *pgid*` | 列出指定 PG 中不一致的 snapset |
**池相关命令**:
| 命令 | 语法 | 说明 |
|---|---|---|
| `get` | `get *name* *outfile*` | 读取对象并写到 outfile |
| `put` | `put *name* *infile* [--offset offset]` | 写入对象,起始 offset 默认 0 |
| `append` | `append *name* *infile*` | 追加内容到对象 |
| `rm` | `rm [--force-full] *name* ...` | 删除对象;`--force-full` 允许在集群标记 full 时删除 |
| `listwatchers` | `listwatchers *name*` | 列出对象的 watcher |
| `ls` | `ls *outfile*` | 列出池中对象并写入 outfile;配合 `--pgid` 只列该 PG 内对象 |
| `lssnap` | `lssnap` | 列出该池的快照 |
| `mksnap` | `mksnap *foo*` | 创建名为 foo 的池快照 |
| `rmsnap` | `rmsnap *foo*` | 删除池快照 |
| `bench` | `bench *seconds* *mode* [ -b *objsize* ] [ -t *threads* ]` | 压测;mode = `write`/`seq`/`rand` |
| `cleanup` | `cleanup [ --run-name *run_name* ] [ --prefix *prefix* ]` | 清理上一次压测残留 |
| `listxattr` / `getxattr` / `setxattr` / `rmxattr` | `... *name* [*attr*] [*value*]` | 列出/取/设/删扩展属性 |
| `stat` | `stat *name*` | 取对象状态(mtime、size) |
| `stat2` | `stat2 *name*` | 同 stat,但时间精度更高 |
| `listomapkeys` | `listomapkeys *name*` | 列出对象 omap 中所有 key |
| `listomapvals` | `listomapvals *name*` | 列出对象 omap 中所有 key/value;**value 以十六进制输出** |
| `getomapval` | `getomapval [ --omap-key-file *file* ] *name* *key* [ *out-file* ]` | 取 omap 中 key 的十六进制 value;不给出 out-file 则写到 stdout |
| `setomapval` | `setomapval [ --omap-key-file *file* ] *name* *key* [ *value* ]` | 设置 omap 键值;不给出 value 则从 stdin 读 |
| `rmomapkey` | `rmomapkey [ --omap-key-file *file* ] *name* *key*` | 删除 omap 中的 key |
| `getomapheader` | `getomapheader *name*` | 取 omap header 的十六进制值 |
| `setomapheader` | `setomapheader *name* *value*` | 设置 omap header |
| `export` | `export *filename*` | 把池内容序列化到文件或 stdout |
| `import` | `import [--dry-run] [--no-overwrite] < filename \| -` | 从文件或 stdin 载入池内容 |
#### 典型示例
```bash
# 集群与池利用率
rados df
rados lspools
# 列出对象
rados -p foo ls -
rados --pgid 0.6 ls
rados -p foo --all ls -
# 对象读写
rados -p foo put myobject blah.txt
rados -p foo get myobject /tmp/out.txt
rados -p foo stat myobject
rados -p foo rm myobject
# 池快照
rados -p foo mksnap mysnap
rados -p foo lssnap
rados -p foo -s mysnap get myobject blah.txt.old
rados -p foo rmsnap mysnap
# xattr / omap
rados -p foo setxattr myobject mykey myvalue
rados -p foo getxattr myobject mykey
rados -p foo listxattr myobject
rados -p foo setomapval myobject key1 val1
rados -p foo getomapval myobject key1
rados -p foo listomapvals myobject
# 压测:先写(不清数据),再顺序/随机读
rados -p foo bench 60 write --no-cleanup
rados -p foo bench 60 seq
rados -p foo bench 60 rand -t 32
rados -p foo cleanup
# 不一致对象排查
rados list-inconsistent-obj 0.6 --format=json-pretty
# 池导入导出
rados -p foo export /tmp/pool.export
rados -p foo import --dry-run /tmp/pool.export
```
#### 注意事项 / 常见坑
- **`put` 的警告**(文档原文重点):`put` 会创建**单个** RADOS 对象,大小就等于你的输入文件。除非你的对象大小合理且一致,否则**这可能不是你想要的**——请考虑使用 RGW/S3、CephFS 或 RBD。
- `bench` 默认对象大小 **4 MB**,默认模拟线程数(并发写)**16**;`-b objsize` **只在 write 模式有效**。
- **`write` 和 `seq` 必须在同一台主机上运行**,否则 write 创建的对象名会导致 seq 失败。
- 跑读压测(`seq`/`rand`)前,必须先跑带 `--no-cleanup` 的写压测。
- `cleanup` 的默认 `--run-name` 是 `benchmark_last_metadata`;`bench` 的 `--run-name <label>` 也是该默认值,多客户端压测同一负载时用它可以区分。
- `--default` 优先于 `--all`,即使 `--all` 在 `CEPH_ARGS` 里。
- `listomapvals` 的 value 以**十六进制**输出。
- `--lock-cookie`:cookie 非空时,`lock break` 必须带上同样的 cookie。
> 引自:[rados](https://docs.ceph.com/en/tentacle/man/8/rados/)
---
## 五、RBD
### 5.1 `rbd`
**用途**:管理 RADOS 块设备(RBD)镜像的工具,被 Linux rbd 驱动与 QEMU/KVM 的 rbd 存储驱动使用。
**语法(synopsis,保留原文格式)**:
```text
rbd [ -c ceph.conf ] [ -m monaddr ] [--cluster cluster-name] [ -p | --pool pool ] [ command ... ]
```
#### 常用选项表(全局 / 参数)
| 选项 | 参数 | 默认值 | 说明 |
|---|---|---|---|
| `-c ceph.conf`, `--conf ceph.conf` | 文件路径 | `/etc/ceph/ceph.conf` | 使用指定配置文件确定 monitor 地址 |
| `-m monaddress[:port]` | 地址 | 无 | 直连指定 monitor |
| `--cluster cluster-name` | 集群名 | **ceph** | 使用非默认集群名 |
| `-p pool-name`, `--pool pool-name` | 池名 | 无(多数命令必需) | 指定操作的池 |
| `--namespace namespace-name` | namespace | 无 | 使用池中预定义的 image namespace |
| `--no-progress` | — | 无 | 不输出进度信息(默认某些命令输出到 stderr) |
| `--image-format format-id` | 1 或 2 | **2** | 指定对象布局。format 1 已废弃(不支持克隆);format 2 支持克隆,自 Bobtail 起 librbd 支持、内核 3.10 起内核 rbd 支持("fancy" striping 需 4.17+) |
| `-s size-in-M/G/T`, `--size size-in-M/G/T` | 大小 | 无 | 新建镜像的大小或已有镜像的新大小;**不带后缀时默认单位 M** |
| `--object-size size-in-B/K/M` | 大小 | **4M**(最小 4K,最大 32M) | 对象大小,会向上取整到最接近的 2 的幂;不带后缀默认单位 B。可用配置项 `rbd_default_order` 改默认(默认对象大小 = 2^rbd_default_order) |
| `--stripe-unit size-in-B/K/M` | 大小 | 等于 object size | 条带单元大小;不带后缀默认单位 B |
| `--stripe-count num` | 数量 | **1** | 回绕到第一个对象之前条带化的对象数 |
| `--snap snap` | 快照名 | 无 | 指定操作针对的快照 |
| `--id username` | 用户名(不含 `client.` 前缀) | 无 | 用于 `map` 命令的用户名 |
| `--keyring filename` | 文件路径 | 默认 keyring 路径 | 含指定用户 secret 的 keyring 文件 |
| `--keyfile filename` | 文件路径 | 无 | 含 `--id user` secret key 的文件;**若同时给了 `--keyring`,则被 `--keyring` 覆盖** |
| `--shared lock-tag` | tag 字符串 | 无 | 用于 `lock add`:允许多个客户端用相同 tag 同时锁定同一镜像(如 VM 热迁移、集群文件系统场景) |
| `--format format` | `plain` / `json` / `xml` | **plain** | 输出格式 |
| `--pretty-format` | — | 无 | 让 json/xml 输出更易读 |
| `-o krbd-options`, `--options krbd-options` | 逗号分隔选项串 | 无 | 通过 rbd 内核驱动映射/解映射时使用的选项(类似 mount(8) 的挂载选项) |
| `--read-only` | — | 无 | 只读映射,等价于 `-o ro` |
| `--image-feature feature-name` | 特性名(可重复) | 无 | 创建时启用的 RBD format 2 特性 |
| `--image-shared` | — | 无 | 声明镜像将被多客户端并发使用,会禁用依赖独占所有权的功能 |
| `--whole-object` | — | 无 | 把 diff 限制在完整对象的范围内(开启 object-map 时可大幅提升 diff 性能) |
| `--limit` | 数量 | 无 | 允许的快照数量上限 |
**支持的 `--image-feature`**:`layering`、`striping`、`exclusive-lock`、`object-map`(依赖 exclusive-lock)、`fast-diff`(依赖 object-map)、`deep-flatten`、`journaling`(依赖 exclusive-lock)、`data-pool`。
#### Spec 写法
```text
image-spec is [pool-name/[namespace-name/]]image-name
snap-spec is [pool-name/[namespace-name/]]image-name@snap-name
group-spec is [pool-name/[namespace-name/]]group-name
group-snap-spec is [pool-name/[namespace-name/]]group-name@snap-name
journal-spec is [pool-name/[namespace-name/]]journal-name
```
- `pool-name` 默认 **`rbd`**,`namespace-name` 默认为空串。
- 若镜像名包含 `/` 字符,则 **`pool-name` 是必需的**。
- `journal-name` 就是 *image-id*。
- 也可以用 `--pool`、`--namespace`、`--image`、`--snap` 分别指定,但**不推荐**,优先用上面的 spec 语法。
#### 命令表(按主题分组)
**① 镜像基础:创建 / 列表 / 信息 / 删除 / 改名 / 扩容**
| 命令 | 语法/要点 | 说明 |
|---|---|---|
| `create` | `create (-s\|--size *size-in-M/G/T*) [--image-format *format-id*] [--object-size *size-in-B/K/M*] [--stripe-unit ... --stripe-count ...] [--thick-provision] [--no-progress] [--image-feature *feature-name*]... [--image-shared] *image-spec*` | 创建新镜像,**必须**指定 `--size`;`--stripe-unit` 与 `--stripe-count` 可选但必须成对;`--thick-provision` 会在创建时**全量预分配**(耗时很长,需把整个镜像清零) |
| `ls` | `ls [-l\|--long] [*pool-name*]` | 列出 `rbd_directory` 对象中的镜像;`-l` 显示快照及更长格式(size、parent(若是克隆)、format 等) |
| `info` | `info *image-spec* \| *snap-spec*` | 显示镜像信息;克隆会显示父信息;指定快照时显示是否受保护 |
| `rm` | `rm *image-spec*` | 删除镜像(含所有数据块);**若存在快照则失败,且什么都不会删** |
| `mv` | `mv *src-image-spec* *dest-image-spec*` | 重命名镜像;**不支持跨池** |
| `resize` | `resize (-s\|--size *size-in-M/G/T*) [--allow-shrink] [--encryption-format ... --encryption-passphrase-file ...]... *image-spec*` | 调整大小;`--allow-shrink` 允许缩小 |
| `du` | `du [-p\|--pool *pool-name*] [*image-spec*\|*snap-spec*] [--merge-snapshots]` | 计算预分配与实际磁盘占用;`--merge-snapshots` 把快照占用并入父镜像 |
| `status` | `status *image-spec*` | 显示镜像状态,包括哪些客户端打开了它 |
| `sparsify` | `sparsify [--sparse-size *sparse-size*] *image-spec*` | 回收全零区域的空间;默认 sparse size **4096 字节**,必须是 2 的幂、不小于 4096、不大于镜像 object size |
| `bench` | `bench --io-type <read\|write\|readwrite\|rw> [--io-size *size-in-B/K/M/G/T*] [--io-threads *num-ios-in-flight*] [--io-total *size-in-B/K/M/G/T*] [--io-pattern seq\|rand] [--rw-mix-read *read proportion in readwrite*] *image-spec*` | 生成 I/O 并测量吞吐与延迟。默认:`--io-size 4096`、`--io-threads 16`、`--io-total 1G`、`--io-pattern seq`、`--rw-mix-read 50`;`--io-size`/`--io-total` 不带后缀默认单位 B |
| `watch` | `watch *image-spec*` | 观察镜像上的事件 |
> `du` 性能提示:若镜像未启用 **fast-diff** 特性,该操作需要向 OSD 查询镜像内**每一个**潜在对象。
**② 快照 / 克隆**
| 命令 | 语法 | 说明 |
|---|---|---|
| `snap create` | `snap create *snap-spec*` | 创建快照(**必须**指定快照名) |
| `snap ls` | `snap ls *image-spec*` | 列出镜像快照 |
| `snap rename` | `snap rename *src-snap-spec* *dest-snap-spec*` | 重命名;**不支持跨池、跨镜像** |
| `snap rm` | `snap rm [--force] *snap-spec*` | 删除快照 |
| `snap purge` | `snap purge *image-spec*` | 删除镜像上所有**未受保护**的快照 |
| `snap protect` / `unprotect` | `snap protect\|unprotect *snap-spec*` | 保护/取消保护快照(克隆前必须 protect;若仍有克隆子镜像,unprotect 会失败)。**需要 format 2** |
| `snap rollback` | `snap rollback *snap-spec*` | 把镜像内容回滚到快照 |
| `snap limit set` / `clear` | `snap limit set [--limit] *limit* *image-spec*` / `snap limit clear *image-spec*` | 设置/清除快照数量上限 |
| `clone` | `clone [--object-size ...] [--stripe-unit ... --stripe-count ...] [--image-feature ...] [--image-shared] *parent-snap-spec* *child-image-spec*` | 创建 COW 克隆;父快照**必须受保护**;对象大小默认与父一致,大小与父快照相同。**需要 format 2** |
| `children` | `children *snap-spec*` | 列出该快照的克隆(会**检查每个池**,输出 poolname/imagename)。**需要 format 2** |
| `flatten` | `flatten [--encryption-format ... --encryption-passphrase-file ...]... *image-spec*` | 把克隆从父快照复制所有共享块并独立;之后父快照可 unprotect 并删除(若无其他依赖克隆)。**需要 format 2** |
**③ 导入 / 导出 / 增量差异**
| 命令 | 语法 | 说明 |
|---|---|---|
| `cp` | `cp (*src-image-spec*\|*src-snap-spec*) *dest-image-spec*` | 复制内容到新镜像(大小、对象大小、format 相同);**不复制快照**,需快照请用 `deep cp` |
| `deep cp` | `deep cp (*src-image-spec*\|*src-snap-spec*) *dest-image-spec*` | 深度复制,同 size/object-size/format **并包含快照** |
| `export` | `export [--export-format *format (1 or 2)*] (*image-spec*\|*snap-spec*) [*dest-path*]` | 导出到路径(`-` 表示 stdout);format 2 还会导出快照及 image_order、features 等属性 |
| `import` | `import [--export-format *format (1 or 2)*] [--image-format *format-id*] [--object-size ...] [--stripe-unit ... --stripe-count ...] [--image-feature ...]... [--image-shared] *src-path* [*image-spec*]` | 从路径导入(`-` 表示 stdin);尽可能创建 sparse 镜像;从 stdin 导入时稀疏化单位为目标镜像的 data block size(object size) |
| `diff` | `diff [--from-snap *snap-name*] [--whole-object] *image-spec*\|*snap-spec*` | 输出自起始快照(或创建以来)发生变化的字节区间;每行含起始偏移、长度、以及 `zero`/`data` |
| `export-diff` | `export-diff [--from-snap *snap-name*] [--whole-object] (*image-spec*\|*snap-spec*) *dest-path*` | 导出增量差异(`-` 表示 stdout);结束快照用 `--snap` 或 `@snap` 指定 |
| `import-diff` | `import-diff *src-path* *image-spec*` | 应用增量差异;若差异基于某个起始快照会先校验其存在,若有结束快照则校验其不存在并在完成后创建 |
| `merge-diff` | `merge-diff *first-diff-path* *second-diff-path* *merged-diff-path*` | 合并两段连续增量差异;首段结束快照必须等于次段起始快照;`first`/`merged` 可用 `-`;**当前仅支持 stripe-count == 1 的源增量差异** |
**④ 设备映射(`device`)**
| 命令 | 语法 | 说明 |
|---|---|---|
| `device list` | `device list [-t\|--device-type *device-type*] [--format plain\|json\|xml] --pretty-format` | 显示已映射的镜像(默认 rbd 内核模块,或 `nbd`/`ubbd`(Linux)、`ggate`(FreeBSD)) |
| `device map` | `device map [-t\|--device-type *device-type*] [--cookie *device-cookie*] [--show-cookie] [--snap-id *snap-id*] [--read-only] [--exclusive] [-o\|--options *device-options*] *image-spec*\|*snap-spec*` | 映射为块设备 |
| `device unmap` | `device unmap [-t\|--device-type *device-type*] [-o\|--options *device-options*] [--snap-id *snap-id*] *image-spec*\|*snap-spec*\|*device-path*` | 解映射 |
| `device attach` | `device attach [-t\|--device-type *device-type*] --device *device-path* [--cookie ...] [--show-cookie] [--snap-id ...] [--read-only] [--exclusive] [--force] [-o\|--options ...] *image-spec*\|*snap-spec*` | 把镜像挂到指定块设备(**目前仅 Linux 的 `nbd`**)。**不安全,通常不应使用**:指定错镜像或错设备可能导致数据损坏,因为 nbd 内核驱动不做校验 |
| `device detach` | `device detach [-t\|--device-type *device-type*] [-o\|--options ...] [--snap-id ...] *image-spec*\|*snap-spec*\|*device-path*` | 分离已映射/挂接的设备(**目前仅 Linux 的 `nbd`**)。**不安全,通常不应使用** |
> `--options` 是逗号分隔的设备类型专有选项串(`opt1,opt2=val,...`)。
**⑤ group(一致性组)**
| 命令 | 语法 | 说明 |
|---|---|---|
| `group create` | `group create *group-spec*` | 创建组 |
| `group ls` | `group ls [-p\|--pool *pool-name*]` | 列出组 |
| `group rename` | `group rename *src-group-spec* *dest-group-spec*` | 重命名(**不支持跨池**) |
| `group rm` | `group rm *group-spec*` | 删除组 |
| `group image add` / `list` / `remove` | `group image add\|list\|remove *group-spec* [*image-spec*]` | 组中增删/列出镜像 |
| `group snap create` / `list` / `info` / `rm` / `rename` / `rollback` | `group snap ... *group-snap-spec*` 等 | 组快照的创建/列出/信息/删除/改名/回滚 |
**⑥ mirror(镜像复制 / 灾备)**
| 命令 | 语法 | 说明 |
|---|---|---|
| `mirror pool enable` | `mirror pool enable *pool-name* *mode* [--remote-namespace *remote-namespace-name*]` | 在池/namespace 上启用镜像;mode = `pool` 或 `image`;`--remote-namespace` 可镜像到远端池的不同 namespace |
| `mirror pool disable` | `mirror pool disable [*pool-name*]` | 关闭;同时会关闭该池/namespace 内所有镜像(默认或显式启用的) |
| `mirror pool info` | `mirror pool info [*pool-name*]` | 显示镜像配置(mode、mirror UUID、remote namespace;池还含 site name、peer UUID、远端集群名与客户端名) |
| `mirror pool status` | `mirror pool status [--verbose] [*pool-name*]` | 显示池/namespace 内所有镜像的状态 |
| `mirror pool promote` / `demote` | `mirror pool promote\|demote [--force] [*pool-name*]` | 把所有镜像提升/降级为 primary/non-primary |
| `mirror pool peer add` | `mirror pool peer add [*pool-name*] *remote-cluster-spec*` | 添加 peer;`remote-cluster-spec` = `[*remote client name*@]*remote cluster name*,远端客户端名默认 `client.admin`。**要求池已启用镜像** |
| `mirror pool peer remove` | `mirror pool peer remove [*pool-name*] *uuid*` | 移除 peer(UUID 见 `mirror pool info`) |
| `mirror pool peer set` | `mirror pool peer set [*pool-name*] *uuid* *key* *value*` | 修改 peer 设置;key 可为 `client` 或 `cluster` |
| `mirror image enable` | `mirror image enable *image-spec* *mode*` | 为镜像启用镜像;mode 可为 `journal`(默认,需 journaling 特性)或 `snapshot` |
| `mirror image disable` | `mirror image disable [--force] *image-spec*` | 关闭镜像的镜像功能 |
| `mirror image promote` / `demote` | `mirror image promote\|demote [--force] *image-spec*` | 提升/降级 |
| `mirror image resync` | `mirror image resync *image-spec*` | 强制重新同步到 primary |
| `mirror image status` | `mirror image status *image-spec*` | 显示镜像状态 |
| `mirror snapshot schedule add` | `mirror snapshot schedule add [-p\|--pool *pool*] [--namespace *namespace*] [--image *image*] *interval* [*start-time*]` | 添加快照调度;interval 可用 `d`/`h`/`m` 后缀;start-time 为 ISO 8601 时间串;都不指定则为**全局**调度 |
| `mirror snapshot schedule list` | `... list [-R\|--recursive] [--format *format*] [--pretty-format] [-p\|--pool ...] [--namespace ...] [--image ...]` | 列出调度 |
| `mirror snapshot schedule remove` | `... remove [-p\|--pool ...] [--namespace ...] [--image ...] *interval* [*start-time*]` | 删除调度 |
| `mirror snapshot schedule status` | `... status [-p\|--pool ...] [--format ...] [--pretty-format] [--namespace ...] [--image ...]` | 显示调度状态 |
**⑦ trash(回收站 / 延迟删除)**
| 命令 | 语法 | 说明 |
|---|---|---|
| `trash ls` | `trash ls [*pool-name*]` | 列出回收站条目 |
| `trash mv` | `trash mv [--expires-at <expires-at>] *image-spec*` | 移入回收站(**即使正被克隆使用也可以**);`--expires-at` 设置何时起允许被删除 |
| `trash restore` | `trash restore *image-id*` | 恢复 |
| `trash rm` | `trash rm [--force] *image-id*` | 删除;延迟时间未过可用 `--force`。**正被克隆使用或含有快照的镜像不能被删除** |
| `trash purge` | `trash purge [*pool-name*]` | 清除所有已过期的镜像 |
| `trash purge schedule add/list/remove/status` | `trash purge schedule ... [-p\|--pool *pool*] [--namespace *namespace*] *interval* [*start-time*]` | 定时清理调度(list 支持 `-R\|--recursive`、`--format`、`--pretty-format`) |
**⑧ 其他:namespace / config / meta / 特性 / 加密 / 迁移 / journal / lock / object-map / pool init**
| 命令 | 语法 | 说明 |
|---|---|---|
| `namespace create` / `list` / `remove` | `namespace create *pool-name*/*namespace-name*`、`namespace list *pool-name*`、`namespace remove *pool-name*/*namespace-name*` | 创建/列出/删除 namespace(remove 只删空 namespace) |
| `pool init` | `pool init [*pool-name*] [--force]` | 初始化池以供 RBD 使用;**新建的池使用前必须先初始化** |
| `config global get/list/set/remove` | `config global ... *config-entity* *key* [*value*]` | global 级配置覆盖(list 支持 `--format plain\|json\|xml` 与 `--pretty-format`) |
| `config pool get/list/set/remove` | `config pool ... *pool-name* *key* [*value*]` | pool 级配置覆盖 |
| `config image get/list/set/remove` | `config image ... *image-spec* *key* [*value*]` | image 级配置覆盖 |
| `image-meta get/list/remove/set` | `image-meta ... *image-spec* [*key*] [*value*]` | 镜像元数据;list 第一列 key、第二列 value |
| `feature enable` / `disable` | `feature enable\|disable *image-spec* *feature-name*...` | 启用/禁用特性(可指定多个) |
| `encryption format` | `encryption format *image-spec* *format* *passphrase-file* [--cipher-alg *alg*]` | 把镜像格式化为加密格式;**此前写入的所有数据将不可读**。支持格式 `luks1`、`luks2`;算法 `aes-128`、`aes-256`(默认) |
| `object-map check` / `rebuild` | `object-map check\|rebuild *image-spec*\|*snap-spec*` | 校验/重建 object map |
| `journal client disconnect` | `journal client disconnect *journal-spec*` | 把镜像 journal 客户端标记为断开 |
| `journal export` / `import` | `journal export [--verbose] [--no-error] *src-journal-spec* *path-name*` / `journal import ... *path-name* *dest-journal-spec*` | 导出/导入 journal(`-` 表示 stdout/stdin);适合在危险操作前备份 |
| `journal info` / `inspect` / `reset` / `status` | `journal info\|inspect\|reset\|status *journal-spec*` | 信息 / 结构错误检查 / 重置 / 状态 |
| `lock add` / `ls` / `rm` | `lock add [--shared *lock-tag*] *image-spec* *lock-id` / `lock ls *image-spec*` / `lock rm *image-spec* *lock-id* *locker*` | 加/列/解镜像锁。默认排他锁(已锁定则失败);`--shared` 用相同 tag 可多客户端共享。**加锁不影响任何其他操作,也不保护镜像不被删除** |
| `migration prepare` | `migration prepare [--order *order*] [--object-size ...] [--image-feature ...] [--image-shared] [--stripe-unit ...] [--stripe-count ...] [--data-pool *data-pool*] [--import-only] [--source-spec *json*] [--source-spec-path *path*] *src-image-spec* [*dest-image-spec*]` | 迁移第一步(改变位置/format 等不能动态改的参数);目标可与源相同(此时可省略 dest);完成后源成为目标的父,目标以 COW 方式可访问。`--import-only` + `--source-spec`/`--source-spec-path` 可从只读导入源迁移 |
| `migration execute` | `migration execute *image-spec*` | 第二步:拷贝数据到目标 |
| `migration commit` | `migration commit *image-spec*` | 第三步:删除源镜像数据 |
| `migration abort` | `migration abort *image-spec*` | 取消迁移,回到初始状态;**对目标镜像的所有修改都会丢失** |
#### Kernel rbd(krbd)选项
**Per client instance(`rbd device map` 时)**:
| 选项 | 说明 |
|---|---|
| `fsid=aaaaaaaa-bbbb-cccc-dddd-eeeeeeeeeeee` | 客户端应采用的 FSID |
| `ip=a.b.c.d[:p]` | 客户端使用的 IP(及可选端口) |
| `share` / `noshare` | 启用(默认)/禁用 与其他映射共享客户端实例 |
| `crc` / `nocrc` | 对 msgr1 启用(默认)/禁用 CRC32C 校验。msgr2.1 会忽略:'crc' 模式始终全校验,'secure' 模式始终不校验;`nocrc` 只关闭 payload 校验,header 校验始终开 |
| `cephx_require_signatures` / `nocephx_require_signatures` | 要求/不要求 msgr1 消息签名(自 3.19,默认要求;**已废弃**,将来会移除) |
| `tcp_nodelay` / `notcp_nodelay` | 关闭(自 4.0,默认)/启用 Nagle 算法 |
| `cephx_sign_messages` / `nocephx_sign_messages` | 对 msgr1 启用(自 4.4,默认)/禁用 消息签名;msgr2.1 会忽略 |
| `mount_timeout=x` | `map`/`unmap` 各步骤的超时(默认 60 秒);自 4.2 起可保证断网时 `unmap` 最终超时退出 |
| `osdkeepalive=x` | OSD keepalive 超时(默认 5 秒) |
| `osd_idle_ttl=x` | OSD idle TTL(默认 60 秒) |
**Per mapping(块设备级)**:
| 选项 | 说明 |
|---|---|
| `rw` / `ro` | 读写(默认,被 `--read-only` 覆盖)/只读(等价 `--read-only`) |
| `queue_depth=x` | 队列深度(自 4.2,默认 128) |
| `lock_on_read` | 读时也获取排他锁(自 4.9) |
| `exclusive` | 禁用自动排他锁切换(自 4.12),等价 `--exclusive` |
| `lock_timeout=x` | 等待获取排他锁的超时(自 4.17,默认 0 秒=不超时) |
| `notrim` | 关闭 discard 与 write zeroes 卸载(自 4.17);discard 将返回 -EOPNOTSUPP,write zeroes 回退为手工清零 |
| `abort_on_full` | 集群满或数据池达配额时以 -ENOSPC 让写失败(自 5.0);默认是阻塞直到 full 解除 |
| `alloc_size` | 底层 OSD 对象存储的最小分配单元(自 5.1,默认 64K),用于取整并丢弃过小的 discard。bluestore 推荐设为 `bluestore_min_alloc_size`(当前所有类型设备均为 4K);filestore 且 `filestore_punch_hole = false` 时推荐设为镜像 object size(通常 4M) |
| `crush_location=x` | 客户端在 CRUSH 层级中的位置(自 5.8);`\|` 分隔键值对、`:` 分隔键值,如 `crush_location=rack:myrack\|datacenter:mydc\|region:myregion`;支持"多路径" |
| `read_from_replica=no\|balance\|localize` | 不使用副本读(自 5.8,默认)/随机挑 acting set 中的 OSD/挑最"本地"的 OSD |
| `compression_hint=none\|compressible\|incompressible` | 压缩提示(自 5.8,默认 `none`) |
| `ms_mode=legacy\|crc\|secure\|prefer-crc\|prefer-secure` | 传输协议与模式(自 5.11;默认 `prefer-crc`)。`secure` 提供完整传输中加密;`*-crc`/`*-secure` 被拒时会退让 |
| `rxbounce` | 接收数据时使用 bounce buffer(自 5.17);目标是避免非稳定目标缓冲区带来的 crc/完整性错误 |
| `udev` / `noudev` | 等待(默认)/不等待 udev 执行完匹配规则。**该选项不会传给内核** |
**`rbd device unmap` 选项**:`force`(自 4.9,强制解映射已打开的设备)、`udev` / `noudev`(同上,默认 `udev`)。
#### 典型示例
```bash
# 创建与查看
rbd create mypool/myimage --size 102400
rbd create mypool/myimage --size 102400 --object-size 8M
rbd create mypool/myimage --size 102400 --stripe-unit 65536B --stripe-count 16
rbd ls -l mypool
rbd info mypool/myimage
rbd du mypool/myimage
rbd status mypool/myimage
rbd rm mypool/myimage
# 快照与克隆
rbd snap create mypool/myimage@mysnap
rbd snap ls mypool/myimage
rbd snap protect mypool/myimage@mysnap
rbd clone mypool/myimage@mysnap otherpool/cloneimage
rbd children mypool/myimage@mysnap
rbd flatten otherpool/cloneimage
rbd snap unprotect mypool/myimage@mysnap
rbd snap rm mypool/myimage@mysnap
rbd snap rollback mypool/myimage@mysnap
# 导入导出与增量
rbd export mypool/myimage@snap /tmp/img
rbd import --image-format 2 /tmp/img mypool/myimage2
rbd export-diff mypool/myimage@snap1 --from-snap snap0 /tmp/diff1
rbd import-diff /tmp/diff1 mypool/otherimage
rbd merge-diff /tmp/diff1 /tmp/diff2 /tmp/diff_merged
# 映射与卸载
rbd device map mypool/myimage --id admin --keyfile secretfile
rbd device map mypool/myimage --cluster cluster-name
rbd device map mypool/myimage --read-only
rbd device map mypool/myimage -o queue_depth=1024,lock_on_read
rbd device list
rbd device unmap /dev/rbd0
rbd device unmap mypool/myimage -o force
# namespace / pool init / feature
rbd pool init mypool
rbd namespace create mypool/ns1
rbd namespace list mypool
rbd feature enable mypool/myimage exclusive-lock object-map fast-diff
rbd feature disable mypool/myimage journaling
# 加密
rbd encryption format mypool/myimage luks2 /etc/luks/passphrase --cipher-alg aes-256
# 镜像复制(mirroring)
rbd mirror pool enable mypool pool
rbd mirror pool peer add mypool client.admin@remote-cluster
rbd mirror pool status mypool --verbose
rbd mirror image enable mypool/myimage snapshot
rbd mirror snapshot schedule add --pool mypool --image myimage 12h 14:00:00-05:00
# 回收站
rbd trash mv mypool/myimage --expires-at "tomorrow"
rbd trash ls mypool
rbd trash restore mypool/myimage-id
rbd trash restore mypool/myimage-id --image mynewimage
rbd trash rm mypool/myimage-id --force
rbd trash purge mypool
# 迁移
rbd migration prepare mypool/src mypool/dst
rbd migration execute mypool/dst
rbd migration commit mypool/dst
# 出问题可回滚
rbd migration abort mypool/dst
# 锁
rbd lock add mypool/myimage mylockid
rbd lock ls mypool/myimage
rbd lock remove mypool/myimage mylockid client.2485
# I/O 压测
rbd bench --io-type write --io-total 1G --io-threads 16 mypool/myimage
rbd bench --io-type rand --io-pattern rand --io-size 4K mypool/myimage
```
#### 注意事项 / 常见坑
- **镜像名含 `/` 时必须显式写 `pool-name`**。
- `rbd rm` 在镜像**存在快照时会失败且什么都不删**——先清快照或先 `trash mv`。
- 克隆相关(`clone`/`children`/`flatten`/`snap protect`)**都要求 image format 2**;`clone` 前父快照必须 `snap protect`。
- `snap unprotect` 在仍有克隆子镜像时失败,且克隆**可能在别的池**里。
- `--stripe-unit` 与 `--stripe-count` **必须成对使用**。
- `--thick-provision` 需要把整个镜像清零,创建会很慢。
- 跨池 rename(`mv`、`group rename`)**不支持**;快照 rename 不支持跨池跨镜像。
- `du` 在未启用 fast-diff 时要遍历所有潜在对象,代价很高。
- `merge-diff` 当前**只支持 stripe-count == 1** 的源增量差异。
- `device attach` / `device detach` 文档明确标注**不安全、通常不应使用**(nbd 内核驱动不做校验,选错镜像/设备会损坏数据)。
- `lock add` 只是加个标记:**不影响任何其他操作,也不能保护镜像不被删除**。
- `read_from_replica=balance|localize` 只有 **Octopus 之后**(即执行过 `ceph osd require-osd-release octopus`)才对通用场景安全,否则仅限只读负载(如到处只读映射的镜像或快照)。
- `migration abort` 会丢失对目标镜像的所有修改。
- 新建的池在使用 RBD 前**必须先 `rbd pool init`**。
- `trash rm` 不能删除正被克隆使用或含快照的镜像;`--force` 也只能越过"延迟时间未过"这一限制。
- `encryption format` 会让此前写入的数据**不可读**。
> 引自:[rbd](https://docs.ceph.com/en/tentacle/man/8/rbd/)
---
### 5.2 `rbd-fuse`
**用途**:RBD 镜像的 FUSE 客户端——把一个含 rbd 镜像的池挂载为用户态文件系统,让镜像在挂载点下像普通文件一样可访问。
**语法(synopsis,保留原文格式)**:
```text
rbd-fuse [ -p pool ] [-c conffile] mountpoint [ fuse options ]
```
#### 常用选项表
| 选项 | 参数 | 默认值 | 说明 |
|---|---|---|---|
| `-c ceph.conf` | 文件路径 | `/etc/ceph/ceph.conf` | 使用指定配置文件确定 monitor 地址 |
| `-p pool` | 池名 | **`rbd`** | 指定搜索 rbd 镜像的池 |
> 任何 `rbd-fuse` 不认识的选项都会被转交给 libfuse。
#### 典型示例
```bash
# 挂载默认 rbd 池
rbd-fuse /mnt/rbd
# 指定池与配置文件
rbd-fuse -p mypool -c /etc/ceph/foo.conf /mnt/rbd
# 卸载
fusermount -u /mnt/rbd
# 或向 rbd-fuse 进程发 SIGINT
```
#### 注意事项 / 常见坑
- **不推荐用于任何生产或高性能负载**(文档原文明确)。
- 卸载方式:`fusermount -u mountpoint`,或向 `rbd-fuse` 进程发送 `SIGINT`。
> 引自:[rbd-fuse](https://docs.ceph.com/en/tentacle/man/8/rbd-fuse/)
---
### 5.3 `rbd-nbd`
**用途**:把 RBD 镜像映射到 **nbd(Network Block Device)** 设备,从而像本地块设备一样访问。
**语法(synopsis,保留原文格式)**:
```text
rbd-nbd [-c conf] [--read-only] [--device nbd device] [--snap-id snap-id] [--nbds_max limit] [--max_part limit] [--exclusive] [--notrim] [--encryption-format format] [--encryption-passphrase-file passphrase-file] [--io-timeout seconds] [--reattach-timeout seconds] map image-spec | snap-spec
rbd-nbd unmap nbd device | image-spec | snap-spec
rbd-nbd list-mapped
rbd-nbd attach --device nbd device image-spec | snap-spec
rbd-nbd detach nbd device | image-spec | snap-spec
```
#### 常用选项表
| 选项 | 参数 | 默认值 | 说明 |
|---|---|---|---|
| `-c ceph.conf` | 文件路径 | `/etc/ceph/ceph.conf` | 使用指定配置文件确定 monitor 地址 |
| `--read-only` | — | 无 | 只读映射 |
| `--device *nbd device*` | 设备路径 | 无 | 指定 nbd 设备 |
| `--snap-id *snapid*` | 快照 ID | 无 | 用 **ID**(而非名字)指定要 map/unmap/attach/detach 的快照 |
| `--nbds_max *limit*` | 数量 | 无 | 覆盖 nbd 内核模块的 `nbds_max` 参数(modprobe 时),限制 nbd 设备数量 |
| `--max_part *limit*` | 数量 | 无 | 覆盖模块参数 `max_part` |
| `--exclusive` | — | 无 | 禁止其他客户端写入 |
| `--notrim` | — | 无 | 关闭 trim/discard |
| `--encryption-format` | `luks` / `luks1` / `luks2` | 无 | 镜像加密格式 |
| `--encryption-passphrase-file` | 文件路径 | 无 | 含解锁镜像加密口令的文件路径 |
| `--io-timeout *seconds*` | 秒 | Linux 内核默认 **30 秒** 请求超时 | 覆盖设备超时 |
| `--reattach-timeout *seconds*` | 秒 | **30 秒** | 旧进程 detach 后内核等待新 rbd-nbd 进程 attach 的超时 |
#### Image / snap spec
```text
image-spec is [pool-name]/image-name
snap-spec is [pool-name]/image-name@snap-name
```
- `pool-name` 默认 **`rbd`**;镜像名含 `/` 时**必须**显式给出 `pool-name`。
#### 典型示例
```bash
# 映射
rbd-nbd map mypool/myimage
rbd-nbd map mypool/myimage --read-only
rbd-nbd map mypool/myimage --device /dev/nbd0
rbd-nbd map mypool/myimage --exclusive --notrim
# 映射加密镜像
rbd-nbd map mypool/myimage --encryption-format luks2 \
--encryption-passphrase-file /etc/luks/passphrase
# 查看 / 卸载
rbd-nbd list-mapped
rbd-nbd unmap /dev/nbd0
rbd-nbd unmap mypool/myimage
# 热插拔式 attach/detach
rbd-nbd attach --device /dev/nbd0 mypool/myimage
rbd-nbd detach /dev/nbd0
```
#### 注意事项 / 常见坑
- `--io-timeout` 不设时,Linux 内核默认请求超时为 30 秒。
- `--reattach-timeout` 默认 30 秒,用于旧进程退出后内核等待新进程接管的窗口。
> 引自:[rbd-nbd](https://docs.ceph.com/en/tentacle/man/8/rbd-nbd/)
---
### 5.4 `rbd-ggate`
**用途**:把 RBD 镜像映射到 **ggate(FreeBSD GEOM Gate class)** 设备,供 FreeBSD 上像本地块设备一样访问。
**语法(synopsis,保留原文格式)**:
```text
rbd-ggate [--read-only] [--exclusive] [--device ggate device] map image-spec | snap-spec
rbd-ggate unmap ggate device
rbd-ggate list
```
#### 命令表
| 命令 | 说明 |
|---|---|
| `map` | 派生一个进程,负责创建 ggate 设备并在 GEOM Gate 内核子系统与 RADOS 之间转发 I/O 请求 |
| `unmap` | 销毁 ggate 设备并终止负责它的进程 |
| `list` | 列出已映射的 ggate 设备 |
#### 常用选项表
| 选项 | 参数 | 默认值 | 说明 |
|---|---|---|---|
| `--device *ggate device*` | 设备路径 | 无 | 指定 ggate 设备路径 |
| `--read-only` | — | 无 | 只读映射 |
| `--exclusive` | — | 无 | 禁止其他客户端写入 |
#### Image / snap spec
```text
image-spec is [pool-name]/image-name
snap-spec is [pool-name]/image-name@snap-name
```
- `pool-name` 默认 **`rbd`**;镜像名含 `/` 时**必须**显式给出 `pool-name`。
#### 典型示例
```bash
# 映射
rbd-ggate map mypool/myimage
rbd-ggate map mypool/myimage --read-only
rbd-ggate map mypool/myimage --device /dev/ggate0 --exclusive
# 查看 / 卸载
rbd-ggate list
rbd-ggate unmap /dev/ggate0
```
#### 注意事项 / 常见坑
- 仅适用于 **FreeBSD**(GEOM Gate)。
- `unmap` 只接受 **ggate device** 参数(不像 `rbd-nbd` 还接受 image-spec)。
> 引自:[rbd-ggate](https://docs.ceph.com/en/tentacle/man/8/rbd-ggate/)
---
### 5.5 `rbdmap`
**用途**:一个 shell 脚本,自动对一个或多個 RBD 镜像执行 `rbd map` / `rbd unmap`;主要用途是**开机自动映射并挂载**(关机时反向执行),由 init 系统(systemd 单元 `rbdmap.service`,随 ceph-common 包提供)触发。
**语法(synopsis,保留原文格式)**:
```text
rbdmap map
rbdmap unmap
```
#### 常用选项表
| 选项 | 参数 | 默认值 | 说明 |
|---|---|---|---|
| (无) | — | — | Options: **None**(文档原文明确写 None) |
| 环境变量 `RBDMAPFILE` | 文件路径 | **`/etc/ceph/rbdmap`** | 覆盖默认配置文件路径 |
**配置文件格式**:
```text
IMAGESPEC RBDOPTS
```
- `IMAGESPEC`:`POOLNAME/IMAGENAME`,或只写 `IMAGENAME`(此时 `POOLNAME` 默认为 `rbd`)。
- `RBDOPTS`:可选,逗号分隔的 `PARAM1=VAL1,PARAM2=VAL2,...`,会传给底层 `rbd map`。
- 参数或值中含逗号或等号时,可用单引号避免被替换。
#### 典型示例
```bash
# /etc/ceph/rbdmap 内容示例(三个镜像,位于 foopool)
cat > /etc/ceph/rbdmap <<'EOF'
foopool/bar1 id=admin,keyring=/etc/ceph/ceph.client.admin.keyring
foopool/bar2 id=admin,keyring=/etc/ceph/ceph.client.admin.keyring
foopool/bar3 id=admin,keyring=/etc/ceph/ceph.client.admin.keyring,options='lock_on_read,queue_depth=1024'
EOF
# 上面内容会被转换为:
# rbd map foopool/bar1 --id admin --keyring /etc/ceph/ceph.client.admin.keyring
# rbd map foopool/bar2 --id admin --keyring /etc/ceph/ceph.client.admin.keyring
# rbd map foopool/bar3 --id admin --keyring /etc/ceph/ceph.client.admin.keyring --options lock_on_read,queue_depth=1024
# 对应的 /etc/fstab(XFS 示例)
cat >> /etc/fstab <<'EOF'
/dev/rbd/foopool/bar1 /mnt/bar1 xfs noauto 0 0
/dev/rbd/foopool/bar2 /mnt/bar2 xfs noauto 0 0
/dev/rbd/foopool/bar3 /mnt/bar3 xfs noauto 0 0
EOF
# 手动执行
rbdmap map
rbdmap unmap
# 开机自启
systemctl enable rbdmap.service
```
#### 注意事项 / 常见坑
- 挂载/卸载要成功,**友好设备名必须有对应的 `/etc/fstab` 条目**。
- 写 `/etc/fstab` 条目时**建议加 `noauto`(或 `nofail`)**,避免 init 系统在设备还不存在时就尝试挂载(`rbdmap.service` 执行的是 shell 脚本,通常在启动序列中触发得很晚)。
- `rbd map` 成功后镜像映射为 `/dev/rbdX`,随后 udev 规则创建友好符号链接 `/dev/rbd/POOLNAME/IMAGENAME` 指向真实设备。
- `rbdmap unmap-all`(文档在 Description 中提到)会卸载并解映射**当前所有已映射**的 RBD 镜像,无论是否在配置文件中列出。
> 引自:[rbdmap](https://docs.ceph.com/en/tentacle/man/8/rbdmap/)
---
### 5.6 `rbd-replay`
**用途**:重放 RBD 工作负载的工具。
**语法(synopsis,保留原文格式)**:
```text
rbd-replay [ options ] replay_file
```
#### 常用选项表
| 选项 | 参数 | 默认值 | 说明 |
|---|---|---|---|
| `-c ceph.conf`, `--conf ceph.conf` | 文件路径 | `/etc/ceph/ceph.conf` | 使用指定配置文件确定 monitor 地址 |
| `-p pool`, `--pool pool` | 池名 | **`rbd`** | 操作的池 |
| `--latency-multiplier` | 倍数 | **1** | 请求间隔延迟的倍率 |
| `--read-only` | — | 无 | 只重放**非破坏性**请求 |
| `--map-image rule` | `image1@snap1=image2@snap2` 形式的规则 | 无 | 把 trace 中的镜像名映射到重放集群中的镜像名(可把 image1 的 snap1 映射到 image2 的 snap2) |
| `--dump-perf-counters` | — | 无 | **实验性**:在镜像关闭前把性能计数器输出到 stdout;多个镜像关闭或同一镜像多次开关会输出多次;计数器的含义可能随版本变化 |
#### 典型示例
```bash
# 尽可能快地重放(间隔归零)
rbd-replay --latency-multiplier=0 workload1
# 把 prod_image 换成 test_image 来重放
rbd-replay --map-image=prod_image=test_image workload1
# 只重放非破坏性请求,指定池
rbd-replay -p mypool --read-only workload1
# 导出性能计数器(实验性)
rbd-replay --dump-perf-counters workload1
```
#### 注意事项 / 常见坑
- `--dump-perf-counters` 标记为 **Experimental**,计数器含义可能随版本变化。
- 重放前通常要先用 `rbd-replay-prep` 处理原始 trace。
> 引自:[rbd-replay](https://docs.ceph.com/en/tentacle/man/8/rbd-replay/)
---
### 5.7 `rbd-replay-prep`
**用途**:把原始 RBD trace 处理成可供 `rbd-replay` 重放的格式。
**语法(synopsis,保留原文格式)**:
```text
rbd-replay-prep [ --window seconds ] [ --anonymize ] trace_dir replay_file
```
#### 常用选项表
| 选项 | 参数 | 默认值 | 说明 |
|---|---|---|---|
| `--window seconds` | 秒 | 无 | 相隔超过 seconds 秒的请求被视为相互独立 |
| `--anonymize` | — | 无 | 对镜像名与快照名做匿名化 |
| `--verbose` | — | 无 | 把所有处理过的事件打印到控制台 |
#### 典型示例
```bash
# 准备 workload1-trace 用于重放
rbd-replay-prep workload1-trace/ust/uid/1000/64-bit workload1
# 匿名化 + 详细输出
rbd-replay-prep --anonymize --verbose --window 5 workload1-trace/ust/uid/1000/64-bit workload1
```
#### 注意事项 / 常见坑
- 无。文档未列出其他限制。
> 引自:[rbd-replay-prep](https://docs.ceph.com/en/tentacle/man/8/rbd-replay-prep/)
---
### 5.8 `rbd-replay-many`
**用途**:在**多个客户端**上重放同一个 RBD 工作负载的工具;所有客户端使用相同负载,但各自针对**不同的镜像**重放(符合 librbd 的典型用法:每个原始客户端是一个有自己镜像的 VM)。
**语法(synopsis,保留原文格式)**:
```text
rbd-replay-many [ options ] --original-image name host1 [ host2 [ ... ] ] -- rbd_replay_args
```
#### 常用选项表
| 选项 | 参数 | 默认值 | 说明 |
|---|---|---|---|
| `--original-image name` | 镜像名(可含 snap) | 无(**必需**) | 原始被 trace 的镜像名与 snap,用于正确做名字映射 |
| `--image-prefix prefix` | 前缀 | 原始镜像名 | 重放目标镜像名的前缀;`--image-prefix=foo` 会让客户端分别重放到 `foo-0`、`foo-1` 等 |
| `--exec program` | 路径 | 无 | `rbd-replay` 可执行文件的路径 |
| `--delay seconds` | 秒 | **0** | 启动每个客户端之间的间隔 |
#### 典型示例
```bash
# 在两台主机上重放
rbd-replay-many host-0 host-1 --original-image=image -- -c ceph.conf replay.bin
# 上面这行实际会执行:
# ssh host-0 'rbd-replay' --map-image 'image=image-0' -c ceph.conf replay.bin
# ssh host-1 'rbd-replay' --map-image 'image=image-1' -c ceph.conf replay.bin
# 指定镜像前缀、错开启动
rbd-replay-many --image-prefix=vmimg --delay 5 host-0 host-1 host-2 \
--original-image=image -- -c ceph.conf replay.bin
```
#### 注意事项 / 常见坑
- **配置文件与重放文件不会自动复制到客户端**,需自行分发。
- **重放用的镜像必须已经存在**,该工具不会创建。
> 引自:[rbd-replay-many](https://docs.ceph.com/en/tentacle/man/8/rbd-replay-many/)
---
### 5.9 `rbdnamer`
**用途**:udev 辅助工具——针对给定的 RBD 设备,把 pool、namespace、image 与 snapshot 名字打到 stdout,供 `udev` 设备管理器创建 RBD 设备符号链接使用(相应 udev 规则由 `50-rbd.rules` 提供)。
**语法(synopsis,保留原文格式)**:
```text
ceph-rbdnamer num
```
> 💡 补充:源文件名是 `ceph-rbdnamer.rst`,但文档标题与程序名均为 **rbdnamer**(`.. program:: ceph-rbdnamer` 的声明与正文一致指向该 udev helper;实际安装的二进制名在不同发行版/版本上可能带或不带 `ceph-` 前缀,文档未明确)。
#### 常用选项表
| 选项 | 参数 | 默认值 | 说明 |
|---|---|---|---|
| (无) | `num`(RBD 设备号) | — | 文档未列出任何命令行选项;只接受设备编号参数 |
#### 典型示例
```bash
# udev 内部调用(示例)
ceph-rbdnamer 0
# udev 规则文件
cat /usr/lib/udev/rules.d/50-rbd.rules
```
#### 注意事项 / 常见坑
- 这是给 udev 调用的辅助程序,**通常不由人手直接执行**。
- 它输出 pool/namespace/image/snapshot 名,用于生成 `/dev/rbd/<pool>/<image>` 之类的友好符号链接(参见 `rbdmap` 章节)。
> 引自:[rbdnamer](https://docs.ceph.com/en/tentacle/man/8/rbdnamer/)
---
## 六、CephFS
### 6.1 `ceph-fuse`
**用途**:Ceph 分布式文件系统的 FUSE(用户态文件系统)客户端,把 `-m` 指定或 `ceph.conf` 描述的 Ceph 文件系统挂载到指定挂载点。
**语法(synopsis,保留原文格式)**:
```text
ceph-fuse [-n client.username] [ -m monaddr:port ] mountpoint [ fuse options ]
```
#### 常用选项表
| 选项 | 参数 | 默认值 | 说明 |
|---|---|---|---|
| `-o opt,[opt...]` | 逗号分隔挂载选项串 | 无 | 挂载选项 |
| `-c ceph.conf`, `--conf=ceph.conf` | 文件路径 | `/etc/ceph/ceph.conf` | 使用指定配置文件确定 monitor 地址 |
| `-m monaddress[:port]` | 地址 | 无 | 直连指定 monitor |
| `-n client.{cephx-username}` | 完整用户名 | 无 | 指定挂载用 secret key 所属的 CephX 用户 |
| `--id <client-id>` | id | 无 | 同上,但只给 ID 部分(如 `--id 0` → `client.0`) |
| `-k <path-to-keyring>` | 文件路径 | 标准位置 | keyring 不在标准位置时指定路径 |
| `--client_mountpoint` / `-r root_directory` | 目录 | 无 | 把 root_directory 作为挂载根,而非整个 Ceph 树 |
| `-f` | — | 无 | 前台运行,不 daemonize,不生成 pid 文件 |
| `-d` | — | 无 | 前台运行,日志全输出到 stderr 并启用 FUSE 调试(等价 `-o debug`) |
| `-s` | — | 无 | 禁用多线程操作 |
| `--client_fs` | FS 名 | 集群上的默认 CephFS | 指定要挂载的 Ceph FS 名 |
> 任何 `ceph-fuse` 不认识的选项都会被转交给 libfuse。
#### 典型示例
```bash
# 挂载默认文件系统
ceph-fuse /mnt/mycephfs
# 指定 monitor 与用户
ceph-fuse -m 192.168.0.1:6789 /mnt/mycephfs
ceph-fuse -n client.foo /mnt/mycephfs
ceph-fuse --id 0 /mnt/mycephfs
# 指定文件系统与子目录作为根
ceph-fuse --client_fs myfs2 -r /some/dir /mnt/mycephfs
# 使用非标准位置的 keyring
ceph-fuse -k /etc/ceph/client.foo.keyring --id foo /mnt/mycephfs
# 前台 + 调试
ceph-fuse -d /mnt/mycephfs
# 卸载
fusermount -u /mnt/mycephfs
# 或向 ceph-fuse 进程发 SIGINT
```
#### 注意事项 / 常见坑
- 卸载用 `fusermount -u mountpoint`,或向进程发 `SIGINT`。
- 不指定 `--client_fs` 时挂载集群上的**默认** CephFS。
> 引自:[ceph-fuse](https://docs.ceph.com/en/tentacle/man/8/ceph-fuse/)
---
### 6.2 `mount.ceph`
**用途**:在 Linux 主机上挂载 Ceph 文件系统的挂载助手——负责把 monitor 主机名解析为 IP、从磁盘读取认证密钥;真正的工作由 Linux 内核客户端完成。
**语法(synopsis,保留原文格式)**:
```text
mount.ceph name@fsid.fs_name=/[subdir] dir [-o options ]
```
#### 基本选项表
| 选项 | 参数 | 默认值 | 说明 |
|---|---|---|---|
| `conf` | 文件路径 | ceph.conf 的标准搜索路径 | 指定 ceph.conf 路径,用于初始化 Ceph 上下文以自动发现 monitor 地址与认证 secret |
| `mount_timeout` | int(秒) | **60** | 挂载超时 |
| `ms_mode=<legacy\|crc\|secure\|prefer-crc\|prefer-secure>` | 模式 | 无 | 客户端传输连接模式:`legacy`=messenger v1;`crc`=v2 不加密;`secure`=v2 加密;`prefer-crc`=crc 被拒则同意 secure;`prefer-secure`=secure 被拒则同意 crc |
| `mon_addr` | ip_address[:port],多个用 `/` 分隔 | 端口默认 **6789** | monitor 地址;只需一个可用即可挂载(客户端会从任一响应者学到全部 monitor),但建议多写几个 |
| `fsid` | 集群 FSID | 无 | 可用 `ceph fsid` 查到 |
| `secret` | secret key | 无 | CephX secret。**不安全**(会暴露在命令行/历史里),请改用 `secretfile` |
| `secretfile` | 文件路径 | 无 | 含 secret key 的文件路径(推荐) |
| `recover_session=<no\|clean>` | `no` / `clean` | **`no`** | 客户端被 blocklist 后的自动重连模式。`no`=永不尝试重连,被 blocklist 的客户端操作会失败;`clean`=自动重连,重连时丢弃脏数据/元数据、失效 page cache 与可写文件句柄,重连后文件锁变为 stale(inode 上有 stale 锁时禁止读写,直到应用释放) |
| `fs=<fs-name>` | FS 名 | 无 | 使用**旧语法**时指定要挂载的非默认文件系统 |
| `mds_namespace=<fs-name>` | FS 名 | 无 | `fs=` 的同义词(**已废弃**) |
#### 高级选项表
| 选项 | 参数 | 默认值 | 说明 |
|---|---|---|---|
| `cap_release_safety` | int | calculated | — |
| `caps_wanted_delay_max` | int(cap 释放延迟) | **60** | — |
| `caps_wanted_delay_min` | int(cap 释放延迟) | **5** | — |
| `dirstat` / `nodirstat` | — | **`off`** | 启用/禁用用 `cat dirname` 查看目录统计(统计是惰性更新的,变更后可能有一段时间是旧的) |
| `ip` | IP | 无 | my ip |
| `noasyncreaddir` | — | 无 | 不使用 dcache readdir |
| `nocrc` | — | 无 | 写时不做数据 crc |
| `noshare` | — | 无 | 创建新的客户端实例,而不是共享挂载同一集群的既有实例 |
| `osdkeepalive` | int | **5** | — |
| `osd_idle_ttl` | int(秒) | **60** | — |
| `rasize` | int(字节) | **8388608**(8192*1024) | 最大 readahead |
| `rbytes` / `norbytes` | — | **`off`** | 报告/不报告目录内容的递归大小作为 st_size |
| `readdir_max_bytes` | int | **524288**(512*1024) | — |
| `readdir_max_entries` | int | **1024** | — |
| `rsize` | int(字节) | **16777216**(16M) | 最大读大小 |
| `snapdirname` | string | **`.snap`** | 隐藏 snapdir 的名字 |
| `write_congestion_kb` | int(KB) | 由可用内存推算 | 最大在途 writeback |
| `wsize` | int(字节) | **16777216**(16M) | 最大写大小(writeback 取 wsize 与 stripe unit 的较小者) |
| `wsync` / `nowsync` | — | 自内核 5.16 起默认 `nowsync` | `wsync`=所有命名空间操作同步执行(等 MDS 回复才完成);`nowsync`=允许异步(有足够 capability 时可在 MDS 回复前完成) |
| `crush_location=x` | `key:value` 对,`\|` 分隔 | 无(自 5.8) | 客户端在 CRUSH 层级中的位置,如 `crush_location=rack:myrack\|datacenter:mydc\|region:myregion`;支持"多路径" |
| `read_from_replica=<no\|balance\|localize>` | 模式 | **`no`**(自 5.8) | `no`=禁用副本读,总是选 primary;`balance`=从 PG acting set 随机挑 OSD;`localize`=挑最"本地"的 OSD(按 `crush_location` 计算,最低层级 bucket 类型匹配者胜) |
#### 典型示例
```bash
# 挂载整个文件系统(推荐通过 mount(8) 调用,FSID 由 helper 从 ceph.conf 补全)
mount -t ceph fs_user@.mycephfs2=/ /mnt/mycephfs
# 只挂载命名空间的一部分
mount.ceph fs_user@.mycephfs2=/some/directory/in/cephfs /mnt/mycephfs
# 指定 monitor(可带端口)
mount.ceph fs_user@.mycephfs2=/ /mnt/mycephfs -o mon_addr=192.168.0.1
mount.ceph fs_user@.mycephfs2=/ /mnt/mycephfs -o mon_addr=192.168.0.1:7000
# 多个 monitor 用 / 分隔
mount.ceph fs_user@.mycephfs2=/ /mnt/mycephfs -o mon_addr=192.168.0.1/192.168.0.2/192.168.0.3
# 传 secret(不推荐,会留在 shell 历史里)
mount.ceph fs_user@.mycephfs2=/ /mnt/mycephfs -o secret=AQATSKdNGBnwLhAAnNDKnH65FmVKpXZJVasUeQ==
# 推荐:用 secretfile
mount.ceph fs_user@.mycephfs2=/ /mnt/mycephfs -o secretfile=/etc/ceph/fs_username.secret
# 集群未启用认证时省略凭据相关选项
mount.ceph fs_user@.mycephfs2=/ /mnt/mycephfs
# 旧语法
mount -t ceph 192.168.0.1:/ /mnt/mycephfs
# 带 FSID 的完整形式
mount.ceph name@07fe3187-00d9-42a3-814b-72a4d5e7d5be.fs_name=/ /mnt/mycephfs -o mon_addr=1.2.3.4
# 副本读优化 + 客户端位置声明
mount.ceph fs_user@.mycephfs2=/ /mnt/mycephfs \
-o mon_addr=192.168.0.1,crush_location=rack:myrack|datacenter:mydc,read_from_replica=localize
```
#### 注意事项 / 常见坑
- **设备串里的点 `.` 不能省**:推荐写法 `mount -t ceph name@.fs_name=/ /mnt/...`,FSID 会被 mount helper 从 ceph 配置文件补齐。
- 挂载助手约定:**前两个参数固定是 device 与 mountpoint**,选项必须放在这两个固定参数**之后**。
- 未指定 `mon_addr` 时,`mount.ceph` 会尝试用本地配置文件和/或 DNS SRV 记录确定 monitor 地址;未指定 `secret`/`secretfile` 且集群启用了 CephX 时,会派生子进程用标准 Ceph 库例程查找 keyring 并取出 secret(同时也会补 monitor 地址与 FSID)。
- `secret` 会暴露在命令行,**不安全**,请始终用 `secretfile`。
- `mds_namespace=` 是 `fs=` 的同义词,**已废弃**。
- **特性可用性与内核版本相关**:`recover_session=` 在 v5.4 进入主线内核;`wsync`/`nowsync` 在 v5.7;`crush_location`、`read_from_replica`、`rasize` 等自 5.8 起。
- `read_from_replica=balance|localize` 只对 **Octopus 之后**(执行过 `ceph osd require-osd-release octopus`)通用场景安全,否则仅限只读负载(如快照)。
- `recover_session=clean` 重连后文件锁变 stale,inode 上有 stale 锁时禁止读写,直到应用释放。
> 引自:[mount.ceph](https://docs.ceph.com/en/tentacle/man/8/mount.ceph/)
---
### 6.3 `mount.fuse.ceph`
**用途**:从 `/etc/fstab` 挂载 `ceph-fuse` 的辅助程序。
**语法(synopsis,保留原文格式)**:
```text
mount.fuse.ceph [-h] [-o OPTIONS [OPTIONS ...]]
device [device ...]
mountpoint [mount point ...]
```
#### 常用选项表
| 选项 | 参数 | 默认值 | 说明 |
|---|---|---|---|
| `-h` | — | 无 | 帮助 |
| `-o OPTIONS` | 选项串 | 无 | 挂载选项 |
| `ceph.id=<username>` | 用户名 | 无 | 指定 ceph-fuse 认证所用的用户 |
| `ceph.name=client.admin` | 完整实体名 | 无 | 指定 ceph-fuse 以 `client.admin` 认证 |
| `ceph.conf=/etc/ceph/foo.conf` | 文件路径 | 无 | 通过 ceph-fuse 命令行设置 conf 选项 |
> **规则**:ceph-fuse 的选项必须写在 `OPTIONS` 列且以 `ceph.` 开头;带该前缀的会传给 ceph-fuse,其余的被 ceph-fuse 忽略。任何合法的 ceph-fuse 选项都可以这样传。
#### 典型示例
```bash
# /etc/fstab 写法(新格式)
cat >> /etc/fstab <<'EOF'
# DEVICE PATH TYPE OPTIONS
none /mnt/ceph fuse.ceph ceph.id=admin,_netdev,defaults 0 0
none /mnt/ceph fuse.ceph ceph.name=client.admin,_netdev,defaults 0 0
none /mnt/ceph fuse.ceph ceph.id=myuser,ceph.conf=/etc/ceph/foo.conf,_netdev,defaults 0 0
EOF
# 旧格式也仍然支持
cat >> /etc/fstab <<'EOF'
# DEVICE PATH TYPE OPTIONS
id=admin /mnt/ceph fuse.ceph defaults 0 0
id=myuser,conf=/etc/ceph/foo.conf /mnt/ceph fuse.ceph defaults 0 0
EOF
# 使 fstab 生效
mount /mnt/ceph
```
#### 注意事项 / 常见坑
- 挂载类型列要写 `fuse.ceph`。
- 旧格式(device 列写 `id=admin`、`id=myuser,conf=...`)**仍然支持**。
- 建议同时加 `_netdev`(示例中给出),避免网络未就绪时挂载。
> 引自:[mount.fuse.ceph](https://docs.ceph.com/en/tentacle/man/8/mount.fuse.ceph/)
---
### 6.4 `cephfs-shell`
**用途**:提供类 shell 命令直接与 Ceph 文件系统交互的工具,支持交互式与非交互式两种模式。
**语法(synopsis,保留原文格式)**:
```text
cephfs-shell [options] [command]
cephfs-shell [options] -- [command, command,...]
```
#### 常用选项表
| 选项 | 参数 | 默认值 | 说明 |
|---|---|---|---|
| `-b`, `--batch FILE` | 文件路径 | 无 | 批处理文件路径 |
| `-c`, `--config FILE` | 文件路径 | 见"配置文件"段 | `cephfs-shell.conf` 的路径 |
| `-f`, `--fs FS` | FS 名 | 无 | 要挂载的文件系统名 |
| `-t`, `--test FILE` | 文件路径 | 无 | 用于测试的记录(transcript)文件路径 |
> **运行前提**:需要**最新版 cmd2 模块**。若 Ceph 是源码安装,请在 build 目录执行;也可用 virtualenv:
> ```bash
> [build]$ python3 -m venv venv && source venv/bin/activate && pip3 install cmd2 colorama
> [build]$ source vstart_environment.sh && source venv/bin/activate && python3 ../src/tools/cephfs/shell/cephfs-shell
> ```
#### 交互式命令全表
| 命令 | 语法 | 说明 |
|---|---|---|
| `mkdir` | `mkdir [-option] <directory>...` | 创建目录。`-m MODE` 设置访问模式;`-p, --parent` 必要时创建父目录且目录已存在时不报错 |
| `put` | `put [options] <source_path> <target_path>` | 本地 → CephFS 复制文件/目录。`source_path` 为 `.` 复制本地工作目录下所有文件/目录,`-` 从 stdin 读;`target_path` 为 `.` 表示复制到远程工作目录。`-f, --force` 覆盖已存在的目标 |
| `get` | `get [options] <source_path> <target_path>` | CephFS → 本地复制。`target_path` 为 `-` 输出到 stdout。`-f, --force` 覆盖 |
| `ls` | `ls [option] [directory]...` | 列出目录内容。默认当前工作目录。`-l, --long` 长格式(显示权限);`-r, --reverse` 反向排序;`-H` 人类可读;`-a, -all` 忽略以 `.` 开头的条目;`-S` 按文件大小排序 |
| `cat` | `cat <file>....` | 拼接文件并输出到标准输出 |
| `ln` | `ln [options] <target> [link_name]` | 创建硬链接或符号链接。`-s, --symbolic` 符号链接;`-v, --verbose` 打印每个链接文件名;`-f, --force` 强制创建 |
| `cd` | `cd [directory]` | 切换当前工作目录;不指定目录则切到根目录;`.` 移到父目录 |
| `cwd` | `cwd` | 显示当前工作目录 |
| `chmod` | `chmod <mode> <file/directory>` | 修改权限 |
| `mv` | `mv <source_path> <destination_path>` | 移动文件/目录 |
| `rmdir` | `rmdir <directory_name>.....` | 删除目录 |
| `rm` | `rm <file_name/pattern>...` | 删除文件 |
| `write` | `write <file_name>` → 输入数据 → `Ctrl+D` 结束 | 创建并写入文件 |
| `quit` / `Ctrl + D` | — | 关闭 shell |
| `lls` | `lls <path>.....` | 列出**本地**指定目录内容(不指定则为本地当前目录) |
| `lcd` | `lcd <path>` | 切换到本地目录 |
| `lpwd` | `lpwd` | 打印本地当前目录的绝对路径 |
| `umask` | `umask [mode]` | 设置/获取文件模式创建掩码 |
| `alias` | `alias [name] \| [<name> <value>]` | 定义或显示别名;value 可含空格且无需引号 |
| `unalias` | `unalias [-a] name [name ...]` | 取消别名;`-a` 移除所有别名定义 |
| `shortcuts` | `shortcuts` | 列出可用的快捷方式(别名) |
| `history` | `history [-h] [-r \| -e \| -s \| -o FILE \| -t TRANSCRIPT] [arg]` | 查看/运行/编辑/保存历史命令。`-r` 运行选中项;`-e` 编辑后运行;`-s` 脚本格式(无分隔行);`-o FILE` 输出到脚本文件;`-t TRANSCRIPT` 输出命令与结果到记录文件 |
| `run_pyscript` | `run_pyscript <script_path> [script_arguments]` | 在控制台内运行 Python 脚本;脚本内可用 `cmd("your command")` 执行控制台命令,但**不能嵌套运行 `py`/`pyscript`**;含空格的路径/参数必须加引号。cmd2 ≤ 0.9.13 时该命令名为 `pyscript` |
| `py` | `py <command>` / `py` | 执行一条 Python 命令 / 进入交互式 Python 模式 |
| `set` | `set [-h] [-a] [-l] [settable [settable ...]]` | 设置或显示可设置参数;不带参数列出全部可设置参数及值。`-a` 同时显示只读设置;`-l` 描述参数作用 |
| `edit` | `edit [file_path]` | 在文本编辑器中编辑文件 |
| `run_script` | `run_script <file_path>` | 运行脚本文件中的命令(ASCII 或 UTF-8,命令以换行分隔)。cmd2 ≤ 0.9.13 时名为 `load` |
| `shell` | `shell <command> [arguments]` | 像在操作系统提示符下一样执行命令 |
| `locate` | `locate [options] <name>` | 在文件系统中查找。`-c` 统计找到的数量;`-i` 忽略大小写 |
| `stat` | `stat [-h] <file_name> [file_name ...]` | 显示文件状态;`-h` 显示帮助 |
| `snap` | `snap {create\|delete} <snap_name> <dir_name>` | 在 dir_name 下创建/删除名为 snap_name 的快照 |
| `setxattr` | `setxattr [-h] <path> <name> <value>` | 设置扩展属性;`-h, --help` 显示帮助 |
| `getxattr` | `getxattr [-h] <path> <name>` | 获取扩展属性值 |
| `listxattr` | `listxattr [-h] <path>` | 列出与路径关联的扩展属性名 |
| `df` | `df [-h] [file [file ...]]` | 显示可用磁盘空间 |
| `du` | `du [-h] [-r] [paths [paths ...]]` | 显示目录磁盘占用;`-r` 递归显示所有目录 |
| `quota` | `quota [-h] [--max_bytes [MAX_BYTES]] [--max_files [MAX_FILES]] {get,set} path` | 目录配额管理;`--max_bytes` 该目录下数据累计最大大小;`--max_files` 该目录树下的文件总数上限 |
> **本地文件系统交互**:在命令前加 `!`(感叹号)即可让该命令作用于**本地文件系统**。
> ```
> CephFS:~/>>> !ls # 列出本地文件系统目录内容
> CephFS:~/>>> ls # 列出 CephFS 目录内容
> ```
#### 配置文件
默认查找顺序:① 环境变量 `CEPHFS_SHELL_CONF` 指定的路径;② 用户家目录下 `~/.cephfs-shell.conf`。
目前 `cephfs-shell` 的选项**全部继承自依赖 `cmd2`**,因此会随系统安装的 cmd2 版本而不同(详见 cmd2 文档)。示例:
```ini
[cephfs-shell]
prompt = CephFS:~/>>>
continuation_prompt = >
quiet = False
timing = False
colors = True
debug = False
abbrev = False
autorun_on_edit = False
echo = False
editor = vim
feedback_to_output = False
locals_in_py = True
```
#### 退出码
| 错误类型 | 退出码 |
|---|---|
| Miscellaneous | 1 |
| Keyboard Interrupt | 2 |
| Operation not permitted | 3 |
| Permission denied | 4 |
| No such file or directory | 5 |
| I/O error | 6 |
| No space left on device | 7 |
| File exists | 8 |
| No data available | 9 |
| Invalid argument | 10 |
| Operation not supported on transport endpoint | 11 |
| Range error | 12 |
| Operation would block | 13 |
| Directory not empty | 14 |
| Not a directory | 15 |
| Disk quota exceeded | 16 |
| Broken pipe | 17 |
| Cannot send after transport endpoint shutdown | 18 |
| Connection aborted | 19 |
| Connection refused | 20 |
| Connection reset | 21 |
| Interrupted function call | 22 |
#### 典型示例
```bash
# 交互模式
cephfs-shell
cephfs-shell -c ~/.cephfs-shell.conf
cephfs-shell -f myfs2
# 非交互:单条命令
cephfs-shell -- ls
cephfs-shell -- "ls /; df -h"
# 批处理 / 测试记录
cephfs-shell -b /tmp/batch.txt
cephfs-shell -t /tmp/transcript.txt
```
交互式会话片段:
```text
CephFS:~/>>> ls -l
CephFS:~/>>> mkdir -p /data/backup
CephFS:~/>>> put ./localfile.txt /data/backup/
CephFS:~/>>> get /data/backup/localfile.txt /tmp/
CephFS:~/>>> quota set --max_bytes 10737418240 --max_files 10000 /data
CephFS:~/>>> quota get /data
CephFS:~/>>> snap create snap1 /data
CephFS:~/>>> du -r /data
CephFS:~/>>> !ls # 作用于本地文件系统
CephFS:~/>>> quit
```
#### 注意事项 / 常见坑
- **交互式模式**下:命令执行完打印提示符并无限等待;会话结束时以**最后一条命令的返回值**退出。**非交互式模式**下:执行完命令立即以该命令的返回值退出。
- 需要最新版 `cmd2`;源码安装请在 build 目录运行,或用 virtualenv 装 `cmd2` + `colorama`。
- 命令名前加 `!` 表示作用于**本地**文件系统,容易与 CephFS 操作混淆,删除/覆盖类操作要特别小心。
- `run_pyscript` 内**不能嵌套** `py`/`pyscript`;cmd2 ≤ 0.9.13 时命令名为 `pyscript`、`load`。
- 配置项全部继承自 cmd2,不同版本间可能不同。
> 引自:[cephfs-shell](https://docs.ceph.com/en/tentacle/man/8/cephfs-shell/)
---
## 七、RGW(对象网关)
### 7.1 `radosgw`
**用途**:RADOS 对象存储的 HTTP REST 网关,以 libfcgi 实现为 FastCGI 模块,可与任何支持 FastCGI 的 Web 服务器配合使用。
**语法(synopsis,保留原文格式)**:
```text
radosgw
```
#### 常用选项表
| 选项 | 参数 | 默认值 | 说明 |
|---|---|---|---|
| `-c ceph.conf`, `--conf=ceph.conf` | 文件路径 | `/etc/ceph/ceph.conf` | 使用指定配置文件确定 monitor 地址 |
| `-m monaddress[:port]` | 地址 | 无 | 直连指定 monitor |
| `-i ID`, `--id ID` | ID | 无 | 设置 radosgw 名字中的 ID 部分 |
| `-n TYPE.ID`, `--name TYPE.ID` | TYPE.ID | 无 | 设置网关的 rados 用户名(如 `client.radosgw.gateway`) |
| `--cluster NAME` | 集群名 | **ceph** | 设置集群名 |
| `-d` | — | 无 | 前台运行,日志输出到 stderr |
| `-f` | — | 无 | 前台运行,日志输出到通常位置 |
| `--rgw-region=region` | region | 无 | radosgw 运行的 region |
| `--rgw-zone=zone` | zone | 无 | radosgw 运行的 zone |
#### 配置要点(Apache + mod_proxy_fcgi)
早期 RGW 用 `Apache` + `mod_fastcgi` 配置,现在改用 **`mod_proxy_fcgi`**。它与传统 FastCGI 模块工作方式不同:需要 `mod_proxy` 提供 FastCGI 协议支持,**两者都必须存在**;且 `mod_proxy_fcgi` **不能启动应用进程**(某些平台用 `fcgistarter`)。Apache 必须配置成让 `mod_proxy_fcgi` 走 localhost tcp。
`ceph.conf` 片段:
```ini
[client.radosgw.gateway]
host = {hostname}
keyring = /etc/ceph/ceph.client.radosgw.keyring
log_file = /var/log/ceph/client.radosgw.gateway.log
rgw_frontends = fastcgi socket_port=9000 socket_host=0.0.0.0
rgw_print_continue = false
```
网关配置文件(Debian/Ubuntu:`/etc/apache2/conf-available/rgw.conf`;CentOS/RHEL:`/etc/httpd/conf.d/rgw.conf`):
```apache
<VirtualHost *:80>
ServerName localhost
DocumentRoot /var/www/html
ErrorLog /var/log/apache2/rgw_error.log
CustomLog /var/log/apache2/rgw_access.log combined
# LogLevel debug
RewriteEngine On
RewriteRule .* - [E=HTTP_AUTHORIZATION:%{HTTP:Authorization},L]
SetEnv proxy-nokeepalive 1
ProxyPass / fcgi://localhost:9000/
</VirtualHost>
```
> 文档另给出一种走 unix socket 的 `ProxyPass` 写法(CentOS/RHEL):
> `ProxyPass / unix:///var/run/ceph/ceph.radosgw.gateway.fastcgi.sock|fcgi://localhost:9000/`
#### 典型示例
```bash
# 生成网关认证 key 并加入 auth 条目
ceph-authtool -C -n client.radosgw.gateway --gen-key /etc/ceph/keyring.radosgw.gateway
ceph-authtool -n client.radosgw.gateway --cap mon 'allow rw' --cap osd 'allow rwx' /etc/ceph/keyring.radosgw.gateway
ceph auth add client.radosgw.gateway --in-file=keyring.radosgw.gateway
# 启动(Debian/Ubuntu)
sudo /etc/init.d/apache2 start
sudo /etc/init.d/radosgw start
# 启动(CentOS/RHEL)
sudo apachectl start
sudo /etc/init.d/ceph-radosgw start
# 前台调试
radosgw -d -n client.radosgw.gateway
radosgw -f --rgw-zone=zone1
```
#### Usage Logging(用量日志)
`radosgw` 维护一份异步用量日志:累计用户操作统计并周期性刷出,可通过 `radosgw-admin` 访问与管理。记录内容包括总数据传输量、总操作数、总成功操作数;数据按**小时粒度**记在 bucket owner 名下,除非操作发生在 service 上(例如列举 bucket),此时记在操作用户名下。
示例配置:
```ini
[client.radosgw.gateway]
rgw_enable_usage_log = true
rgw_usage_log_tick_interval = 30
rgw_usage_log_flush_threshold = 1024
rgw_usage_max_shards = 32
rgw_usage_max_user_shards = 1
```
- `rgw_usage_max_shards`:保存用量日志信息的**对象总数**。
- `rgw_usage_max_user_shards`:单个用户的用量信息占用的对象数。
- `rgw_usage_log_tick_interval`:两次日志刷出之间的秒数。
- `rgw_usage_log_flush_threshold`:在退化为同步刷出前可缓存的条目数。
#### 注意事项 / 常见坑
- `mod_proxy_fcgi` **不能启动应用进程**,需要外部启动/进程管理(或用 `fcgistarter`)。
- 必须同时加载 `mod_proxy` 与 `mod_proxy_fcgi`。
- 本 man 页主要是 Apache+FastCGI 部署路径;现代部署(如 cephadm 的 beast 前端)不在本文档范围内。
> 引自:[radosgw](https://docs.ceph.com/en/tentacle/man/8/radosgw/)
---
### 7.2 `radosgw-admin`
**用途**:Ceph 对象网关的用户管理工具,用于创建和修改用户,并覆盖 bucket、配额、多站点(realm/zonegroup/zone/period)、同步、角色、通知等全部管理面操作。
**语法(synopsis,保留原文格式)**:
```text
radosgw-admin command [ options ... ]
```
#### 子命令总表(按主题分组)
**① user / subuser / caps / key**
| 命令 | 说明 |
|---|---|
| `user create` | 创建新用户 |
| `user modify` | 修改用户 |
| `user info` | 显示用户信息(含 subuser 与 keys) |
| `user rename` | 重命名用户 |
| `user rm` | 删除用户 |
| `user suspend` | 暂停用户 |
| `user enable` | 暂停后重新启用 |
| `user check` | 检查用户信息 |
| `user stats` | 显示配额子系统统计的用户用量 |
| `user list` | 列出所有用户 |
| `caps add` / `caps rm` | 添加 / 移除用户 capabilities |
| `subuser create` | 创建 subuser(主要用于 Swift API 客户端) |
| `subuser modify` | 修改 subuser |
| `subuser rm` | 删除 subuser |
| `key create` | 创建 access key |
| `key rm` | 删除 access key |
**② bucket / bi / object**
| 命令 | 说明 |
|---|---|
| `bucket list` | 列出 bucket;用 `--bucket=<bucket>` 指定时列出其对象。`--allow-unordered` 去掉排序要求,对对象很多的 bucket 可能更快 |
| `bucket limit check` | 显示 bucket 分片统计 |
| `bucket link` | 把 bucket 关联到指定用户 |
| `bucket unlink` | 取消关联 |
| `bucket chown` | 把 bucket 所有权改为指定用户并更新对象 ACL;中断后用 `--marker` 续跑 |
| `bucket stats` | 列出 bucket 统计及其他内部信息 |
| `bucket rm` | 删除 bucket |
| `bucket check` | 检查 bucket index |
| `bucket rewrite` | 重写指定 bucket 中的所有对象 |
| `bucket radoslist` | 列出包含该 bucket 数据的 RADOS 对象;不指定 `--bucket` 则列出所有 bucket 的 |
| `bucket reshard` | 对 bucket 的 index 做 reshard |
| `bucket sync disable` / `enable` | 禁用 / 启用 bucket 同步 |
| `bi get` / `bi put` / `bi list` / `bi purge` | 获取 / 存储 / 列出原始 bucket index 条目 / 清除条目 |
| `object rm` | 删除 S3/Swift 对象;加 `--yes-i-really-mean-it` 才会把对象条目从 bucket index 移除(例如条目已损坏时) |
| `object stat` | 查看对象元数据 |
| `object manifest` | 显示对象 manifest,产出包含其数据的 RADOS 对象列表 |
| `object unlink` | 把对象从 bucket index 中摘除 |
| `object rewrite` | 重写指定对象 |
| `object reindex` | 把对象加回其 bucket 的 index(**很少用,仅用于紧急修复**) |
| `objects expire` | 执行过期对象清理 |
**③ quota / global quota**
| 命令 | 说明 |
|---|---|
| `quota set` | 设置配额参数 |
| `quota enable` / `quota disable` | 启用 / 停用配额 |
| `global quota get` / `set` | 查看 / 设置全局配额参数 |
| `global quota enable` / `disable` | 启用 / 停用全局配额 |
**④ realm / zonegroup / zone / period(多站点)**
| 命令 | 说明 |
|---|---|
| `realm create` / `rm` / `get` / `list` / `rename` / `set` | 创建 / 删除 / 显示 / 列出 / 重命名 / 设置 realm(`set` 需要 infile) |
| `realm get-default` / `default` | 获取默认 realm 名 / 设为默认 |
| `realm list-periods` | 列出 realm 的所有 period |
| `realm pull` | 拉取 realm 及其当前 period |
| `zonegroup create` / `rm` / `get` / `modify` / `set` / `rename` / `list` | 创建 / 删除 / 显示 / 修改 / 设置(需 infile)/ 重命名 / 列出 zonegroup |
| `zonegroup default` | 设置默认 zonegroup |
| `zonegroup add` / `remove` | 向 zonegroup 添加 / 移除 zone |
| `zonegroup placement list` / `add` / `modify` / `rm` / `default` | 列出 / 添加 / 修改 / 删除 / 设置默认 placement target |
| `zone create` / `rm` / `get` / `set` / `modify` / `list` / `rename` | 创建 / 删除 / 显示 / 设置(需 infile)/ 修改 / 列出 / 重命名 zone |
| `zone placement list` / `add` / `modify` / `rm` | zone 级 placement target 管理 |
| `period rm` / `get` / `get-current` / `pull` / `push` / `list` / `update` / `commit` | period 管理:`update` 更新 staging period,`commit` 提交 staging period |
| `pool add` / `pool rm` | 添加 / 移除用于数据放置的既有池 |
| `pools list` | 列出 placement active set |
**⑤ sync / 日志(多站点同步)**
| 命令 | 说明 |
|---|---|
| `metadata sync status` / `init` / `run` | 获取 / 初始化 / 运行 metadata 同步 |
| `data sync status` / `init` / `run` | 获取 / 初始化 / 运行指定源 zone 的 data 同步 |
| `sync error list` / `trim` | 列出 / 清理同步错误 |
| `mdlog list` / `trim` / `status` | 列出 / 手工清理 / 查看 metadata log 状态(多站点部署需要) |
| `bilog list` / `trim` | 列出 / 手工清理 bucket index log(用 start-marker、end-marker) |
| `datalog list` / `trim` / `status` | 列出 / 手工清理 / 查看 data log 状态 |
**⑥ 运维类:policy / log / usage / gc / lc / metadata / orphans**
| 命令 | 说明 |
|---|---|
| `policy` | 显示 bucket/object 策略(权限/ACL 等) |
| `log list` / `show` / `rm` | 列出日志对象 / 导出指定日志(按对象或 bucket+date+bucket-id;**日期格式必须为 `YYYY-MM-DD-hh`**)/ 删除日志对象 |
| `usage show` / `trim` | 显示 / 清理用量信息(可带用户与日期范围) |
| `gc list` / `process` | 列出已过期的垃圾回收对象(`--include-all` 连未过期的也列出)/ 手工处理垃圾 |
| `lc get` / `list` / `process` | 获取 bucket 生命周期配置 / 列出所有 bucket 生命周期进度 / 手工处理生命周期转换(指定 bucket 则只处理该 bucket) |
| `metadata get` / `put` / `rm` / `list` | 获取 / 写入 / 删除 / 列出 metadata 信息 |
| `orphans find` / `finish` / `list-jobs` | 初始化并运行泄漏 RADOS 对象搜索 / 清理搜索 / 列出当前搜索 job ID。**均已 DEPRECATED,请改用 "rgw-orphan-list" 工具** |
**⑦ role / role-policy(STS)**
| 命令 | 说明 |
|---|---|
| `role create` | 创建用于 STS(Security Token Service)的新角色 |
| `role rm` / `get` / `list` / `modify` | 删除 / 获取 / 按路径前缀列出 / 修改已有角色的 assume role policy |
| `role-policy put` / `list` / `get` / `rm` | 添加或更新角色权限策略 / 列出角色绑定的策略 / 获取角色内嵌的 inline 策略文档 / 删除策略 |
**⑧ reshard / topic(通知)**
| 命令 | 说明 |
|---|---|
| `reshard add` / `list` / `process` / `status` / `cancel` | 计划 reshard / 列出所有正在或计划 reshard 的 bucket / 处理计划任务 / 查看某 bucket 的 reshard 状态 / 取消 |
| `topic list` / `get` / `rm` / `stats` / `dump` | 列出 bucket 通知 topic / 获取 / 删除 / 查看持久 topic 统计(reservations、entries、size)/ 以 JSON 转储某持久 topic 的所有待发通知 |
#### 常用选项表(通用)
| 选项 | 参数 | 默认值 | 说明 |
|---|---|---|---|
| `-c ceph.conf`, `--conf=ceph.conf` | 文件路径 | `/etc/ceph/ceph.conf` | 使用指定配置文件确定 monitor 地址 |
| `-m monaddress[:port]` | 地址 | 无 | 直连指定 monitor |
| `--tenant=<tenant>` | tenant 名 | 无 | 租户名 |
| `--uid=uid` | uid | 无 | 操作的用户 |
| `--new-uid=uid` | uid | 无 | 用户的新 ID,用于 `user rename` |
| `--subuser=<name>` | subuser 名 | 无 | subuser 名 |
| `--access-key=<key>` | key | 无 | S3 access key |
| `--email=email` | 邮箱 | 无 | 用户邮箱 |
| `--secret` / `--secret-key=<key>` | key | 无 | secret key |
| `--gen-access-key` | — | 无 | 生成随机 access key(S3) |
| `--gen-secret` | — | 无 | 生成随机 secret key |
| `--generate-key` | true/false | **true** | 创建用户时是否同时生成凭据。为 false 时不能设置 `--gen-access-key`/`--gen-secret`/`--secret-key`/`--access-key`;为 true 时不能设置 `--secret-key`/`--access-key`,并绕过 `--gen-secret`/`--gen-access-key` |
| `--key-type=<type>` | `swift` / `s3` | 无 | key 类型 |
| `--temp-url-key[-2]=<key>` | key | 无 | 临时 URL key |
| `--max-buckets` | 数量 | **1000**(0=无限制,负值=禁止创建 bucket) | 用户的最大 bucket 数 |
| `--access=<access>` | `read`/`write`/`readwrite`/`full` | 无 | 设置 subuser 的访问权限 |
| `--display-name=<name>` | 名字 | 无 | 用户显示名 |
| `--admin` | — | 无 | 设置用户 admin 标志 |
| `--system` | — | 无 | 设置用户 system 标志 |
| `--bucket=[tenant-id/]bucket` | bucket 名 | 无 | 指定 bucket;不指定 tenant-id 则用 `--uid` 用户的 tenant-id |
| `--pool=<pool>` | 池名 | 无 | 指定池;也用于 `orphans find` 指定扫描泄漏对象的 data pool |
| `--object=object` | 对象名 | 无 | 指定对象 |
| `--date=yyyy-mm-dd` | 日期 | 无 | 日期 |
| `--start-date=yyyy-mm-dd` / `--end-date=yyyy-mm-dd` | 日期 | 无 | 起止日期 |
| `--bucket-id=<bucket-id>` | id | 无 | 指定 bucket id |
| `--bucket-new-name=[tenant-id/]<bucket>` | 新名 | 无 | `bucket link` 可选,用于重命名 bucket;通常无需指定 tenant-id |
| `--shard-id=<shard-id>` | id | 无 | `mdlog list`、`bi list`、`data sync status` 可选;`mdlog trim` **必需** |
| `--max-entries=<entries>` | 数量 | 无 | 列举操作的最大条目数 |
| `--purge-data` | — | 无 | 删除用户时同时清除其数据 |
| `--purge-keys` | — | 无 | 删除 subuser 时同时清除其 keys |
| `--purge-objects` | — | 无 | 删除 bucket 时同时清除其中所有对象 |
| `--metadata-key=<key>` | key | 无 | 配合 `metadata get` 使用的 key |
| `--remote=<remote>` | zone/zonegroup id | 无 | 远端网关的 zone 或 zonegroup id |
| `--period=<id>` | period id | 无 | Period ID |
| `--url=<url>` | URL | 无 | 推送/拉取 period 或 realm 的 URL |
| `--epoch=<number>` | 数字 | 无 | Period epoch |
| `--commit` | — | 无 | 在 `period update` 期间提交 period |
| `--staging` | — | 无 | 获取 staging period 信息 |
| `--master` | — | 无 | 设为 master |
| `--master-zone=<id>` | zone id | 无 | Master zone ID |
| `--rgw-realm=<name>` / `--realm-id=<id>` / `--realm-new-name=<name>` | — | 无 | realm 名 / ID / 新名 |
| `--rgw-zonegroup=<name>` / `--zonegroup-id=<id>` / `--zonegroup-new-name=<name>` | — | 无 | zonegroup 名 / ID / 新名 |
| `--rgw-zone=<zone>` / `--zone-id=<id>` / `--zone-new-name=<name>` | — | 无 | zone 名 / ID / 新名 |
| `--source-zone` | zone | 无 | data sync 的源 zone |
| `--default` | — | 无 | 把实体(realm、zonegroup、zone)设为默认 |
| `--read-only` | — | 无 | 加入 zonegroup 时把 zone 设为只读 |
| `--placement-id` | id | 无 | zonegroup placement 命令的 Placement ID |
| `--tags=<list>` / `--tags-add=<list>` / `--tags-rm=<list>` | 列表 | 无 | zonegroup placement add/modify 的标签;后两者用于 modify 的增删 |
| `--endpoints=<list>` | 列表 | 无 | zone endpoints |
| `--index-pool=<pool>` / `--data-pool=<pool>` / `--data-extra-pool=<pool>` | 池名 | 无 | placement target 的 index pool / data pool / data extra(非 EC)pool |
| `--placement-index-type=<type>` | `normal`/`indexless`/`#id` | 无 | placement target 的 index 类型 |
| `--placement-inline-data=<true>` | true | 无 | placement target 是否把数据块内联存放在 head 对象中 |
| `--tier-type=<type>` | 类型 | 无 | zone tier 类型 |
| `--tier-config=<k>=<v>[,...]` / `--tier-config-rm=<k>[,...]` | 键值 | 无 | 设置 / 取消 zone tier 配置键 |
| `--sync-from-all[=false]` | 布尔 | 无 | 设置/重置 zone 是否从 zonegroup 所有 peer 同步 |
| `--sync-from=[zone-name][,...]` / `--sync-from-rm=[zone-name][,...]` | 列表 | 无 | 设置 / 移除同步来源 zone 列表 |
| `--bucket-index-max-shards` | 数量 | 无 | 覆盖 zone/zonegroup 默认 bucket index 分片数;`zone create`、`zone modify`、`zonegroup add`、`zonegroup modify` 接受该选项,且只对这些变更生效**之后**创建的 bucket 起作用 |
| `--fix` | — | 无 | 检查 bucket index 的同时修复它 |
| `--check-objects` | — | 无 | bucket check 时按对象实际状态重建 bucket index |
| `--format=<format>` | `xml` / `json` | 无 | 指定某些操作的输出格式 |
| `--sync-stats` | — | 无 | `user stats` 的选项:用用户 bucket index 报告的当前统计刷新用户统计 |
| `--show-config` | — | 无 | 显示配置 |
| `--show-log-entries=<flag>` / `--show-log-sum=<flag>` | flag | 无 | 启用/禁用 log show 时输出日志条目 / 日志汇总 |
| `--skip-zero-entries` | — | 无 | log show 只输出数值字段非全零的条目 |
| `--infile` | 文件路径 | 无 | 设置数据时指定读取的文件 |
| `--categories=<list>` | 逗号分隔列表 | 无 | `usage show` 使用的类别列表 |
| `--caps=<caps>` | caps 串 | 无 | capabilities 列表,如 `"usage=read, write; user=read"` |
| `--compression=<compression-algorithm>` | `lz4`/`snappy`/`zlib`/`zstd` | 无 | placement target 压缩算法 |
| `--yes-i-really-mean-it` | — | 无 | 某些破坏性操作的必需护栏参数 |
| `--min-rewrite-size` | 大小 | **4M** | bucket rewrite 的最小对象大小 |
| `--max-rewrite-size` | 大小 | **ULLONG_MAX** | bucket rewrite 的最大对象大小 |
| `--min-rewrite-stripe-size` | 大小 | **0** | object rewrite 的最小条带大小;为 0 时 restriping 总是重写该对象 |
| `--warnings-only` | — | 无 | 配合 `bucket limit check`,只列出接近或超过当前 max objects per shard 的 bucket |
| `--bypass-gc` | — | 无 | 删除 bucket 时绕过 GC 直接删除对象 |
| `--inconsistent-index` | — | 无 | 删除 bucket 且 `--bypass-gc` 为 true 时,忽略 bucket index 一致性 |
| `--max-concurrent-ios` | 数量 | **32** | bucket 操作的最大并发数;影响列举、删除以及所有扫描/搜索类操作(如查找 orphans、检查 bucket index) |
**Quota 选项**:
| 选项 | 参数 | 默认值 | 说明 |
|---|---|---|---|
| `--max-objects` | 数量 | 无 | 最大对象数(负值表示禁用) |
| `--max-size` | 大小(B/K/M/G/T) | 无 | 最大对象大小(负值表示禁用) |
| `--quota-scope` | `bucket` / `user` | 无 | 配额作用域 |
**Orphans 搜索选项**:
| 选项 | 参数 | 默认值 | 说明 |
|---|---|---|---|
| `--num-shards` | 数量 | 无 | 临时扫描信息使用的分片数 |
| `--orphan-stale-secs` | 秒 | **86400**(24 小时) | 判定对象为 orphan 前等待的秒数 |
| `--job-id` | id | 无 | 设置 job id(用于 orphans find) |
| `--extra-info` | — | 无 | `orphans list-jobs` 时提供额外信息 |
**Role 选项**:
| 选项 | 参数 | 默认值 | 说明 |
|---|---|---|---|
| `--role-name` | 名字 | 无 | 要创建的角色名 |
| `--path` | 路径 | 无 | 角色路径 |
| `--assume-role-policy-doc` | 策略文档 | 无 | 授予实体担任该角色权限的信任关系策略文档 |
| `--policy-name` | 名字 | 无 | 策略文档名 |
| `--policy-doc` | 策略文档 | 无 | 权限策略文档 |
| `--path-prefix` | 前缀 | 无 | 过滤角色的路径前缀 |
**Bucket Notifications/PubSub 选项**:
| 选项 | 参数 | 默认值 | 说明 |
|---|---|---|---|
| `--topic` | topic 名 | 无 | bucket 通知/pubsub 的 topic 名 |
| `--subscription` | 订阅名 | 无 | pubsub 订阅名 |
| `--event-id` | 事件 id | 无 | pubsub 订阅中的事件 id |
#### 典型示例
```bash
# 用户管理
radosgw-admin user create --display-name="johnny rotten" --uid=johnny
radosgw-admin user create --uid=johnny --display-name="johnny rotten" --email=a@b.com \
--gen-access-key --gen-secret
radosgw-admin user info --uid=johnny
radosgw-admin user list
radosgw-admin user rename --uid=johnny --new-uid=joe
radosgw-admin user rm --uid=johnny
radosgw-admin user rm --uid=johnny --purge-data # 连带删除用户所有 bucket 及其内容
radosgw-admin user suspend --uid=johnny
radosgw-admin user enable --uid=johnny
radosgw-admin user stats --uid=johnny --sync-stats
# 密钥与能力
radosgw-admin key create --uid=johnny --key-type=s3 --gen-access-key --gen-secret
radosgw-admin key rm --uid=johnny --access-key=TCICW53D9BQ2VGC46I44
radosgw-admin caps add --uid=johnny --caps="usage=read, write; user=read"
radosgw-admin subuser create --uid=johnny --subuser=johnny:swift --access=full
radosgw-admin subuser rm --uid=johnny --subuser=johnny:swift --purge-keys
# bucket
radosgw-admin bucket list
radosgw-admin bucket list --bucket=foo --allow-unordered
radosgw-admin bucket stats --bucket=foo
radosgw-admin bucket link --bucket=foo --bucket_id=<bucket id> --uid=johnny
radosgw-admin bucket unlink --bucket=foo --uid=johnny
radosgw-admin bucket link --bucket=foo --bucket-new-name=bar --uid=johnny # 重命名
radosgw-admin bucket chown --bucket=foo --uid='12345678$12345678'
radosgw-admin bucket rm --bucket=foo
radosgw-admin bucket rm --bucket=foo --purge-objects
radosgw-admin bucket rm --bucket=foo --bypass-gc --inconsistent-index
radosgw-admin bucket check --bucket=foo --fix --check-objects
radosgw-admin bucket reshard --bucket=foo --num-shards=... # bucket-index-max-shards 类调整
radosgw-admin bucket limit check --warnings-only
radosgw-admin bucket radoslist --bucket=foo
radosgw-admin bucket rewrite --bucket=foo --min-rewrite-size 4M
# 对象
radosgw-admin object stat --bucket=foo --object=bar
radosgw-admin object manifest --bucket=foo --object=bar
radosgw-admin object rm --bucket=foo --object=bar --yes-i-really-mean-it
radosgw-admin object reindex --bucket=foo --object=bar
radosgw-admin objects expire
# 配额
radosgw-admin quota set --uid=johnny --quota-scope=user --max-objects=1024 --max-size=1024M
radosgw-admin quota enable --uid=johnny --quota-scope=user
radosgw-admin quota set --bucket=foo --quota-scope=bucket --max-size=10G
radosgw-admin global quota set --quota-scope=bucket --max-objects=1000000
radosgw-admin global quota enable --quota-scope=bucket
# 多站点:realm / zonegroup / zone / period
radosgw-admin realm create --rgw-realm=gold --default
radosgw-admin realm list
radosgw-admin realm get --rgw-realm=gold
radosgw-admin realm pull --rgw-realm=gold --url=http://remote:80 --access-key=... --secret=...
radosgw-admin zonegroup create --rgw-zonegroup=us --rgw-realm=gold --master --default
radosgw-admin zonegroup add --rgw-zonegroup=us --rgw-zone=us-east
radosgw-admin zonegroup placement add --rgw-zonegroup=us --placement-id=default-placement \
--index-pool=default.rgw.buckets.index --data-pool=default.rgw.buckets.data
radosgw-admin zone create --rgw-zonegroup=us --rgw-zone=us-east --endpoints=http://rgw1:80 \
--access-key=... --secret=... --default --master
radosgw-admin zone modify --rgw-zone=us-east --sync-from=us-west
radosgw-admin period update --commit
radosgw-admin period get
radosgw-admin period push --url=http://remote:80 --period=<id> --access-key=... --secret=...
# 同步与日志
radosgw-admin metadata sync status
radosgw-admin metadata sync init
radosgw-admin data sync status --source-zone=us-west
radosgw-admin sync error list
radosgw-admin sync error trim
radosgw-admin mdlog list --shard-id=0
radosgw-admin mdlog trim --shard-id=0
radosgw-admin mdlog status
radosgw-admin bilog list --bucket=foo
radosgw-admin bilog trim --bucket=foo --start-marker=... --end-marker=...
radosgw-admin datalog list
radosgw-admin datalog status
# 用量 / 日志 / GC / 生命周期
radosgw-admin usage show --uid=johnny --start-date=2012-03-01 --end-date=2012-04-01
radosgw-admin usage show --show-log-entries=false
radosgw-admin usage trim --uid=johnny --end-date=2012-04-01
radosgw-admin log list
radosgw-admin log show --bucket=foo --date=2012-04-01-01 --bucket-id=default.14193.1
radosgw-admin log rm --bucket=foo --date=2012-04-01-01 --bucket-id=default.14193.1
radosgw-admin gc list --include-all
radosgw-admin gc process
radosgw-admin lc list
radosgw-admin lc process --bucket=foo
radosgw-admin lc get --bucket=foo
# 角色(STS)
radosgw-admin role create --role-name=myrole --path=/application/ \
--assume-role-policy-doc=file://trust.json
radosgw-admin role list --path-prefix=/application/
radosgw-admin role-policy put --role-name=myrole --policy-name=mypolicy --policy-doc=file://p.json
radosgw-admin role-policy list --role-name=myrole
# reshard / topic
radosgw-admin reshard add --bucket=foo --num-shards=8
radosgw-admin reshard list
radosgw-admin reshard process
radosgw-admin reshard status --bucket=foo
radosgw-admin reshard cancel --bucket=foo
radosgw-admin topic list
radosgw-admin topic stats --topic=mytopic
radosgw-admin topic dump --topic=mytopic
# 输出格式
radosgw-admin user list --format=json
```
#### 注意事项 / 常见坑
- `log show` 的**日期格式必须为 `YYYY-MM-DD-hh`**(文档特别 NOTE)。
- `mdlog trim` **必须**给 `--shard-id`;`mdlog list`、`bi list`、`data sync status` 中它是可选的。
- 手工 trim(`mdlog`/`bilog`/`datalog`)前,**先比对 listing、确认上次同步已完成**,否则可能触发重新发起一次同步。
- `orphans find`/`finish`/`list-jobs` **已废弃**,请改用 `rgw-orphan-list` 工具。
- `--generate-key` 默认 `true`:此时不能指定 `--secret-key`/`--access-key`;设为 `false` 时则不能指定 `--gen-access-key`/`--gen-secret`/`--secret-key`/`--access-key`。
- `--max-buckets` 默认 **1000**,0 表示无限制,**负值表示禁止创建 bucket**。
- `--bucket-index-max-shards` 只对**变更生效之后创建**的 bucket 起作用。
- 删除 bucket 时:`--purge-objects` 清除所有对象;`--bypass-gc` 绕过 GC 直接删对象;`--inconsistent-index` 仅在 `--bypass-gc=true` 时用于忽略 index 不一致。
- `--max-concurrent-ios` 默认 **32**,影响所有扫描类操作,bucket 很大时可调高。
- 数据迁移/修复类命令(`object rm --yes-i-really-mean-it`、`object reindex`)属于破坏性或应急操作,务必先确认。
- `bucket chown` 中断后可用 `--marker` 续跑。
> 引自:[radosgw-admin](https://docs.ceph.com/en/tentacle/man/8/radosgw-admin/)
---
## 八、ceph-volume
### 8.1 `ceph-volume`
**用途**:部署逻辑卷作为 OSD 的专用命令行工具,在为 OSD 做 prepare、activate、create 时尽量保持与 `ceph-disk` 相似的 API;**不依赖** Ceph 安装的 udev 规则来发现设备。
**语法(synopsis,保留原文格式)**:
```text
ceph-volume [-h] [--cluster CLUSTER] [--log-level LOG_LEVEL] [--log-path LOG_PATH]
ceph-volume inventory
ceph-volume lvm [ trigger | create | activate | prepare | zap | list | batch | new-wal | new-db | migrate ]
ceph-volume simple [ trigger | scan | activate ]
```
#### 全局选项
| 选项 | 参数 | 默认值 | 说明 |
|---|---|---|---|
| `-h`, `--help` | — | 无 | 帮助 |
| `--cluster CLUSTER` | 集群名 | 无 | 集群名 |
| `--log-level LOG_LEVEL` | 日志级别 | 无 | 日志级别 |
| `--log-path LOG_PATH` | 路径 | 无 | 日志路径 |
---
#### 8.1.1 `inventory`
提供主机物理磁盘清单信息及元数据(型号、大小、rotational/solid state 等磁盘自身信息,以及是否可供 ceph 使用、是否存在逻辑卷等 ceph 相关项)。
| 选项 | 参数 | 默认值 | 说明 |
|---|---|---|---|
| `-h`, `--help` | — | 无 | 帮助 |
| `--format` | `plain`(默认)/ `json` / `json-pretty` | `plain` | 报告格式 |
```bash
ceph-volume inventory
ceph-volume inventory /dev/sda
ceph-volume inventory --format json-pretty
```
---
#### 8.1.2 `lvm batch`
用一组设备创建 OSD,默认使用 `bluestore`;会创建所有必需的 VG 与 LV。
| 选项 | 参数 | 默认值 | 说明 |
|---|---|---|---|
| `--bluestore` | — | 默认 | 使用 bluestore objectstore |
| `--yes` | — | 无 | 跳过报告和确认提示,直接开始配置 |
| `--prepare` | — | 无 | 只 prepare,不 activate |
| `--dmcrypt` | — | 无 | 为底层 OSD 设备启用加密 |
| `--crush-device-class` | 类别名 | 无 | 指定 OSD 归属的 CRUSH device class |
| `--no-systemd` | — | 无 | 不启用也不创建任何 systemd 单元 |
| `--osds-per-device` | 数量 | **1** | 每块设备配置多于 1 个 OSD |
| `--report` | — | 无 | 报告当前输入的潜在结果(**需要传入设备**) |
| `--format` | `pretty`(默认)/ `json` | `pretty` | 与 `--report` 一起使用的输出格式 |
| `--block-db-size` | 字节 | 无 | 设置(或覆盖)`bluestore_block_db_size` |
| `--journal-size` | MB | 无 | 覆盖 `osd_journal_size` |
| `<DEVICE>` | 裸设备全路径,如 `/dev/sda` | — | 必需的位置参数,可传多个 |
```bash
ceph-volume lvm batch --bluestore /dev/sda /dev/sdb /dev/sdc
ceph-volume lvm batch /dev/sda --osds-per-device 2 --crush-device-class ssd
ceph-volume lvm batch --report --format json /dev/sda /dev/sdb
ceph-volume lvm batch --yes --dmcrypt /dev/sda
```
---
#### 8.1.3 `lvm activate`
启用一个 systemd 单元,持久化 OSD ID 与其 UUID(Ceph CLI 中称 `fsid`),以便开机时知道哪个 OSD 被启用并需要挂载。
| 选项 | 参数 | 默认值 | 说明 |
|---|---|---|---|
| `--auto-detect-objectstore` | — | 无 | 通过检查 OSD 自动识别 objectstore |
| `--bluestore` | — | 默认 | bluestore objectstore |
| `--all` | — | 无 | 激活系统中发现的所有 OSD(**幂等**) |
| `--no-systemd` | — | 无 | 跳过创建/启用 systemd 单元与启动 OSD 服务 |
```bash
ceph-volume lvm activate --bluestore 0 8715BEB4-15C5-49DE-BA6F-401086EC7B41
ceph-volume lvm activate --all
ceph-volume lvm activate --all --no-systemd
```
---
#### 8.1.4 `lvm prepare`
把一个逻辑卷准备为 OSD 与 journal,默认 `bluestore`;**不会创建或修改逻辑卷**(除了添加额外元数据)。
| 选项 | 参数 | 默认值 | 说明 |
|---|---|---|---|
| `--data` | 逻辑卷组名或 LV 路径 | — | **必需** |
| `--journal JOURNAL` | LV 组名 / LV 路径 / 设备路径 | 无 | journal |
| `--bluestore` | — | 默认 | 使用 bluestore |
| `--block.wal` | 路径 | 无 | bluestore block.wal 的 LV 或分区路径 |
| `--block.db` | 路径 | 无 | bluestore block.db 的 LV 或分区路径 |
| `--dmcrypt` | — | 无 | 为底层 OSD 设备启用加密(也支持在 `create` 中使用) |
| `--osd-id OSD_ID` | id | 无 | 复用已有 OSD id |
| `--osd-fsid OSD_FSID` | fsid | 无 | 复用已有 OSD fsid |
| `--crush-device-class` | 类别名 | 无 | 指定 CRUSH device class |
```bash
ceph-volume lvm prepare --bluestore --data ceph-vg/ceph-lv
ceph-volume lvm prepare --bluestore --data ceph-vg/ceph-lv --block.db ceph-db-vg/ceph-db-lv
ceph-volume lvm prepare --data /dev/sdc --osd-id 5 --dmcrypt
```
---
#### 8.1.5 `lvm create`
把两步流程(`prepare` 然后 `activate`)合成为一步。之所以优先分开做,是为了**逐步**把新 OSD 引入集群,避免大量数据重平衡。单次调用的行为与 flags 用法等价于 `prepare` + `activate`。
```bash
ceph-volume lvm create --bluestore --data /dev/sda
ceph-volume lvm create --data ceph-vg/ceph-lv --block.wal ceph-wal-vg/ceph-wal-lv
```
---
#### 8.1.6 `lvm trigger`
**不应直接使用**——由 systemd 使用,它解析 systemd 传来的输入(识别 OSD 的 UUID 与 ID)并代理给 `ceph-volume lvm activate`。systemd "data" 格式应为 `<OSD ID>-<OSD UUID>`,且关联的 LV 必须**事先已 prepare**(必需的 tag 与元数据都存在)。
```bash
ceph-volume lvm trigger 0-8715BEB4-15C5-49DE-BA6F-401086EC7B41
```
---
#### 8.1.7 `lvm list`
列出与 Ceph 关联的设备或逻辑卷(通过查询 LVM 元数据并与设备关联来判定)。LV 必须事先由 ceph-volume prepare 过。
| 位置参数 | 形式 |
|---|---|
| `<DEVICE>` | LV 用 `vg/lv`;普通设备用 `/path/to/sda1` 或 `/path/to/sda` |
```bash
ceph-volume lvm list
ceph-volume lvm list /dev/sda1
ceph-volume lvm list ceph-vg/ceph-lv
```
---
#### 8.1.8 `lvm zap`
擦除给定的逻辑卷或分区。若给的是 LV 路径,必须是 `vg/lv` 形式。**该 LV 或分区上的所有文件系统都会被移除、所有数据会被清除,但 LV/分区本身会保留**。
| 选项/位置参数 | 说明 |
|---|---|
| `--destroy` | 彻底移除设备(**所有设备类型均可用**) |
| `--osd-id` | 按 OSD ID 移除多个设备 |
| `--osd-fsid` | 配合 `--osd-id` 精确定位 |
| `<DEVICE>` | LV 用 `vg/lv`;普通设备用 `/path/to/sda1` 或 `/path/to/sda` |
```bash
ceph-volume lvm zap ceph-vg/ceph-lv
ceph-volume lvm zap /dev/sdc1
ceph-volume lvm zap --destroy /dev/sdc1
ceph-volume lvm zap --destroy --osd-id 1
ceph-volume lvm zap --destroy --osd-id 1 --osd-fsid C9605912-8395-4D76-AFC0-7DFDAC315D59
```
---
#### 8.1.9 `lvm new-wal` / `lvm new-db`
把给定逻辑卷作为 WAL / DB 挂到 OSD 上(LV 名格式 `vg/lv`)。**若 OSD 已挂有 WAL/DB 则失败**。
| 选项 | 参数 | 默认值 | 说明 |
|---|---|---|---|
| `--target` | LV 名 | — | **必需**,要挂接的 LV |
| `--osd-id` / `--osd-fsid` | id / fsid | 无 | 定位目标 OSD |
| `--no-systemd` | — | 无 | 跳过检查 OSD systemd 单元 |
| `-h`, `--help` | — | 无 | 帮助 |
```bash
ceph-volume lvm new-wal --osd-id 0 --osd-fsid 8715BEB4-... --target ceph-wal-vg/ceph-wal-lv
ceph-volume lvm new-db --osd-id 0 --osd-fsid 8715BEB4-... --target ceph-db-vg/ceph-db-lv
```
---
#### 8.1.10 `lvm migrate`
把 BlueFS 数据从源卷迁移到目标卷;**除主(data/block)卷外的源卷在成功后会被移除**。目标只允许 LVM 卷,可以是已挂接的也可以是新的(后者会挂到 OSD 并替换某个源设备)。替换规则按优先级(命中即停):
1. 源列表含 DB 卷 → 目标设备替换它
2. 源列表含 WAL 卷 → 目标设备替换它
3. 源列表只有 slow 卷 → **不允许**,需显式用 `new-db`/`new-wal` 分配
| 选项 | 参数 | 默认值 | 说明 |
|---|---|---|---|
| `--from` | `data`/`db`/`wal` 列表 | — | **必需**,源设备类型名列表 |
| `--target` | LV 名 | — | **必需**,迁移目标 LV |
| `--osd-id` / `--osd-fsid` | id / fsid | 无 | 定位目标 OSD |
| `--no-systemd` | — | 无 | 跳过检查 OSD systemd 单元 |
```bash
ceph-volume lvm migrate --osd-id 0 --osd-fsid 8715BEB4-... \
--target ceph-db-vg/new-db-lv --from db
```
---
#### 8.1.11 `simple` 子命令(遗留 ceph-disk 迁移)
| 子命令 | 说明与选项 |
|---|---|
| `simple activate` | 启用 systemd 单元以持久化 OSD ID 与 UUID,读取先前在 `/etc/ceph/osd/` 下以 JSON 格式持久化的信息。选项:`--bluestore`(默认)。**需要匹配的 JSON 文件**:`/etc/ceph/osd/<osd id>-<osd fsid>.json` |
| `simple scan` | 扫描运行中的 OSD 或数据设备,生成可后续用于 activate 与管理的 JSON(含 OSD 目录下发现的所有信息)。可选:`--stdout`(JSON 打到 stdout)、`--force`(目标已存在 JSON 则覆盖);可选位置参数:`<DATA DEVICE or OSD DIR>` |
| `simple trigger` | 不应直接使用;由 systemd 代理输入给 `simple activate`,数据格式 `<OSD ID>-<OSD UUID>` |
```bash
ceph-volume simple scan
ceph-volume simple scan /dev/sda1
ceph-volume simple scan /var/lib/ceph/osd/ceph-0
ceph-volume simple scan --stdout --force
ceph-volume simple activate --bluestore 0 8715BEB4-15C5-49DE-BA6F-401086EC7B41
ceph-volume simple trigger 0-8715BEB4-15C5-49DE-BA6F-401086EC7B41
```
#### 注意事项 / 常见坑
- `ceph-volume` **不依赖 udev 规则**发现设备,这与 `ceph-disk` 不同。
- `lvm zap` 只清数据、保留 LV/分区本身;要彻底删除请加 `--destroy`。
- 加密 OSD:`--dmcrypt` 必须在 **prepare**(或 `create`)阶段就加上。
- 优先用 `prepare` + `activate` 分两步,以便**逐步**引入新 OSD、避免大规模重平衡。
- `lvm trigger` / `simple trigger` **不应手工执行**,由 systemd 调用。
- `lvm list` / `lvm trigger` 都要求相关 LV **事先已被 ceph-volume prepare**(tag 与元数据齐全)。
- `simple activate` 需要 `/etc/ceph/osd/<osd id>-<osd fsid>.json` 存在(由 scan 或手工生成)。
- `lvm migrate` 在源列表只有 slow 卷时**不允许**执行。
> 引自:[ceph-volume](https://docs.ceph.com/en/tentacle/man/8/ceph-volume/)
---
### 8.2 `ceph-volume-systemd`
**用途**:systemd 辅助工具,接收(动态创建的)systemd 单元传入的参数,将其转换为对 `ceph-volume` 的一次系统调用,**仅用于激活(activation)** OSD。
**语法(synopsis,保留原文格式)**:
```text
ceph-volume-systemd systemd instance name
```
#### 常用选项表
| 选项 | 参数 | 默认值 | 说明 |
|---|---|---|---|
| (无) | `systemd instance name` | — | 文档未列出任何命令行选项 |
#### 输入格式
输入是 **systemd instance name**(在 systemd 单元中以 `%i` 表示),格式应为:
```text
<ceph-volume subcommand>-<extra metadata>
```
以 `lvm` 为例:
```bash
/usr/bin/ceph-volume-systemd lvm-0-8715BEB4-15C5-49DE-BA6F-401086EC7B41
```
它进而会调用:
```bash
ceph-volume lvm trigger 0-8715BEB4-15C5-49DE-BA6F-401086EC7B41
```
> 任何其他子命令若要被这样调用,都必须自己实现一个能消费该格式 extra metadata 的 `trigger` 命令。
#### 典型示例
```bash
# systemd 单元内部调用(%i 展开)
/usr/bin/ceph-volume-systemd lvm-%i
# 等价的手工调用
ceph-volume-systemd lvm-0-8715BEB4-15C5-49DE-BA6F-401086EC7B41
```
#### 注意事项 / 常见坑
- 这是给 systemd 单元用的辅助程序,**通常不由人手工直接执行**。
- 只做 **activation**,不做创建/准备。
- 自定义子命令要接入该机制,必须实现对应的 `trigger` 命令。
> 引自:[ceph-volume-systemd](https://docs.ceph.com/en/tentacle/man/8/ceph-volume-systemd/)
---
## 附录
### A. 环境变量
| 环境变量 | 作用 | 出处 |
|---|---|---|
| `CEPH_ARGS` | 为不接受命令行通用选项的工具传递通用 Ceph 参数。文档明确用例:`CEPH_ARGS="--debug-crush 0" crushtool ...`;`rados` 也可把 `--all` 放进 `CEPH_ARGS` 使其成为默认 | `crushtool`、`rados` |
| `CEPH_CONF` | 文档未明确(本册源文未出现该变量名的说明) | — |
| `CEPHFS_SHELL_CONF` | `cephfs-shell.conf` 的查找路径(优先于家目录下的 `~/.cephfs-shell.conf`) | `cephfs-shell` |
| `RBDMAPFILE` | 覆盖 `rbdmap` 默认配置文件路径(默认 `/etc/ceph/rbdmap`) | `rbdmap` |
> 💡 补充:`CEPH_CONF` 是 Ceph 工具链常见的配置文件覆盖变量,但**本册所覆盖的 36 个 man 页中未出现**该变量名的说明,因此不在本册断言其具体行为。
### B. 配置文件 / 关键路径
| 路径 | 说明 | 出处 |
|---|---|---|
| `/etc/ceph/ceph.conf` | 默认 Ceph 配置文件(几乎所有 `-c`/`--conf` 选项的默认值) | 多个命令 |
| `/etc/ceph/$cluster.conf`、`~/.ceph/$cluster.conf`、`$cluster.conf` | 未指定 `-c` 时 `ceph-conf` 使用的配置文件(按此顺序) | `ceph-conf` |
| `/etc/ceph/rbdmap` | `rbdmap` 默认配置文件 | `rbdmap` |
| `/etc/fstab` | `rbdmap`(需含友好设备名条目)与 `mount.fuse.ceph` 使用 | `rbdmap`、`mount.fuse.ceph` |
| `/etc/ceph/osd/<osd id>-<osd fsid>.json` | `ceph-volume simple activate` 必需的 JSON 文件 | `ceph-volume` |
| `/var/run/ceph` | `ceph --admin-daemon` 查找 admin socket 的目录 | `ceph` |
| `/var/lib/ceph/osd/ceph-N` | OSD 数据目录(示例路径,用于 `ceph-kvstore-tool` 等) | 💡 补充(示例) |
| `~/.cephfs-shell.conf` | `cephfs-shell` 配置文件(家目录) | `cephfs-shell` |
| `cephfs-shell.conf` | CephFS Shell 配置文件名 | `cephfs-shell` |
| `/etc/apache2/conf-available/rgw.conf`(Debian/Ubuntu)<br>`/etc/httpd/conf.d/rgw.conf`(CentOS/RHEL) | radosgw 的 Apache/FastCGI 网关配置 | `radosgw` |
| `/var/log/ceph/` | Ceph 日志目录(示例路径) | `ceph-post-file`(示例) |
| `50-rbd.rules` | udev 规则文件,配合 `rbdnamer` 创建 RBD 设备符号链接 | `rbdnamer` |
### C. 退出码
| 命令 | 退出码定义 |
|---|---|
| `cephfs-shell` | 见 6.4 节退出码表(1–22,按 errno 语义映射:1=Miscellaneous、2=Keyboard Interrupt、3=Operation not permitted、4=Permission denied、5=No such file or directory、6=I/O error、7=No space left on device、8=File exists、9=No data available、10=Invalid argument、11=Operation not supported on transport endpoint、12=Range error、13=Operation would block、14=Directory not empty、15=Not a directory、16=Disk quota exceeded、17=Broken pipe、18=Cannot send after transport endpoint shutdown、19=Connection aborted、20=Connection refused、21=Connection reset、22=Interrupted function call) |
| `ceph osd ok-to-stop` | 返回**成功码**表示可以停;否则返回**错误码 + 说明信息**(无法判断时也返回错误码) |
| `ceph osd safe-to-destroy` | 返回**成功码**表示确定安全;否则返回**错误码 + 说明信息** |
| `ceph osd ok-to-upgrade` | 找到安全集合时返回**成功码**并显示 OSD 列表;否则返回**错误码 + 说明信息** |
| 其余 33 个命令 | **文档未明确**退出码定义 |
> 💡 补充:本册源文只在 `cephfs-shell` 一节给出完整退出码表;`ceph` 的若干判定类子命令(`ok-to-stop`、`safe-to-destroy`、`ok-to-upgrade`)只约定了"成功码/错误码"的语义,未给出具体数值。
### D. 默认值速查(跨命令)
| 项 | 默认值 | 出处 |
|---|---|---|
| 集群名 | `ceph` | `rados`、`radosgw` |
| rbd 池名 | `rbd` | `rbd`、`rbd-fuse`、`rbd-nbd`、`rbd-ggate`、`rbd-replay`、`rbdmap` |
| rbd `--image-format` | `2` | `rbd` |
| rbd `--object-size` | `4M`(最小 4K,最大 32M) | `rbd` |
| rbd `--stripe-count` | `1` | `rbd` |
| rbd `--format` | `plain` | `rbd` |
| rbd `sparsify --sparse-size` | `4096` 字节 | `rbd` |
| rbd `bench` 默认 | `--io-size 4096`、`--io-threads 16`、`--io-total 1G`、`--io-pattern seq`、`--rw-mix-read 50` | `rbd` |
| rbd-nbd `--reattach-timeout` | `30` 秒;`--io-timeout` 内核默认 30 秒 | `rbd-nbd` |
| `ceph-authtool --mode` | `0600` | `ceph-authtool` |
| `ceph-authtool --key-type` | `preferred` | `ceph-authtool` |
| `ceph-conf --name` | `client.admin` | `ceph-conf` |
| `ceph osd reweight-by-pg` 过载判定 | `120` | `ceph` |
| `ceph osd reweight-by-utilization` | 过载阈值 `120`、最大权重变化 `0.05`、最多调整 OSD 数 `4` | `ceph` |
| `ceph config log` count | `10` | `ceph` |
| `ceph tell ... heap` release rate | `1.0` | `ceph` |
| `osdmaptool --upmap-max` | `10` | `osdmaptool` |
| `osdmaptool --upmap-deviation` | `5` | `osdmaptool` |
| `osdmaptool --upmap <file>` / `--upmap-cleanup <file>` | `-`(stdout) | `osdmaptool` |
| `crushtool --min-x/--max-x` | `0` / `1023` | `crushtool` |
| monmap 默认端口 | v1=`6789`,v2=`3300` | `monmaptool` |
| monmaptool 三种 auth cipher | `aes256k` | `monmaptool` |
| `rados bench` 对象大小 / 线程数 | `4 MB` / `16` | `rados` |
| `rados cleanup --run-name` | `benchmark_last_metadata` | `rados` |
| `radosgw-admin --generate-key` | `true` | `radosgw-admin` |
| `radosgw-admin --max-buckets` | `1000` | `radosgw-admin` |
| `radosgw-admin --max-concurrent-ios` | `32` | `radosgw-admin` |
| `radosgw-admin --min-rewrite-size` / `--max-rewrite-size` / `--min-rewrite-stripe-size` | `4M` / `ULLONG_MAX` / `0` | `radosgw-admin` |
| `radosgw-admin --orphan-stale-secs` | `86400`(24 小时) | `radosgw-admin` |
| `mount.ceph mount_timeout` | `60` 秒 | `mount.ceph` |
| `mount.ceph mds_namespace`/`fs` | 无(旧语法用) | `mount.ceph` |
| `mount.ceph recover_session` | `no` | `mount.ceph` |
| `mount.ceph snapdirname` | `.snap` | `mount.ceph` |
| `mount.ceph rsize`/`wsize` | `16777216`(16M) | `mount.ceph` |
| `mount.ceph rasize` | `8388608` | `mount.ceph` |
| `mount.ceph readdir_max_bytes` / `readdir_max_entries` | `524288` / `1024` | `mount.ceph` |
| `mount.ceph caps_wanted_delay_max` / `_min` | `60` / `5` | `mount.ceph` |
| `mount.ceph osdkeepalive` / `osd_idle_ttl` | `5` / `60` | `mount.ceph` |
| `mount.ceph read_from_replica` | `no` | `mount.ceph` |
| `ceph-volume lvm batch --osds-per-device` | `1` | `ceph-volume` |
| `ceph-volume inventory --format` | `plain` | `ceph-volume` |
| `ceph-volume lvm batch --format` | `pretty` | `ceph-volume` |
| `rbd-replay --latency-multiplier` | `1` | `rbd-replay` |
| `rbd-replay -p/--pool` | `rbd` | `rbd-replay` |
| `rbd-replay-many --delay` | `0` | `rbd-replay-many` |
| `ceph-syn -c` | `/etc/ceph/ceph.conf` | `ceph-syn` |
---
## 文档未明确项
以下条目在本次覆盖的 36 个 `doc/man/8/` 源文件中**未给出明确说明**,本册不做断言,需参考其他官方文档或源码:
1. **`ceph orch` 与 `ceph telemetry` 子命令**:`ceph` 的 man 页 synopsis 未收录这两个子命令族(仅在 `-f/--format` 选项说明中提及 `yaml` 仅对 `orch` 命令有效)。本册已在 1.1 节的 **⑫ `orch`** 与 **⑬ `telemetry`** 中,依据 `mgr/orchestrator.rst`、`mgr/telemetry.rst`、`cephadm/` 等官方源文档补齐 synopsis、子命令表与示例(synopsis 为归纳所得,非 man 页原文,已用「💡 补充」标注)。剩余未明确项:`orch sd dump cert`、`orch cert-store`、`orch osd ident-on/off` 等命令的完整选项,以及各 orchestrator 后端逐命令的兼容矩阵细节。
2. **`ceph-conf` 的 `CEPH_CONF` 环境变量**:文档只说明 `-c conffile` 及默认搜索路径(`/etc/ceph/$cluster.conf`、`~/.ceph/$cluster.conf`、`$cluster.conf`),未说明环境变量覆盖方式。
3. **退出码**:除 `cephfs-shell`(1–22 完整表)以及 `ceph osd ok-to-stop`/`safe-to-destroy`/`ok-to-upgrade`(仅约定"成功码/错误码"语义)外,其余 33 个命令均未给出退出码定义。
4. **`ceph-clsinfo` 的输出格式与选项组合**:只说明 `-n`/`-v`/`-a` 三个选项的作用,未给出输出样例,也未说明能否同时使用。
5. **`rbdnamer` 的二进制名**:源文件名与 `.. program::` 声明为 `ceph-rbdnamer`,文档标题为 `ceph-rbdnamer -- udev helper to name RBD devices`;本册按手册目录项使用 `rbdnamer`,实际安装名是否带 `ceph-` 前缀文档未明确。
6. **`rbdmap unmap-all`**:正文 Description 中提到该用法,但 Synopsis 与 Options 未列出其语法与选项(Options 一节明确写 None)。
7. **`crushtool` 的完整 `--set-...` tunables 清单**:文档只举例 `--set-choose-total-tries`,并说明"更多 `--test` 相关选项见官方 man 页",未给出完整列表。
8. **`ceph-syn` 的完整 workload 列表**:文档明确注明"This is not a complete list"。
9. **`osdmaptool --read` 的完整参数**:文档只给出 `--read <file>` 与 `--read-pool <poolname>`,未说明输出文件内容格式与可调参数。
10. **`radosgw-admin` 各子命令的精确必需/可选参数矩阵**:man 页只给出命令清单与选项清单,未逐命令标注哪些选项为必需(除文中明确写 Required 的几项,如 `mdlog trim` 需 `--shard-id`)。
11. **krbd 选项的"当前默认值"**:`rbd` 文档明确说明这些默认值由内核设置,**可能取决于运行内核的版本**,因此本册给出的默认值以文档标注为准,实际以内核为准。
12. **`ceph-volume` 全局选项 `--log-level` / `--log-path` 的取值**:文档只列出选项名,未给出合法取值清单。