ext4 文件系统的日志中存储了什么样的数据?

Mik*_*kov 6 filesystems security hard-disk

ext4文件系统有一个功能叫做has_journal。在dumpe2fs输出中,我们可以看到如下内容:

# dumpe2fs /dev/sda2 | grep -i journal
Journal inode:            8
Journal backup:           inode blocks
Journal features:         journal_incompat_revoke
Journal size:             32M
Journal length:           8192
Journal sequence:         0x00000662
Journal start:            1
Run Code Online (Sandbox Code Playgroud)

所以日志大小为32M,从文件系统的开头开始。我知道日志的大小取决于分区的大小。我现在不记得限制了,但它不是那么大的价值。那么日志中存储了什么样的数据呢?

我读过一次,如果你想从你的磁盘中安全地删除一个文件(通过shred),你必须考虑文件系统的日志,因为它可以存储一些关于被删除文件的信息。有没有办法检查日记中的内容?有什么工具可以显示信息吗?

Dmi*_*yev 13

日志的确切内容取决于您如何配置 ext4 文件系统。该负责人EXT4文件说:

有3种不同的数据模式:

  • 回写模式 在 data=writeback 模式下,ext4 根本不记录数据。此模式提供与 XFS、JFS 和 ReiserFS 的默认模式(元数据日志)类似的日志级别。崩溃+恢复可能会导致在崩溃前不久写入的文件中出现不正确的数据。这种模式通常会提供最佳的 ext4 性能。

  • 有序模式 在 data=ordered 模式下,ext4 只正式记录元数据,但它在逻辑上将与数据更改相关的元数据信息与数据块合并为一个称为事务的单元。当需要将新元数据写入磁盘时,首先写入关联的数据块。通常,此模式的执行速度比回写略慢,但比日志模式快得多。

  • 日志模式 data=journal 模式提供完整的数据和元数据日志。所有新数据首先写入日志,然后写入其最终位置。如果发生崩溃,日志可以重播,使数据和元数据处于一致状态。这种模式是最慢的,除非需要同时从磁盘读取数据和将数据写入磁盘,它的性能优于所有其他模式。启用此模式将禁用延迟分配和 O_DIRECT 支持。

因此,您可以在日志文件中同时拥有元数据(例如文件名)和实际数据(即文件内容)。

如果您对交易数据实际存储在日志中的格式的详细信息感兴趣,您应该参考相应的头文件:

http://git.kernel.org/cgit/linux/kernel/git/torvalds/linux.git/tree/include/linux/jbd2.h

还有一个 wiki 页面解释了这些结构在磁盘上的布局:

https://ext4.wiki.kernel.org/index.php/Ext4_Disk_Layout

debian 中有一个名为 的包sleuthkit,其中有一些工具,例如jlsjcat。该jls工具可以列出ext4文件系统的所有日志条目,例如:

# jls grafi.img

JBlk    Description
0:      Superblock (seq: 0)
sb version: 4
sb version: 4
sb feature_compat flags 0x00000000
sb feature_incompat flags 0x00000000
sb feature_ro_incompat flags 0x00000000
1:      Allocated Descriptor Block (seq: 2)
2:      Allocated FS Block 161
3:      Allocated Commit Block (seq: 2, sec: 1448889478.49360128)
4:      Allocated Descriptor Block (seq: 3)
5:      Allocated FS Block 161
6:      Allocated Commit Block (seq: 3, sec: 1448889494.3355841024)
7:      Allocated Descriptor Block (seq: 4)
8:      Allocated FS Block 145
9:      Allocated FS Block 1
10:     Allocated FS Block 161
11:     Allocated FS Block 129
12:     Allocated FS Block 8359
13:     Allocated FS Block 8353
14:     Allocated FS Block 0
15:     Allocated FS Block 130
16:     Allocated Commit Block (seq: 4, sec: 1448889528.3540304896)
...
Run Code Online (Sandbox Code Playgroud)

当然,根据期刊的大小,还有更多条目。在这种情况下,大约有 16382 个,其中大部分是空的。如果你想对日志做一些事情,例如,恢复一些文件,你必须使用jcat以提取 i-node 块:

jcat grafi.img 8 10 > blok-161
Run Code Online (Sandbox Code Playgroud)

并检查单个 i 节点。该块的4096大小为字节,并覆盖16i-node,每个 i-node 的256长度为字节。无论如何,通过这种方式,您可以获得范围的第一个块,范围中的块数,使用多少个范围来描述该特定文件,其大小以及其他类似内容。您只需要根据从日志中获得的 i-node 条目从磁盘恢复该文件。

还有debugfse2fsprogs包。它有logdump工具,类似于jls.