logdump
您可以使用来自debugfs 的logdump 命令显示有关文件系统日志的信息。
例如,sudo debugfs -R 'logdump -S' /dev/sda3 产生
Journal features: journal_incompat_revoke journal_checksum_v3
Total journal size: 512M
Total journal blocks: 131072
Max transaction length: 131072
Fast commit length: 0
Journal sequence: 0x004bd0ae
Journal start: 109412
Journal checksum type: crc32c
Journal checksum: 0x157eebb7
Journal starts at block 109412, transaction 4968622
Found expected sequence 4968622, type 5 (revoke table) at block 109412
Found expected sequence 4968622, type 1 (descriptor block) at block 109413
Found expected sequence 4968622, type 2 (commit block) at block 109419
Found expected sequence 4968623, type 1 (descriptor block) at block 109420
Found expected sequence 4968623, type 2 (commit block) at block 109422
Found expected sequence 4968624, type 1 (descriptor block) at block 109423
Found expected sequence 4968624, type 2 (commit block) at block 109425
Found expected sequence 4968625, type 1 (descriptor block) at block 109426
// rest omitted
我意识到debugfs 不是 API,但它可以访问日志。
读取日志的字节
要获取日志的原始字节,您可以再次使用debugfs。它的cat 命令接受一个inode 编号并打印inode 指向的地址的数据。
假设期刊的inode号为8:
sudo debugfs -R 'cat <8>' /dev/sda3 | hexdump -C
这会以十六进制打印日志的字节。您应该在开头看到magic number of the journal's format,jbd2:
c0 3b 39 98
日志使用big-endian byte order,而 ext4 使用 little-endian。
来自The Sleuth Kit 的jls 也会打印有关期刊的信息。
例如,sudo jls /dev/sda3 产生
JBlk Description
0: Superblock (seq: 0)
sb version: 4
sb version: 4
sb feature_compat flags 0x00000000
sb feature_incompat flags 0x00000011
JOURNAL_REVOKE
sb feature_ro_incompat flags 0x00000000
1: Unallocated Commit Block (seq: 4936768, sec: 1613471034.3277057792)
2: Unallocated Descriptor Block (seq: 4936769)
3: Unallocated FS Block 42991838
4: Unallocated FS Block 0
5: Unallocated Commit Block (seq: 4949171, sec: 1613574032.1117509120)
6: Unallocated Descriptor Block (seq: 4949172)
7: Unallocated Commit Block (seq: 4960433, sec: 1613729975.4288594432)
8: Unallocated Descriptor Block (seq: 4960434)
// rest omitted
jls的源代码是here。
自己动手
或者,您可以咨询ext4 wiki 以使用您必须自己编写的程序解析日志。步骤大致如下:
- 读取文件系统后 1024 字节开始的 ext4 超级块。
- 从超级块的偏移量 0xE0 读取日志 inode 号。日志的 inode 编号通常为 8。这已记录在 here。
- 从日志中读取您需要的数据,记住它是大端的,而 ext4 是小端的。该期刊的结构描述为here。