Ceph 设备发现指南:详解 `ceph-volume lvm list` 命令的使用、输出格式与实现原理
Ceph 设备发现指南详解ceph-volume lvm list命令的使用、输出格式与实现原理【免费下载链接】cephCeph is a distributed object, block, and file storage platform项目地址: https://gitcode.com/gh_mirrors/ce/cephceph-volume lvm list是 Ceph 卷管理工具ceph-volume中用于**发现并列出与 Ceph 集群关联的所有设备逻辑卷与物理磁盘**的核心子命令。本文以 Ceph 官方文档 doc/ceph-volume/lvm/list.rst 为骨架结合仓库中 listing.py 与 lvm.py API 的源码实现完整讲解该命令的两种报告模式、pretty/json两种输出格式、LVM 标签约定与设备名同步机制帮助你快速定位 OSD 与设备之间的对应关系并在脚本化运维中正确解析输出。命令定位发现哪些设备属于 Cephceph-volume lvm list属于ceph-volume lvm子命令体系完整的子命令列表见 doc/ceph-volume/lvm/index.rst。它列出系统中可能与 Ceph 集群关联的所有设备逻辑卷和物理设备前提是这些设备携带了足够的元数据LVM 标签以供发现。与已废弃的ceph-disk不同该命令只展示与 Ceph 关联的设备凡是未被 Ceph 使用的设备一律不会出现在输出中。从源码看这一过滤逻辑位于 listing.py 的create_report方法遍历api.get_lvs()返回的每一个逻辑卷调用api.is_ceph_device(lv)判断其是否携带 Ceph 标签不满足条件的 LV 直接continue跳过。输出按OSD ID分组每个 OSD 一个 osd.N 段落这与ceph-disk按设备路径组织的输出风格截然不同便于直接回答某个 OSD 由哪些设备组成。命令行选项原文档给出的唯一命令行选项为选项说明默认值--format输出格式可选json或prettypretty人类可读的分组格式此外该命令还接受一个可选的位置参数DEVICE路径用于单设备报告见下文。这一参数定义在 listing.py 的main方法 中nargs?表示可省略帮助文本明确说明其取值可以是vg/lv形式的逻辑卷路径也可以是/dev/sda1这样的设备路径。完整报告Full Reporting一览集群全部关联设备不带任何位置参数时ceph-volume lvm list输出系统中所有与 Ceph 关联的设备与逻辑卷。执行ceph-volume lvm list两个 OSD 的pretty输出示例一个 OSD 使用 LV 作为 journal另一个使用物理设备作为 journal如下 osd.1 [journal] /dev/journals/journal1 journal uuid C65n7d-B1gy-cqX3-vZKY-ZoE0-IEYM-HnIJzs osd id 1 cluster fsid ce454d91-d748-4751-a318-ff7f7aa18ffd type journal osd fsid 661b24f8-e062-482b-8110-826ffe7f13fa data uuid SlEgHe-jX1H-QBQk-Sce0-RUls-8KlY-g8HgcZ journal device /dev/journals/journal1 data device /dev/test_group/data-lv2 devices /dev/sda [data] /dev/test_group/data-lv2 journal uuid C65n7d-B1gy-cqX3-vZKY-ZoE0-IEYM-HnIJzs osd id 1 cluster fsid ce454d91-d748-4751-a318-ff7f7aa18ffd type data osd fsid 661b24f8-e062-482b-8110-826ffe7f13fa data uuid SlEgHe-jX1H-QBQk-Sce0-RUls-8KlY-g8HgcZ journal device /dev/journals/journal1 data device /dev/test_group/data-lv2 devices /dev/sdb osd.0 [data] /dev/test_group/data-lv1 journal uuid cd72bd28-002a-48da-bdf6-d5b993e84f3f osd id 0 cluster fsid ce454d91-d748-4751-a318-ff7f7aa18ffd type data osd fsid 943949f0-ce37-47ca-a33c-3413d46ee9ec data uuid TUpfel-Q5ZT-eFph-bdGW-SiNW-l0ag-f5kh00 journal device /dev/sdd1 data device /dev/test_group/data-lv1 devices /dev/sdc [journal] /dev/sdd1 PARTUUID cd72bd28-002a-48da-bdf6-d5b993e84f3f输出字段解读pretty模式下每个设备条目包含以下字段type设备在 OSD 中扮演的角色如data数据、journal日志结合 tag-api 文档 可知bluestore 后端还可能出现db、wal、block等类型osd id该设备所属的 OSD 编号cluster fsidCeph 集群的文件系统 IDUUIDosd fsidOSD 自身的 UUIDjournal uuid/data uuid对应逻辑卷或分区的 UUIDjournal device/data device设备路径devices组成该逻辑卷的物理设备列表。关于devices字段原文档特别指出由于 LVM 允许一个逻辑卷横跨多块物理磁盘因此在pretty模式下该值为逗号分隔的字符串而在json模式下则为数组。这一点在源码 listing.py 的pretty_report中有直接体现打印时使用,.join(device[devices])拼接而在create_report中该字段通过 lvm.py 的get_pvs遍历物理卷按pv.lv_uuid lv.lv_uuid匹配归属原样以列表存入报告。注意pretty输出中的标签名是经过可读化处理的。例如osd id在 LVM 元数据中实际以ceph.osd_id标签存储readable_tag函数将ceph.osd_id拆分为osd id。LVM 标签的完整命名约定见 LVM Tag API 文档所有标签统一使用ceph.tag nametag value的命名空间前缀。单设备报告Single Reporting按需查询指定设备单设备报告接受设备路径或逻辑卷作为位置参数三种输入形式如下1. 按逻辑卷查询必须使用卷组名/逻辑卷名逻辑卷必须同时给出卷组vg名和逻辑卷lv名ceph-volume lvm list test_group/data-lv2输出 osd.1 [data] /dev/test_group/data-lv2 journal uuid C65n7d-B1gy-cqX3-vZKY-ZoE0-IEYM-HnIJzs osd id 1 cluster fsid ce454d91-d748-4751-a318-ff7f7aa18ffd type data osd fsid 661b24f8-e062-482b-8110-826ffe7f13fa data uuid SlEgHe-jX1H-QBQk-Sce0-RUls-8KlY-g8HgcZ journal device /dev/journals/journal1 data device /dev/test_group/data-lv2 devices /dev/sdc2. 按物理设备路径查询必须使用完整路径裸磁盘含分区必须使用完整设备路径ceph-volume lvm list /dev/sdd1输出 osd.0 [journal] /dev/sdd1 PARTUUID cd72bd28-002a-48da-bdf6-d5b993e84f3f3. 按 OSD ID 查询从源码 listing.py 的single_report可以看到参数会被按以下规则分派参数全为数字如0→ 视为 OSD ID调用 get_lvs_from_osd_id 按ceph.osd_id标签查询该 OSD 下全部 LV参数以/开头→ 视为块设备路径调用 get_lvs_from_path先按设备路径查询物理卷上关联的 LV若没有命中再退化为按 LV 的path过滤覆盖/dev/vg/lv、/dev/mapper/形式其余形式 → 按vg_name/lv_name拆解调用 get_single_lv 精确匹配匹配到多个 LV 时该方法会抛出RuntimeError以避免歧义。值得注意的边界情况当按路径查询未命中任何 Ceph LV 时single_report还会尝试把该路径当作非 LVM 的 journal/wal/db 物理设备来匹配——它会反向遍历所有 LV 的ceph.type_device标签若某标签值等于所查路径则将该 LV 关联的 OSD 与该物理设备一并报告对应源码 L169-L179 的 fallback 逻辑。这正是上文/dev/sdd1只显示PARTUUID一个字段的原因它本身不是 LVM 卷其身份信息全部保存在关联的 data LV 标签中。json 输出面向自动化与脚本解析使用--formatjson时命令会输出设备在 LVM 元数据中存储的全部信息包括原始标签且不做任何可读化改写——标签名保留ceph.osd_id等原始形式。完整报告和单设备查询都支持 json 模式。以单个逻辑卷为例ceph-volume lvm list --formatjson test_group/data-lv1{ 0: [ { devices: [/dev/sda], lv_name: data-lv1, lv_path: /dev/test_group/data-lv1, lv_tags: ceph.cluster_fsidce454d91-d748-4751-a318-ff7f7aa18ffd,ceph.data_device/dev/test_group/data-lv1,ceph.data_uuidTUpfel-Q5ZT-eFph-bdGW-SiNW-l0ag-f5kh00,ceph.journal_device/dev/sdd1,ceph.journal_uuidcd72bd28-002a-48da-bdf6-d5b993e84f3f,ceph.osd_fsid943949f0-ce37-47ca-a33c-3413d46ee9ec,ceph.osd_id0,ceph.typedata, lv_uuid: TUpfel-Q5ZT-eFph-bdGW-SiNW-l0ag-f5kh00, name: data-lv1, path: /dev/test_group/data-lv1, tags: { ceph.cluster_fsid: ce454d91-d748-4751-a318-ff7f7aa18ffd, ceph.data_device: /dev/test_group/data-lv1, ceph.data_uuid: TUpfel-Q5ZT-eFph-bdGW-SiNW-l0ag-f5kh00, ceph.journal_device: /dev/sdd1, ceph.journal_uuid: cd72bd28-002a-48da-bdf6-d5b993e84f3f, ceph.osd_fsid: 943949f0-ce37-47ca-a33c-3413d46ee9ec, ceph.osd_id: 0, ceph.type: data }, type: data, vg_name: test_group } ] }json 输出的结构说明顶层是一个以 OSD ID 为键的对象字符串形式的0值为该 OSD 关联设备的数组每个设备对象包含 LV 的常规属性lv_name、lv_path、lv_uuid、vg_name、type以及devices物理设备数组和tags结构化标签对象lv_tags是 LVM 原始标签的逗号分隔字符串与tags对象内容等价只是保持了 LVM 元数据的原始呈现。json 输出由 listing.py 的list方法 直接json.dumps(report, indent4, sort_keysTrue)生成。源码注释揭示了一个重要的工程细节当报告为空没有任何 Ceph 设备时json 模式依然返回退出码 0而不是报错。这是因为该输出常被 ceph-ansible 等自动化系统消费调用方只需读取 JSON 内容判断即可非零退出码反而会带来不必要的噪音相比之下pretty模式在无结果时会抛出No valid Ceph lvm devices found并非零退出raise SystemExit更适合交互式排查。另外json 模式下devices字段是数组而非逗号拼接tags中保留了ceph.osd_id0这类原始标签键与pretty模式中osd id的可读形式形成鲜明对比——两者服务于不同的消费场景。信息同步机制设备名变化时如何保持准确在执行任何列表操作之前ceph-volume lvm list会先查询 LVM API确保可能被使用的物理设备没有发生命名漂移。为什么需要这一步因为像/dev/sda1这类非持久化设备名在重启或硬件枚举顺序变化后可能变成/dev/sdb1如果直接使用旧名报告就会指向错误的设备。检测原理PARTUUID检测得以实现的关键在于PARTUUID被作为元数据的一部分保存在 data 逻辑卷的 LVM 标签中。即使 journal 是物理设备非 LVM 卷其PARTUUID信息也会存储在与之关联的 data LV 上这正是上文/dev/sdd1条目中PARTUUID字段的来源。具体的同步流程为报告生成前工具通过blkid按PARTUUID反查设备的当前真实名称如果发现当前名称与标签中记录的名称不一致例如/dev/sda1已变为/dev/sdb1则更新对应 LVM 标签使后续报告使用刷新后的新名称。从源码结构看这一按需刷新的行为与 lvm.py API 中围绕 LV 标签读写、blkid/PARTUUID查询的工具函数相互配合保证list报告始终反映设备的最新命名避免运维人员被过时的设备路径误导。源码视角list子命令的完整调用链ceph-volume lvm list的入口在 src/ceph-volume/ceph_volume/devices/lvm/main.py 的mapper字典中list映射到listing.List类。整个执行流程可概括为main.py的LVM.main()通过terminal.dispatch(self.mapper, self.argv)将list参数分发给listing.ListList.main()解析参数device位置参数与--format选项List.list()判断是否传入设备参数分别调用single_report()或full_report()create_report()遍历 LV先做 Ceph 关联过滤is_ceph_device再按 OSD ID 分组、补充物理设备devices字段、追加非 LVM 的 journal/wal/db 物理设备条目最后根据--format走json.dumpsjson 模式或pretty_report()pretty 模式内含标签名可读化与osd.%s标题渲染。其中full_report实际执行的是create_report(api.get_lvs())即全量扫描系统 LV而direct_report()是一个不带 CLI 参数解析的便捷入口供其他非 CLI 消费者直接获取完整报告无需构造参数对象。依赖前提list能正确工作有一个前提相关 LV 必须已经通过ceph-volume lvm prepare/create或batch预先打上所需标签。只有携带了ceph.cluster_fsid、ceph.osd_id、ceph.type等标签的 LV 才会被is_ceph_device识别为 Ceph 设备这与 doc/dev/ceph-volume/lvm.rst 中标签是设备发现的唯一依据的设计一脉相承。常用的ceph.*标签包括typedata/journal/osd 等、cluster_fsid、osd_fsid、osd_id、data_device/data_uuid、journal_device/journal_uuid以及 bluestore 后端的block_device/block_uuid、db_device/db_uuid、wal_device/wal_uuid和encryptedLUKS 加密标记、vdo等。实用建议与常见场景快速核对 OSD 与磁盘的对应关系执行ceph-volume lvm list按 osd.N 分段阅读即可确认每个 OSD 的数据盘、日志盘分别落在哪些物理设备上脚本化采集设备元数据使用ceph-volume lvm list --formatjson配合jq按 OSD ID 聚合tags与devices数组注意空结果时退出码仍为 0需自行判断 JSON 是否为空排查设备名漂移当怀疑/dev/sdX名称变化导致 OSD 激活失败时优先运行list触发 PARTUUID 同步并观察devices字段是否已更新为新路径定位单一设备归属不确定某个裸盘属于哪个 OSD 时用ceph-volume lvm list /dev/sdX1直接查询输出中的osd id与type字段会给出答案与相关命令配合list只读不改动设备状态是排查问题的安全第一步确认归属后再结合 zap.rst销毁设备、migrate.rst迁移 journal/db/wal等命令执行变更操作。小结ceph-volume lvm list以 LVM 标签为核心把发现设备 → 按 OSD 分组 → 输出报告三个环节串成一条清晰的链路pretty模式适合人工排障json模式适合自动化消费单设备查询支持vg/lv、/dev/xxx与 OSD ID 三种输入形式而基于PARTUUID的命名同步机制保证了结果始终与设备真实状态一致。理解其输出字段与标签约定是高效管理 Ceph OSD 设备、排查启动与挂载问题的关键基本功。【免费下载链接】cephCeph is a distributed object, block, and file storage platform项目地址: https://gitcode.com/gh_mirrors/ce/ceph创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

相关新闻

MCP Gateway 的埋点统计,用走 TaoToken 的 Codex 做瓶颈分析

MCP Gateway 的埋点统计,用走 TaoToken 的 Codex 做瓶颈分析

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/9/21 16:29:29 阅读更多 →
DLSS Swapper 上手指南:三步完成 DLSS 升级与一键回滚

DLSS Swapper 上手指南:三步完成 DLSS 升级与一键回滚

DLSS Swapper 上手指南:三步完成 DLSS 升级与一键回滚 【免费下载链接】dlss-swapper 项目地址: https://gitcode.com/GitHub_Trending/dl/dlss-swapper 我给一款只带 DLSS 2.3 的游戏换上了 3.7,帧率有肉眼可见的变化,画面比旧版更扎…

2026/9/21 16:29:29 阅读更多 →
ccusage 接入 Grok Build CLI:会话日志读取、聚焦报告与成本核算全指南

ccusage 接入 Grok Build CLI:会话日志读取、聚焦报告与成本核算全指南

AI 应用CLI开发工具 【免费下载链接】ccusage npx ccusage 项目地址: https://gitcode.com/gh_mirrors/cc/ccusage 点击查看 免费下载 本文以 ccusage 的 Grok Build CLI 数据源适配器为主线,讲解它如何从本地 ~/.grok 目录读取 updates.jsonl 会话日志…

2026/9/21 16:29:29 阅读更多 →

最新新闻

AI前端面试核心:TypeScript+流式处理+SSE实战指南

AI前端面试核心:TypeScript+流式处理+SSE实战指南

1. 这不是鸡汤,是9月AI前端面试现场的真实切片“最后提醒一次,9月的AI前端面试不用太老实”——这句话不是标题党,是我上个月连续陪跑6场一线大厂和明星创业公司AI方向前端终面后,把录音逐字稿重听三遍、把面试官追问的27个问题归…

2026/9/21 17:42:23 阅读更多 →
深拷贝与浅拷贝全解析:从内存机制到工程实践避坑指南

深拷贝与浅拷贝全解析:从内存机制到工程实践避坑指南

别小看“深拷贝”和“浅拷贝”这六个字,我见过不少写了三五年业务的前端,一到对象复制就踩坑。有的是表单提交前改了数据,结果上一页的状态跟着变了;有的复制一份配置对象想改着玩,结果把全局配置给改了;还…

2026/9/21 17:42:23 阅读更多 →
从Vuex到Pinia:Vue状态管理的实战迁移、模块化拆分与持久化方案

从Vuex到Pinia:Vue状态管理的实战迁移、模块化拆分与持久化方案

如果有人问我:"Vue 项目里的状态管理,现在到底选 Vuex 还是 Pinia?"我的回答一向很干脆:新项目直接 Pinia,老项目也值得花时间迁过来。去年我把一个中型后台管理系统从 Vuex 整体迁到 Pinia,前后…

2026/9/21 17:42:23 阅读更多 →
PHP接入支付宝沙箱支付:从零到跑通全流程实战

PHP接入支付宝沙箱支付:从零到跑通全流程实战

咱们直接聊干货。这段时间正好帮一个朋友的项目把支付模块从“只在本地瞎点按钮”做到了“真正跑通支付宝沙箱全流程”,整个过程中踩了不少坑,也把支付宝开放平台的文档翻来覆去啃了几遍。这篇博文就把我当时从零开始接入支付宝沙箱支付的完整过程整理出…

2026/9/21 17:42:23 阅读更多 →
优之良衫选型指南:5个维度拆解最佳实践

优之良衫选型指南:5个维度拆解最佳实践

优之良衫选型指南:5个维度拆解最佳实践 凌晨两点,线上服务挂了,你盯着控制台里那一片红色的 StackTrace ,满屏的 NullPointerException 和 IndexOutOfBoundsException…

2026/9/21 17:42:23 阅读更多 →
SpringBoot启动流程深度解析与性能优化实践

SpringBoot启动流程深度解析与性能优化实践

1. SpringBoot启动过程全景透视当我们在IDE中点击运行那个标注了SpringBootApplication的main()方法时,背后究竟发生了什么?这个看似简单的启动动作,实际上触发了一个精密的连锁反应机制。作为Java生态中最主流的应用框架,SpringB…

2026/9/21 17:41:22 阅读更多 →

日新闻

agents-generator 决策矩阵全解析:从项目检测到 AGENTS.md 规则生成的 16 步判定流程

agents-generator 决策矩阵全解析:从项目检测到 AGENTS.md 规则生成的 16 步判定流程

agents-generator 决策矩阵全解析:从项目检测到 AGENTS.md 规则生成的 16 步判定流程 【免费下载链接】agentic-awesome-skills AAS Core is the local, agent-first control plane for complete catalog discovery, agent-owned selection, stack validation, and …

2026/9/21 0:00:01 阅读更多 →
gin-vue-admin 前端工具函数全景指南:src/utils 复用规范与源码级解析

gin-vue-admin 前端工具函数全景指南:src/utils 复用规范与源码级解析

gin-vue-admin 前端工具函数全景指南:src/utils 复用规范与源码级解析 【免费下载链接】gin-vue-admin 🚀ViteVue3Gin拥有AI辅助的基础开发平台,企业级业务AI开发解决方案,内置mcp辅助服务,内置skills管理,…

2026/9/21 0:00:01 阅读更多 →
Wox 全功能插件开发实战指南:基于 Python / Node.js 宿主与 WebSocket 的持久化插件体系

Wox 全功能插件开发实战指南:基于 Python / Node.js 宿主与 WebSocket 的持久化插件体系

桌面应用AI 应用插件系统 【免费下载链接】Wox A cross-platform launcher that simply works 项目地址: https://gitcode.com/gh_mirrors/wo/Wox 点击查看 免费下载 全功能插件(Full-featured Plugin)是 Wox 三类插件实现方式中能力最完整的…

2026/9/21 0:00:01 阅读更多 →

周新闻

Flutter for OpenHarmony游戏卡片渐变背景实战:从原理到性能优化

Flutter for OpenHarmony游戏卡片渐变背景实战:从原理到性能优化

直接铺开项目本身吧。这几个月我一直在折腾一件事:用Flutter给OpenHarmony做一款游戏集合类的App,说白了就是把若干小游戏塞进一个壳里,用统一入口分发。这个方向本身不算新鲜,真正让我花了不少心思的,是首页那堆游戏卡…

2026/9/21 3:13:20 阅读更多 →
Word表格编号全攻略:从列表编号到题注交叉引用

Word表格编号全攻略:从列表编号到题注交叉引用

写Word文档,最让人头疼的往往是那些“看起来不起眼”的小问题。比如表格编号这事:今天在表后面多加了两个空白行,明天给客户交稿前发现整个章节的编号全部错位,光是挨个改序号就能耗掉大半个下午。我前阵子帮人整理一份上百页的技…

2026/9/21 2:19:36 阅读更多 →
从第一个站到第二个站:独立开发者的静态网站选型与落地实践

从第一个站到第二个站:独立开发者的静态网站选型与落地实践

1. 项目概述1.1 核心需求解析做独立开发者这几年,说实话,第一个网站上线的那天晚上我兴奋得没睡着。但等它跑了半年,流量惨淡、功能臃肿、代码自己都懒得看第二遍之后,我才慢慢琢磨明白一个道理:第一个网站是练手&…

2026/9/21 4:51:05 阅读更多 →

月新闻

持续集成 流水线自动化与 声明式交付 实践:原型怎样变成可用功能

持续集成 流水线自动化与 声明式交付 实践:原型怎样变成可用功能

持续集成 流水线自动化与 声明式交付 实践:原型怎样变成可用功能分类:[AI/大模型]细分主题:AI 增强型 CI/CD 流水线自动化与 GitOps 实践:Agent 工作流、工具调用与任务拆解:从原型到生产的验收清单很多团队在尝试用大…

2026/9/21 15:36:51 阅读更多 →
容器编排 生产环境运维与排障实战:复盘记录怎样真正派上用场

容器编排 生产环境运维与排障实战:复盘记录怎样真正派上用场

容器编排 生产环境运维与排障实战:复盘记录怎样真正派上用场分类:[工程技术]细分主题:Kubernetes 生产环境运维与排障实战:可复制的项目复盘模板与决策记录大部分团队的事故复盘报告,最后都变成了躺在 Confluence 或钉…

2026/9/21 15:36:51 阅读更多 →
容器 容器化技术与镜像安全管理:核心链路应该先拆哪一步

容器 容器化技术与镜像安全管理:核心链路应该先拆哪一步

容器 容器化技术与镜像安全管理:核心链路应该先拆哪一步分类:[工程技术]细分主题:Docker 容器化技术与镜像安全管理:核心链路的逐步实现与关键代码取舍面对一个积累了五六年历史包袱的单体架构应用(包含 Web 接口、后台…

2026/9/19 23:35:34 阅读更多 →