215 KiB
基于 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,保留原文格式):
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)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 |
典型示例
# 集群概览
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 起不再被支持;fullflag 在 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
⑫ orch(Orchestrator / cephadm 编排)
用途:ceph orch 是 Orchestrator CLI,为 orchestrator 模块(cephadm、rook 等)提供统一的命令行入口,用于声明式地部署/扩容/缩容/删除服务、管理主机与设备、升级集群。
💡 补充:
cephman 页未给出orch的 synopsis。下面的 synopsis 由官方文档中出现的各条ceph orch ...用法归纳而成,非原文逐字引用。
语法(synopsis):
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 |
典型示例:
# 查看编排器状态与已部署服务
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命令有效(这也是cephman 页唯一提到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
⑬ telemetry(遥测上报)
用途:telemetry 是 ceph-mgr 模块,把集群的匿名数据发回 Ceph 开发者,用于统计 Ceph 的使用方式与用户遇到的问题。数据公示在公共面板 https://telemetry-public.ceph.com/(可看到上报集群数、总容量、OSD 数量、版本分布趋势等)。
💡 补充:
cephman 页未收录telemetry。下面的 synopsis 由mgr/telemetry.rst中出现的命令归纳而成,非 man 页原文。
语法(synopsis):
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,且不与特定集群关联。
- 生成设备报告需要
smartmontools7.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' |
典型示例:
# 开启 / 关闭 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
1.2 ceph-conf
用途:从 Ceph 配置文件(而非 monitor)中读取配置信息的工具。
语法(synopsis,保留原文格式):
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,优先于常规搜索;返回首个匹配项 |
典型示例
# 查 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
1.3 ceph-run
用途:一个简单的包装器,当被包装的守护进程因崩溃(可能 core dump)退出时自动重启它。
语法(synopsis,保留原文格式):
ceph-run command ...
常用选项表
| 选项 | 参数 | 默认值 | 说明 |
|---|---|---|---|
| (无) | — | — | Options: None(文档原文明确写 None) |
典型示例
# 用 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
1.4 ceph-syn
用途:Ceph 分布式文件系统的合成负载生成器,通过用户态客户端库对正在运行的文件系统产生简单负载。
语法(synopsis,保留原文格式):
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) |
文档注明"这不是完整列表"。
典型示例
# 单客户端:建目录树 + 遍历
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
1.5 ceph-post-file
用途:把文件或目录上传到 ceph.com,供 Ceph 开发者后续分析。
语法(synopsis,保留原文格式):
ceph-post-file [-d description] [-u user] file or dir ...
常用选项表
| 选项 | 参数 | 默认值 | 说明 |
|---|---|---|---|
-d *description*, --description *description* |
描述文本 | 无默认值 | 为本次上传添加简短描述;适合引用 bug 号 |
-u *user* |
用户标识 | whoami@hostname -f |
设置上传的用户元数据 |
典型示例
# 上传单个日志
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/)里。
- 上传完成后,目录会被标记为不可读、不可写,防止他人访问或修改。
1.6 librados-config
用途:显示已安装的 librados 信息的工具。
语法(synopsis,保留原文格式):
librados-config [ --version ] [ --vernum ]
常用选项表
| 选项 | 参数 | 默认值 | 说明 |
|---|---|---|---|
--version |
— | 无 | 显示 librados 版本 |
--vernum |
— | 无 | 显示 librados 版本代码(version code) |
典型示例
librados-config --version
librados-config --vernum
注意事项 / 常见坑
- 无。文档未列出其他选项或限制。
二、密钥与认证
2.1 ceph-authtool
用途:创建、查看和修改 Ceph keyring 文件的工具(keyring 保存一个或多个 Ceph 认证密钥及可选的能力声明)。
语法(synopsis,保留原文格式):
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 语法:
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 是能力串。
典型示例
# 新建 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 选定的默认算法。
2.2 ceph-clsinfo
用途:显示某个 class object(RADOS class 对象文件)的名称、版本与架构信息。
语法(synopsis,保留原文格式):
ceph-clsinfo [ options ] ... filename
常用选项表
| 选项 | 参数 | 默认值 | 说明 |
|---|---|---|---|
-n, --name |
— | 无 | 显示 class 名称 |
-v, --version |
— | 无 | 显示 class 版本 |
-a, --arch |
— | 无 | 显示 class 架构 |
典型示例
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
三、MON / OSD 工具
3.1 ceph-mon
用途:Ceph 集群的 monitor 守护进程;一个或多个 ceph-mon 组成 Paxos part-time parliament 集群,提供集群成员、配置与状态的高可靠持久存储。
语法(synopsis,保留原文格式):
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 必须提供的三要素
- cluster fsid:来自 monmap(
--monmap <path>)或通过--fsid <uuid>显式给出。 - monitor 列表及地址:来自 monmap、
mon host配置值(ceph.conf 或-m host1,host2,...),或(向后兼容)ceph.conf 中已废弃的mon addr行。若该 monitor 要成为新集群初始 quorum 的一员,则它必须出现在初始列表中(按名字或地址匹配);按地址匹配时可用public addr或public subnet。 - monitor secret key
mon.:必须通过--keyring <path>提供的 keyring 包含它。
典型示例
# 前台运行(便于 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
3.2 ceph-osd
用途:Ceph 的对象存储守护进程,管理本地存储上的数据并提供网络访问。
语法(synopsis,保留原文格式):
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 同时使用 |
典型示例
# 前台运行 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
3.3 ceph-mds
用途:Ceph 分布式文件系统的元数据服务器守护进程;多个实例协同管理文件系统命名空间,协调对共享 OSD 集群的访问。
语法(synopsis,保留原文格式):
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 不应以数字开头 |
典型示例
# 前台启动一个 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
3.4 monmaptool
用途:创建、查看和修改 Ceph monitor 集群映射(monmap)的工具;monmap 指定了 Ceph 分布式系统中唯一固定的地址。
语法(synopsis,保留原文格式):
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 轮换时的首选加密类型 |
典型示例
# 为全新集群创建含三个 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
3.5 osdmaptool
用途:创建、查看和操作 OSD 集群映射(osdmap)的工具;可抽取/导入 CRUSH map,并可模拟 upmap 均衡器以评估 PG 均衡所需操作。
语法(synopsis,保留原文格式):
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/ 前缀 |
典型示例
# 创建一个含 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)
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
3.6 crushtool
用途:创建、编译、反编译和测试 CRUSH map 文件的工具。
语法(synopsis,保留原文格式):
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)
每层语法:
bucket ( uniform | list | tree | straw | straw2 ) size
- bucket:该层 bucket 的类型(如
rack);每个 bucket 名 = bucket 字符串 + 唯一数字(rack0、rack1...)。 - 类型:多数情况下应使用
straw。 - size:bucket 的最大容量;0 表示无限容量。
典型示例
# 反编译 → 编辑 → 重新编译
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获得(如 PG2.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
3.7 crushdiff
用途:测试 CRUSH map 变更影响的工具——会移动多少 PG、多少对象、多少字节。它是 osdmaptool --test-map-pgs-dump 的封装,并结合 pg stats 计算对象与字节迁移量。
语法(synopsis,保留原文格式):
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 |
典型示例
# 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
输出示例
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):
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
3.8 ceph-kvstore-tool
用途:kvstore(键值存储)操作工具,允许离线操作 RocksDB 中的数据(如 OSD 的 omap)。
语法(synopsis,保留原文格式):
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 大小的分布统计 |
典型示例
# 列出某 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)。
3.9 ceph-dencoder
用途:Ceph 数据结构的编码/解码/转储工具,用于调试和测试跨版本兼容性;接收一个简单命令列表并按顺序执行。
语法(synopsis,保留原文格式):
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,以便编码出旧版本软件能理解的对象(仅对支持该能力的类型有效) |
典型示例
# 查看 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只对支持该能力的类型有效。
3.10 ceph-debugpack
用途:打包一个含崩溃调试所需材料的 tarball,便于与 Ceph 开发者共享来定位问题。
语法(synopsis,保留原文格式):
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。
典型示例
# 生成调试包
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,需要能连上集群。
四、RADOS
4.1 rados
用途:与 Ceph 对象存储集群(RADOS)交互的工具——对象增删改查、池快照、omap/xattr 操作、性能压测等。
语法(synopsis,保留原文格式):
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 载入池内容 |
典型示例
# 集群与池利用率
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
五、RBD
5.1 rbd
用途:管理 RADOS 块设备(RBD)镜像的工具,被 Linux rbd 驱动与 QEMU/KVM 的 rbd 存储驱动使用。
语法(synopsis,保留原文格式):
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 写法
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)。
典型示例
# 创建与查看
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
5.2 rbd-fuse
用途:RBD 镜像的 FUSE 客户端——把一个含 rbd 镜像的池挂载为用户态文件系统,让镜像在挂载点下像普通文件一样可访问。
语法(synopsis,保留原文格式):
rbd-fuse [ -p pool ] [-c conffile] mountpoint [ fuse options ]
常用选项表
| 选项 | 参数 | 默认值 | 说明 |
|---|---|---|---|
-c ceph.conf |
文件路径 | /etc/ceph/ceph.conf |
使用指定配置文件确定 monitor 地址 |
-p pool |
池名 | rbd |
指定搜索 rbd 镜像的池 |
任何
rbd-fuse不认识的选项都会被转交给 libfuse。
典型示例
# 挂载默认 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
5.3 rbd-nbd
用途:把 RBD 镜像映射到 nbd(Network Block Device) 设备,从而像本地块设备一样访问。
语法(synopsis,保留原文格式):
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
image-spec is [pool-name]/image-name
snap-spec is [pool-name]/image-name@snap-name
pool-name默认rbd;镜像名含/时必须显式给出pool-name。
典型示例
# 映射
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
5.4 rbd-ggate
用途:把 RBD 镜像映射到 ggate(FreeBSD GEOM Gate class) 设备,供 FreeBSD 上像本地块设备一样访问。
语法(synopsis,保留原文格式):
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
image-spec is [pool-name]/image-name
snap-spec is [pool-name]/image-name@snap-name
pool-name默认rbd;镜像名含/时必须显式给出pool-name。
典型示例
# 映射
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
5.5 rbdmap
用途:一个 shell 脚本,自动对一个或多個 RBD 镜像执行 rbd map / rbd unmap;主要用途是开机自动映射并挂载(关机时反向执行),由 init 系统(systemd 单元 rbdmap.service,随 ceph-common 包提供)触发。
语法(synopsis,保留原文格式):
rbdmap map
rbdmap unmap
常用选项表
| 选项 | 参数 | 默认值 | 说明 |
|---|---|---|---|
| (无) | — | — | Options: None(文档原文明确写 None) |
环境变量 RBDMAPFILE |
文件路径 | /etc/ceph/rbdmap |
覆盖默认配置文件路径 |
配置文件格式:
IMAGESPEC RBDOPTS
IMAGESPEC:POOLNAME/IMAGENAME,或只写IMAGENAME(此时POOLNAME默认为rbd)。RBDOPTS:可选,逗号分隔的PARAM1=VAL1,PARAM2=VAL2,...,会传给底层rbd map。- 参数或值中含逗号或等号时,可用单引号避免被替换。
典型示例
# /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
5.6 rbd-replay
用途:重放 RBD 工作负载的工具。
语法(synopsis,保留原文格式):
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;多个镜像关闭或同一镜像多次开关会输出多次;计数器的含义可能随版本变化 |
典型示例
# 尽可能快地重放(间隔归零)
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
5.7 rbd-replay-prep
用途:把原始 RBD trace 处理成可供 rbd-replay 重放的格式。
语法(synopsis,保留原文格式):
rbd-replay-prep [ --window seconds ] [ --anonymize ] trace_dir replay_file
常用选项表
| 选项 | 参数 | 默认值 | 说明 |
|---|---|---|---|
--window seconds |
秒 | 无 | 相隔超过 seconds 秒的请求被视为相互独立 |
--anonymize |
— | 无 | 对镜像名与快照名做匿名化 |
--verbose |
— | 无 | 把所有处理过的事件打印到控制台 |
典型示例
# 准备 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
注意事项 / 常见坑
- 无。文档未列出其他限制。
5.8 rbd-replay-many
用途:在多个客户端上重放同一个 RBD 工作负载的工具;所有客户端使用相同负载,但各自针对不同的镜像重放(符合 librbd 的典型用法:每个原始客户端是一个有自己镜像的 VM)。
语法(synopsis,保留原文格式):
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 | 启动每个客户端之间的间隔 |
典型示例
# 在两台主机上重放
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
注意事项 / 常见坑
- 配置文件与重放文件不会自动复制到客户端,需自行分发。
- 重放用的镜像必须已经存在,该工具不会创建。
5.9 rbdnamer
用途:udev 辅助工具——针对给定的 RBD 设备,把 pool、namespace、image 与 snapshot 名字打到 stdout,供 udev 设备管理器创建 RBD 设备符号链接使用(相应 udev 规则由 50-rbd.rules 提供)。
语法(synopsis,保留原文格式):
ceph-rbdnamer num
💡 补充:源文件名是
ceph-rbdnamer.rst,但文档标题与程序名均为 rbdnamer(.. program:: ceph-rbdnamer的声明与正文一致指向该 udev helper;实际安装的二进制名在不同发行版/版本上可能带或不带ceph-前缀,文档未明确)。
常用选项表
| 选项 | 参数 | 默认值 | 说明 |
|---|---|---|---|
| (无) | num(RBD 设备号) |
— | 文档未列出任何命令行选项;只接受设备编号参数 |
典型示例
# 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
六、CephFS
6.1 ceph-fuse
用途:Ceph 分布式文件系统的 FUSE(用户态文件系统)客户端,把 -m 指定或 ceph.conf 描述的 Ceph 文件系统挂载到指定挂载点。
语法(synopsis,保留原文格式):
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。
典型示例
# 挂载默认文件系统
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
6.2 mount.ceph
用途:在 Linux 主机上挂载 Ceph 文件系统的挂载助手——负责把 monitor 主机名解析为 IP、从磁盘读取认证密钥;真正的工作由 Linux 内核客户端完成。
语法(synopsis,保留原文格式):
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 类型匹配者胜) |
典型示例
# 挂载整个文件系统(推荐通过 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
6.3 mount.fuse.ceph
用途:从 /etc/fstab 挂载 ceph-fuse 的辅助程序。
语法(synopsis,保留原文格式):
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 选项都可以这样传。
典型示例
# /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(示例中给出),避免网络未就绪时挂载。
6.4 cephfs-shell
用途:提供类 shell 命令直接与 Ceph 文件系统交互的工具,支持交互式与非交互式两种模式。
语法(synopsis,保留原文格式):
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:
[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 文档)。示例:
[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 |
典型示例
# 交互模式
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
交互式会话片段:
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
七、RGW(对象网关)
7.1 radosgw
用途:RADOS 对象存储的 HTTP REST 网关,以 libfcgi 实现为 FastCGI 模块,可与任何支持 FastCGI 的 Web 服务器配合使用。
语法(synopsis,保留原文格式):
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 片段:
[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):
<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/
典型示例
# 生成网关认证 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),此时记在操作用户名下。
示例配置:
[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
7.2 radosgw-admin
用途:Ceph 对象网关的用户管理工具,用于创建和修改用户,并覆盖 bucket、配额、多站点(realm/zonegroup/zone/period)、同步、角色、通知等全部管理面操作。
语法(synopsis,保留原文格式):
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 |
典型示例
# 用户管理
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续跑。
八、ceph-volume
8.1 ceph-volume
用途:部署逻辑卷作为 OSD 的专用命令行工具,在为 OSD 做 prepare、activate、create 时尽量保持与 ceph-disk 相似的 API;不依赖 Ceph 安装的 udev 规则来发现设备。
语法(synopsis,保留原文格式):
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 |
报告格式 |
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 |
— | 必需的位置参数,可传多个 |
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 服务 |
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 |
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。
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 与元数据都存在)。
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 |
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 |
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 |
— | 无 | 帮助 |
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 并替换某个源设备)。替换规则按优先级(命中即停):
- 源列表含 DB 卷 → 目标设备替换它
- 源列表含 WAL 卷 → 目标设备替换它
- 源列表只有 slow 卷 → 不允许,需显式用
new-db/new-wal分配
| 选项 | 参数 | 默认值 | 说明 |
|---|---|---|---|
--from |
data/db/wal 列表 |
— | 必需,源设备类型名列表 |
--target |
LV 名 | — | 必需,迁移目标 LV |
--osd-id / --osd-fsid |
id / fsid | 无 | 定位目标 OSD |
--no-systemd |
— | 无 | 跳过检查 OSD systemd 单元 |
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> |
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
8.2 ceph-volume-systemd
用途:systemd 辅助工具,接收(动态创建的)systemd 单元传入的参数,将其转换为对 ceph-volume 的一次系统调用,仅用于激活(activation) OSD。
语法(synopsis,保留原文格式):
ceph-volume-systemd systemd instance name
常用选项表
| 选项 | 参数 | 默认值 | 说明 |
|---|---|---|---|
| (无) | systemd instance name |
— | 文档未列出任何命令行选项 |
输入格式
输入是 systemd instance name(在 systemd 单元中以 %i 表示),格式应为:
<ceph-volume subcommand>-<extra metadata>
以 lvm 为例:
/usr/bin/ceph-volume-systemd lvm-0-8715BEB4-15C5-49DE-BA6F-401086EC7B41
它进而会调用:
ceph-volume lvm trigger 0-8715BEB4-15C5-49DE-BA6F-401086EC7B41
任何其他子命令若要被这样调用,都必须自己实现一个能消费该格式 extra metadata 的
trigger命令。
典型示例
# systemd 单元内部调用(%i 展开)
/usr/bin/ceph-volume-systemd lvm-%i
# 等价的手工调用
ceph-volume-systemd lvm-0-8715BEB4-15C5-49DE-BA6F-401086EC7B41
注意事项 / 常见坑
- 这是给 systemd 单元用的辅助程序,通常不由人手工直接执行。
- 只做 activation,不做创建/准备。
- 自定义子命令要接入该机制,必须实现对应的
trigger命令。
附录
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)/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/ 源文件中未给出明确说明,本册不做断言,需参考其他官方文档或源码:
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 后端逐命令的兼容矩阵细节。ceph-conf的CEPH_CONF环境变量:文档只说明-c conffile及默认搜索路径(/etc/ceph/$cluster.conf、~/.ceph/$cluster.conf、$cluster.conf),未说明环境变量覆盖方式。- 退出码:除
cephfs-shell(1–22 完整表)以及ceph osd ok-to-stop/safe-to-destroy/ok-to-upgrade(仅约定"成功码/错误码"语义)外,其余 33 个命令均未给出退出码定义。 ceph-clsinfo的输出格式与选项组合:只说明-n/-v/-a三个选项的作用,未给出输出样例,也未说明能否同时使用。rbdnamer的二进制名:源文件名与.. program::声明为ceph-rbdnamer,文档标题为ceph-rbdnamer -- udev helper to name RBD devices;本册按手册目录项使用rbdnamer,实际安装名是否带ceph-前缀文档未明确。rbdmap unmap-all:正文 Description 中提到该用法,但 Synopsis 与 Options 未列出其语法与选项(Options 一节明确写 None)。crushtool的完整--set-...tunables 清单:文档只举例--set-choose-total-tries,并说明"更多--test相关选项见官方 man 页",未给出完整列表。ceph-syn的完整 workload 列表:文档明确注明"This is not a complete list"。osdmaptool --read的完整参数:文档只给出--read <file>与--read-pool <poolname>,未说明输出文件内容格式与可调参数。radosgw-admin各子命令的精确必需/可选参数矩阵:man 页只给出命令清单与选项清单,未逐命令标注哪些选项为必需(除文中明确写 Required 的几项,如mdlog trim需--shard-id)。- krbd 选项的"当前默认值":
rbd文档明确说明这些默认值由内核设置,可能取决于运行内核的版本,因此本册给出的默认值以文档标注为准,实际以内核为准。 ceph-volume全局选项--log-level/--log-path的取值:文档只列出选项名,未给出合法取值清单。