注意

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

cephfs-journal-tool

目的

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

The 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>

该工具以三种模式运行:journal, headerevent,分别表示整个日志、头部和日志内的事件。

日志模式

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

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

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

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

示例:日志检查

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

示例:日志导入/导出

# 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.

Note

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

头部模式

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

  • set修改头部的一个属性。允许的属性是trimmed_pos, expire_pos, write_pospool_id.

示例:头部获取/设置

# 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.

事件模式

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

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

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

操作:

  • get从日志中读取事件

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

  • recover_dentries从日志中恢复 dentries。它执行选择性的离线重播,只读取 dentries 并如果它们的版本大于当前后备存储中的版本,则将它们写入后备存储。

过滤:

  • --range <int begin>..[int end]只包括 begin(包含)到 end(不包含)范围内的活动

  • --path <path substring>只包括引用包含指定字符串的元数据的活动

  • --inode <int>只包括引用包含指定 inode 的元数据的活动

  • --type <type string>只包括此类型的事件

  • --frag <ino>[.frag id]只包括引用此目录片段的活动

  • --dname <string>只包括引用目录片段中的此命名 dentry 的活动(只能与--frag

  • --client <int>结合使用:只包括此客户端会话 ID 的活动

过滤器可以基于 AND 基础组合(即每个过滤器的事件交集)。

输出模式:

  • binary: 将每个事件作为二进制文件写入,文件夹名称由--path

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

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

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

示例:事件模式

# 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'

Options

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

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

由 Ceph 基金会带给您

Ceph 文档是一个社区资源,由非盈利的 Ceph 基金会资助和托管Ceph Foundation. 如果您想支持这一点和我们的其他工作,请考虑加入现在加入.