文件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
所以日志大小为32M,并且从文件系统的开头开始。我知道日志的大小取决于分区的大小。我现在不记得有什么限制,但它的价值并不大。那么日志中存储了什么样的数据呢?
我读过一次,如果您想安全地从磁盘中删除文件(通过shred
),您必须考虑文件系统的日志,因为它可以存储有关已删除文件的一些信息。有什么办法可以查日记里的内容吗?有没有什么工具可以显示这些信息?
答案1
日志的确切内容取决于您配置 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
,其中有一些工具,例如jls
或jcat
。该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)
...
当然,根据期刊的大小,还会有更多条目。在这种情况下,大约有 16382 个,其中大部分是空的。如果您想对日志执行某些操作,例如恢复某些文件,则必须使用jcat
以下命令来提取 i 节点块:
jcat grafi.img 8 10 > blok-161
并检查单个 i 节点。该块的4096
大小为字节,并覆盖16
i 节点,每个节点的256
长度为字节。无论如何,通过这种方式,您可以获得一个范围的第一个块、该范围中的块数、有多少个范围用于描述该特定文件、它的大小以及其他类似的东西。您只需根据从日志中获取的 i 节点条目即可从磁盘恢复该文件。
debugfs
包装里也有e2fsprogs
。它有logdump
类似于的工具jls
。
答案2
我想参考日志文件系统的定义(来自维基百科),希望您能得到答案:
日志文件系统是一种文件系统,它通过在称为“日志”的数据结构(通常是循环日志)中记录此类更改的意图来跟踪尚未提交到文件系统主要部分的更改。如果发生系统崩溃或电源故障,此类文件系统可以更快地恢复在线状态,并且损坏的可能性更低
参考:
https://en.wikipedia.org/wiki/Ext4#Features 和 https://en.wikipedia.org/wiki/Journaling_file_system#Logical_journals
欲了解更多信息。