访问EXT3/EXT4期刊

Gau*_*jan 6 linux filesystems ext3 journaling ext4

ext3和ext4文件系统具有日志功能.有没有机会获得有关文件的详细信息和事件?

某种API允许User Space程序访问文件的日记条目.甚至是Journal事件(比如文件x被删除)

这似乎是某种文档,但我不确定它是否是正确的东西.

Mat*_*aun 7

debugfs

logdump

logdump您可以使用来自的命令显示有关文件系统日志的信息debugfs

例如,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
Run Code Online (Sandbox Code Playgroud)

我意识到这debugfs不是 API,但它可以访问日志。

读取日志的字节

要获取日志的原始字节,您可以debugfs再次使用。它的cat命令接受一个索引节点号并打印该索引节点指向的地址的数据。

假设该期刊的inode号为8:

sudo debugfs -R 'cat <8>' /dev/sda3 | hexdump -C
Run Code Online (Sandbox Code Playgroud)

这将以十六进制打印日志的字节。您应该在开头看到期刊格式的神奇数字jbd2:

c0 3b 39 98
Run Code Online (Sandbox Code Playgroud)

该日志使用大端字节顺序,而 ext4 使用小端字节顺序。

jls

jlsThe Sleuth Kit还打印有关该期刊的信息。

例如,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
Run Code Online (Sandbox Code Playgroud)

的源代码jls这里

DIY

或者,您可以查阅ext4 wiki,使用您必须自己编写的程序来解析日志。步骤大致如下:

  1. 读取从文件系统后 1024 字节开始的 ext4 超级块。
  2. 从超级块的偏移 0xE0 处读取日志 inode 号。日志的 inode 号通常为 8。此处对此进行了记录。
  3. 从日志中读取所需的数据,请记住它是大端字节序,而不是 ext4 是小端字节序。该期刊的结构如下所述。