Linux 是否通过 Btrfs 提供文件系统日志功能?

Linux 是否通过 Btrfs 提供文件系统日志功能?

NTFS 提供了一种称为日志的东西。我认为它是任何应用程序完成的文件重命名/移动/删除等操作的记录。我可以在 Linux + BTRFS 上获取类似的日志或日志吗? 1 个 BTRFS 分区,仅由一个 Linux 安装使用。

Google 图片上的 NTFS 日志示例: 在此输入图像描述

答案1

我认为你误解了该杂志的目的。它不是应用程序执行的操作的日志,并且不记录哪个应用程序导致了更改。它不适用于用户或管理员。它旨在作为文件系统的内部工具。

出于性能考虑,磁盘写入并不总是按照发出的顺序进行。如果系统在有时间写入所有内容之前因电源故障或系统崩溃而中断,则文件系统可能会处于不一致状态。例如,如果将文件从一个目录移动到另一个目录,则可能已写入包含旧目录内容的磁盘块,但包含新目录内容的磁盘块尚未写入。如果系统此时停止,则该文件将不再从任一目录引用,并且实际上会丢失。

有几种技术可以避免此问题(通常称为弹力在文件系统设计中)。许多文件系统,包括 NTFS,都使用杂志以此目的。日志按照执行的顺序记录操作,并且添加每个操作原子地,因此阅读日志总是会产生一致的状态。有一些文件系统,称为日志结构文件系统,其中日志是记录有关文件系统内容的所有信息的地方。对于其他系统(包括 NTFS),所有信息最终都会写入日志之外:日志仅包含可能尚未写入其“正常”位置的最新信息。读取文件并不访问日志,而是直接访问正常位置的数据。仅在启动时(更准确地说:挂载文件系统时)读取日志以完成尚未执行的任何操作。

通常,对于非日志结构的日志文件系统,日志将仅包含最近的操作。日志的空间通常有限,一旦相应的操作写入磁盘,旧条目就可以被覆盖,这通常不超过几秒钟。如果与日记大小相比没有太多活动,您可能仍然能够看到旧日记条目,但这不是您可以指望的。

某些 Linux 文件系统(例如 ext4)使用日志。但 Btrfs 不是其中之一。 Btrfs 通过以下方式实现弹性写时复制。它永远不会覆盖正在使用的磁盘块。为了进行更新,它使用新数据创建一个新块,然后为包含需要更新的块的位置的任何位置创建一个新块,然后为包含该位置的位置创建新块,等等。当它到达根时,它确保所有子块都被写入,然后更新根。这样,根始终引用始终有效的块。

如果您想跟踪文件操作,无论在 Linux 上还是在 Windows 上,文件系统日志都不是实现此目的的方法。 Linux 上的主要工具是记录文件系统审计子系统。看是否可以找出哪个程序或脚本创建了给定文件?列出程序访问的文件

1这是块树的根,而不是目录树的根。在这种详细程度上,区别并不明显。

答案2

鉴于 btrfs 是一个 COW 文件系统,它应该始终处于正确的状态,除非有错误。

仅当您覆盖数据时才需要日志记录,因此如果写入顺序遵循使文件系统快速的想法,则文件系统可能会变得不一致。日志记录是一种使非 COW 文件系统快速运行且不影响稳定性的方法。

相关内容