plu*_*uck 7 filesystems ext3 journaling
我有一个关于 ext3 文件系统上的完整数据日志的问题。手册页声明如下:
data=journal
All data is committed into the journal prior to being written into
the main filesystem.
Run Code Online (Sandbox Code Playgroud)
在我看来,这意味着文件首先保存到日志,然后复制到文件系统。
我假设如果我下载了一些东西,它应该首先保存在日志中,如果完整则移到 FS。但启动后下载文件出现在目录(FS)中。那有什么问题?
编辑:认为“所有数据”= 文件的整个大小可能是错误的?因此,如果所有数据可能只是一个块或其他东西,那么它会有意义并且我看不到这些东西首先被写入日志?!
Gil*_*il' 11
首先,您怀疑“所有数据”并不意味着整个文件是正确的。事实上,文件系统的这一层对固定大小的文件块进行操作,而不是对整个文件进行操作。在那个级别,保持有限数量的数据很重要,因此处理整个文件(可以是任意大的)是行不通的。
其次,你的问题存在误解。日志行为不是通过查看目录内容可以观察到的ls
,它在低得多的级别上工作。使用普通工具,您将始终看到文件在那里。(如果创建文件似乎没有创建它,那将是灾难性的。)在幕后发生的事情是文件可以以不同的方式存储。首先,前几个块保存在日志中。然后,尽快有效地将数据移动到其最终位置。它仍然是同一个目录中的同一个文件,只是存储方式不同。
观察日志行为的唯一方法是查看内核正在写入磁盘的确切内容,或者在崩溃后分析磁盘内容。在正常操作中,日志是一个实现细节:如果你能看到它在运行(除了性能方面),它会被严重破坏。
有关文件系统日志的更多信息,我建议从维基百科文章 开始。在 ext3 术语中,adata=journal
确保如果系统崩溃,每个文件都处于崩溃前某个时刻的状态(由于缓冲,它并不总是最新状态)。这不会自动发生的原因是内核重新排序磁盘写入以提高效率(它可以产生很大的不同)。这在维基百科文章中被称为“物理期刊”。另外两种模式(data=ordered
和data=writeback
)是“逻辑日志”的形式:它们更快,但它们可能导致文件损坏。该日志将损坏的风险限制在少数包含垃圾的文件;ext3 始终使用完整的日志记录元数据。如果没有元数据日志,元数据可能会丢失,从而导致主要的文件系统损坏。此外,如果没有日志,崩溃后的恢复需要完整的文件系统完整性检查,而日志恢复意味着重放一些日志条目。
请注意,即使使用日志,典型的 unix 文件系统也不能保证全局文件系统的一致性,最多只能保证每个文件的一致性。也就是说,假设您写入 file foo
,然后写入 file bar
,然后系统崩溃。可能bar
有新的内容,但foo
仍然有旧的内容。为了获得完全的一致性,您需要一个事务性文件系统。