注意

本文档适用于 Ceph 的开发版本。

cephfs-journal-tool

目的

如果 CephFS 日志(journal)受损,可能需要专家干预才能将文件系统恢复到工作状态。

cephfs-journal-tool 实用程序提供功能,帮助专家检查、修改和提取日志中的数据。

警告

此工具很危险,因为它直接修改文件系统的内部数据结构。请务必备份、谨慎操作并寻求专家建议。如果您不确定,请勿运行此工具。作为预防措施,cephfs-journal-tool 不适用于活动文件系统。

语法

cephfs-journal-tool [options] journal <inspect|import|export|reset>
cephfs-journal-tool [options] header <get|set> <trimmed_pos|expire_pos|write_pos|pool_id> <value>
cephfs-journal-tool [options] event <get|splice|recover_dentries> [filter] <list|json|summary|binary>

该工具以三种模式运行:journalheaderevent,分别表示整个日志、日志头以及日志中的事件。

Journal 模式

这应该是您评估日志状态的起点。

  • inspect 报告日志的健康状况。这将识别存储日志中缺失的对象或损坏。请注意,这不会识别事件本身的不一致性,而只会识别事件是否存在且可解码。

  • importexport 以稀疏文件格式读写日志的二进制转储。将文件名作为最后一个参数传递。导入操作检查导入日志的 FSID 是否与在线集群 FSID 匹配。使用 --force 跳过 FSID 检查。导出操作对于损坏(缺少对象)的日志可能无法可靠工作。

  • reset 截断日志,丢弃其中的所有信息。使用 --force 执行硬重置,而不尝试从磁盘恢复。

示例:journal inspect

# cephfs-journal-tool journal inspect
Overall journal integrity: DAMAGED
Objects missing:
  0x1
Corrupt regions:
  0x400000-ffffffffffffffff

示例:Journal import/export

# cephfs-journal-tool journal export myjournal.bin
journal is 4194304~80643
read 80643 bytes at offset 4194304
wrote 80643 bytes at offset 4194304 to myjournal.bin
NOTE: this is a _sparse_ file; you can
    $ tar cSzf myjournal.bin.tgz myjournal.bin
      to efficiently compress it while preserving sparseness.

# cephfs-journal-tool journal import myjournal.bin
undump myjournal.bin
start 4194304 len 80643
writing header 200.00000000
 writing 4194304~80643
done.

注意

在进行任何进一步操作之前,建议使用 journal export <backup file> 命令创建日志备份。

Header 模式

  • get 输出日志头的当前内容

  • set 修改头的属性。允许的属性包括 trimmed_posexpire_poswrite_pospool_id

示例:header get/set

# cephfs-journal-tool header get
{ "magic": "ceph fs volume v011",
  "write_pos": 4274947,
  "expire_pos": 4194304,
  "trimmed_pos": 4194303,
  "stream_format": 1,
  "layout": { "stripe_unit": 4194304,
      "stripe_count": 1,
      "object_size": 4194304,
      "pool_id": 2,
      "pool_ns": ""}}

# cephfs-journal-tool header set trimmed_pos 4194303
Updating trimmed_pos 0x400000 -> 0x3fffff
Successfully updated header.

Event 模式

事件模式允许对日志内容进行详细检查和操作。事件模式可以对日志中的所有事件进行操作,也可以应用过滤器。

cephfs-journal-tool event 后面的参数包括一个动作、可选的过滤器参数和输出模式

cephfs-journal-tool event <action> [filter] <output>

动作

  • get 从日志中读取事件

  • splice 擦除日志中的事件或区域

  • recover_dentries 从日志中恢复目录项(dentries)。它执行选择性离线重放,仅读取目录项并将其写入后端存储,如果其版本大于后端存储中的当前版本。

过滤

  • --range <int begin>..[int end] 仅包含范围 begin(包含)到 end(不包含)内的事件

  • --path <path substring> 仅包含引用包含指定字符串的元数据的事件

  • --inode <int> 仅包含引用包含指定 inode 的元数据的事件

  • --type <type string> 仅包含此类型的事件

  • --frag <ino>[.frag id] 仅包含引用此目录片段的事件

  • --dname <string> 仅包含引用目录片段中此命名目录项的事件(只能与 --frag 结合使用)

  • --client <int> 仅包含来自此客户端会话 ID 的事件

过滤器可以按 AND 方式组合(即,仅包含来自每个过滤器的事件交集)。

输出模式

  • binary: 将每个事件写入一个二进制文件,位于由 --path 控制的文件夹中

  • json: 将所有事件写入由 --path 指定的单个文件,作为 JSON 序列化的对象列表。

  • summary: 将读取事件的人类可读摘要写入标准输出

  • list: 写入每个人类可读的简洁列表,包含每个事件的类型以及该事件影响的文件路径。

示例:event mode

# cephfs-journal-tool event get json --path output.json
Wrote output to JSON file 'output.json'

# cephfs-journal-tool event get summary
Events by type:
  NOOP: 2
  OPEN: 2
  SESSION: 2
  SUBTREEMAP: 1
  UPDATE: 43

# cephfs-journal-tool event get list
0x400000 SUBTREEMAP:  ()
0x400308 SESSION:  ()
0x4003de UPDATE:  (setattr)
  /
0x40068b UPDATE:  (mkdir)
  diralpha
0x400d1b UPDATE:  (mkdir)
  diralpha/filealpha1
0x401666 UPDATE:  (unlink_local)
  stray0/10000000001
  diralpha/filealpha1
0x40228d UPDATE:  (unlink_local)
  diralpha
  stray0/10000000000
0x402bf9 UPDATE:  (scatter_writebehind)
  stray0
0x403150 UPDATE:  (mkdir)
  dirbravo
0x4037e0 UPDATE:  (openc)
  dirbravo/.filebravo1.swp
0x404032 UPDATE:  (openc)
  dirbravo/.filebravo1.swpx

# cephfs-journal-tool event get --path filebravo1 list
0x40785a UPDATE:  (openc)
  dirbravo/filebravo1
0x4103ee UPDATE:  (cap update)
  dirbravo/filebravo1

# cephfs-journal-tool event splice --range 0x40f754..0x410bf1 summary
Events by type:
  OPEN: 1
  UPDATE: 2

# cephfs-journal-tool event recover_dentries summary
Events by type:
  LID: 1
  SUBTREEMAP: 1
Errors: 0

# cephfs-journal-tool event get --inode=1099511627776 list
0x40068b UPDATE:  (mkdir)
  diralpha
0x400d1b UPDATE:  (mkdir)
  diralpha/filealpha1
0x401666 UPDATE:  (unlink_local)
  stray0/10000000001
  diralpha/filealpha1
0x40228d UPDATE:  (unlink_local)
  diralpha
  stray0/10000000000

# cephfs-journal-tool event get --frag=1099511627776 --dname=filealpha1 list
0x400d1b UPDATE:  (mkdir)
  diralpha/filealpha1
0x401666 UPDATE:  (unlink_local)
  stray0/10000000001
  diralpha/filealpha1

# cephfs-journal-tool event get binary --path bin_events
Wrote output to binary files in directory 'bin_events'

选项

  • --rank=<filesystem>:{mds-rank|all} 用于指定文件系统、MDS 级别或所有级别。

  • --journal=<mdlog|purge_queue> 日志类型。默认值为 mdlog,这是唯一支持事件模式的选项。当使用 purge_queue 时,日志扫描器会创建一个 PurgeItem 对象并将其添加到 EventMap 中进行处理。

由 Ceph 基金会为您呈现

Ceph 文档是由非营利性 Ceph 基金会 资助和托管的社区资源。如果您希望支持这项工作和我们的其他努力,请考虑 立即加入