【问题标题】:Accessing ext3 / ext4 journals访问 ext3 / ext4 期刊
【发布时间】:2012-06-22 07:05:40
【问题描述】:

ext3 和 ext4 文件系统具有日志功能。是否有一些 API 可以获取有关文件的详细信息或事件?

允许用户空间程序访问文件日志条目的某种 API。甚至是日志事件,例如“文件 x 已删除”。

这似乎是some kind of documentation,但我不确定它是否正确。

【问题讨论】:

  • 可能,但是“历史”是什么意思?我怀疑您高估了记录的内容以及该日记的刷新方式。
  • 您将 journalingversioning 文件系统混淆了。
  • ext3 中的“日志”日志模式将数据和元数据保存到日志中。所以在日志中访问事务可以给我们文件的版本。
  • 问题是正确的,但是您想使用日志元数据,是否有 api 或 sys 调用来访问它?

标签: linux filesystems ext3 ext4 journaling


【解决方案1】:

debugfs

logdump

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

例如,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。

jls

来自The Sleuth Kitjls 也会打印有关期刊的信息。

例如,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 以使用您必须自己编写的程序解析日志。步骤大致如下:

  1. 读取文件系统后 1024 字节开始的 ext4 超级块。
  2. 从超级块的偏移量 0xE0 读取日志 inode 号。日志的 inode 编号通常为 8。这已记录在 here
  3. 从日志中读取您需要的数据,记住它是大端的,而 ext4 是小端的。该期刊的结构描述为here

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-09-23
    • 2023-03-17
    • 2012-07-10
    • 2016-12-06
    • 1970-01-01
    • 2011-07-13
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多