cephfs-journal-tool

目的

如果 CephFS 的日志损坏了,就需要专家介入,把文件系统恢复到工作状态。

cephfs-journal-tool 工具提供的功能可帮助专家们检查、修改、或从日志中提取数据。

Warning

此工具很危险,因为它会直接修改文件系统的内部数据结构。做好备份、多加小心、多寻求专家建议,如果不确定,就别运行此工具。

语法

  1. cephfs-journal-tool journal <inspect|import|export|reset>
  2. cephfs-journal-tool header <get|set>
  3. cephfs-journal-tool event <get|splice|apply> [filter] <list|json|summary>

此工具有三种模式: journalheaderevent ,分别操作日志内的整个日志、头部、和事件。

Journal 模式

这应该是你访问日志状态的起点。

  • inspect 报告日志的健康状况,它将鉴定存储日志中丢失或被篡改的对象。要注意的是,此过程不能鉴定事件本身的不一致,它仅鉴定存在且可解码的。
  • import 和 export 以一个稀疏文件格式读取和写入日志的二进制转储,用文件名作为最后一个参数。导出操作在日志损坏时可能不会可靠地运行,因为丢失了对象。
  • reset 删减日志,丢弃其内的任意信息。

实例: journal inspect

  1. # cephfs-journal-tool journal inspect
  2. Overall journal integrity: DAMAGED
  3. Objects missing:
  4. 0x1
  5. Corrupt regions:
  6. 0x400000-ffffffffffffffff

实例:日志的导入和导出

  1. # cephfs-journal-tool journal export myjournal.bin
  2. journal is 4194304~80643
  3. read 80643 bytes at offset 4194304
  4. wrote 80643 bytes at offset 4194304 to myjournal.bin

注:这是个稀疏文件,你可以在保留其稀疏特性的前提下,用 tarcSzfmyjournal.bin.tgzmyjournal.bin 进行压缩。

  1. # cephfs-journal-tool journal import myjournal.bin
  2. undump myjournal.bin
  3. start 4194304 len 80643
  4. writing header 200.00000000
  5. writing 4194304~80643
  6. done.

Note

明智的做法是,在开始修改前先用 journalexport<backupfile> 命令备份日志。

头模式

  • get 输出日志头部的当前内容。
  • set 修改头部的一个属性。可修改属性有 trimmed_pos 、 expire_pos 和 write_pos 。

实例: header get/set

  1. # cephfs-journal-tool header get
  2. { "magic": "ceph fs volume v011",
  3. "write_pos": 4274947,
  4. "expire_pos": 4194304,
  5. "trimmed_pos": 4194303,
  6. "layout": { "stripe_unit": 4194304,
  7. "stripe_count": 4194304,
  8. "object_size": 4194304,
  9. "cas_hash": 4194304,
  10. "object_stripe_unit": 4194304,
  11. "pg_pool": 4194304}}
  12.  
  13. # cephfs-journal-tool header set trimmed_pos 4194303
  14. Updating trimmed_pos 0x400000 -> 0x3fffff
  15. Successfully updated header.

事件模式

事件模式下可对日志内容进行详细的检查和操作。事件模式可操作日志中的所有或过滤出的事件。

cephfs-journal-toolevent 的参数由动作、可选过滤器参数、和输出模式组成。

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

动作:

  • get 从日志读出事件;
  • splice 擦除日志中的某些事件或区域;
  • apply 从事件中提取文件系统元数据、并试着应用到元数据存储中。

过滤器选项:

  • —range..[intend] 过滤从 begin (包含)到 end (不包含)之间的事件;
  • —path 按字符串过滤相关事件,此字符串包含在与这些事件相关的元数据中;
  • —inode 按字符串过滤事件,此字符串包含在与这些事件相关的元数据中;
  • —type 过滤此类型的事件;
  • —frag[.fragid] 过滤与此目录片段相关的事件;
  • —dname 过滤与目录片段内的指定 dentry 相关的事件,只能和 —frag 一起使用;
  • —client 过滤来自此客户端会话 ID 的事件。过滤器可用“与”操作组合使用,也就是最终结果为各过滤器的交集。

输出模式:

  • binary: 把各事件写入一个二进制文件,放入 —path 指定的目录;
  • json: 把所有事件组织为序列化的 JSON 对象列表,并写入单个文件;
  • summary: 把人类可读的事件汇总写到标准输出;
  • list: 写出一个人类可读的摘要列表,其中包含各事件的类型、以及此事件所影响的文件路径。

实例:事件模式

  1. # cephfs-journal-tool event get json --path output.json
  2. Wrote output to JSON file 'output.json'
  3.  
  4. # cephfs-journal-tool event get summary
  5. Events by type:
  6. NOOP: 2
  7. OPEN: 2
  8. SESSION: 2
  9. SUBTREEMAP: 1
  10. UPDATE: 43
  11.  
  12. # cephfs-journal-tool event get list
  13. 0x400000 SUBTREEMAP: ()
  14. 0x400308 SESSION: ()
  15. 0x4003de UPDATE: (setattr)
  16. /
  17. 0x40068b UPDATE: (mkdir)
  18. diralpha
  19. 0x400d1b UPDATE: (mkdir)
  20. diralpha/filealpha1
  21. 0x401666 UPDATE: (unlink_local)
  22. stray0/10000000001
  23. diralpha/filealpha1
  24. 0x40228d UPDATE: (unlink_local)
  25. diralpha
  26. stray0/10000000000
  27. 0x402bf9 UPDATE: (scatter_writebehind)
  28. stray0
  29. 0x403150 UPDATE: (mkdir)
  30. dirbravo
  31. 0x4037e0 UPDATE: (openc)
  32. dirbravo/.filebravo1.swp
  33. 0x404032 UPDATE: (openc)
  34. dirbravo/.filebravo1.swpx
  35.  
  36. # cephfs-journal-tool event get --path /filebravo1 list
  37. 0x40785a UPDATE: (openc)
  38. dirbravo/filebravo1
  39. 0x4103ee UPDATE: (cap update)
  40. dirbravo/filebravo1
  41.  
  42. # cephfs-journal-tool event splice --range 0x40f754..0x410bf1 summary
  43. Events by type:
  44. OPEN: 1
  45. UPDATE: 2
  46.  
  47. # cephfs-journal-tool event apply --range 0x410bf1.. summary
  48. Events by type:
  49. NOOP: 1
  50. SESSION: 1
  51. UPDATE: 9
  52.  
  53. # cephfs-journal-tool event get --inode=1099511627776 list
  54. 0x40068b UPDATE: (mkdir)
  55. diralpha
  56. 0x400d1b UPDATE: (mkdir)
  57. diralpha/filealpha1
  58. 0x401666 UPDATE: (unlink_local)
  59. stray0/10000000001
  60. diralpha/filealpha1
  61. 0x40228d UPDATE: (unlink_local)
  62. diralpha
  63. stray0/10000000000
  64.  
  65. # cephfs-journal-tool event get --frag=1099511627776 --dname=filealpha1 list
  66. 0x400d1b UPDATE: (mkdir)
  67. diralpha/filealpha1
  68. 0x401666 UPDATE: (unlink_local)
  69. stray0/10000000001
  70. diralpha/filealpha1
  71.  
  72. # cephfs-journal-tool event get binary --path bin_events
  73. Wrote output to binary files in directory 'bin_events'