注意
本文档适用于 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>
该工具以三种模式运行:journal、header 和 event,分别表示整个日志、日志头以及日志中的事件。
Journal 模式
这应该是您评估日志状态的起点。
inspect报告日志的健康状况。这将识别存储日志中缺失的对象或损坏。请注意,这不会识别事件本身的不一致性,而只会识别事件是否存在且可解码。import和export以稀疏文件格式读写日志的二进制转储。将文件名作为最后一个参数传递。导入操作检查导入日志的 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_pos、expire_pos、write_pos和pool_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 中进行处理。