第 1 部分 — Ext4 文件系统:数据块、超级块、inode 结构

第 2 部分 — Ext4 文件系统:extent、flex_bg、sparse_super

照片来自Mr Cup / Fabien BarralonUnsplash

延迟分配

默认情况下启用延迟分配功能。这就是为什么当您尝试写入或修改数据块时数据可能不会立即提交到磁盘的原因。

我使用默认参数(启用延迟分配)安装了 ext4 文件系统。一段时间后分配的块:

我使用 nodelalloc 参数(禁用延迟分配)安装了 ext4 文件系统。我在创建文件后立即检查了这些块。立即分配的块:

什么是脏数据块?

尚未提交到磁盘的数据块称为“脏数据块”。

ext4有3种写入文件的模式(可以在挂载磁盘时设置模式):

  1. datau003dordered(默认模式,支持延迟分配)

  2. datau003djournal(不支持延迟分配)

  3. 数据u003d回写

数据u003d订购:

Ext4 提交元数据块日志。之后,ext4 将脏块提交到磁盘。

数据u003d期刊:

Ext4 在将脏块和相应的元数据块提交到磁盘之前将它们提交到日志中。

数据u003d回写:

类似于 datau003dordered 模式。不同之处在于 ext4 可以将脏块提交到磁盘,然后 ext4 可以将相应的元数据块提交到日志。

如何查看脏块的大小和数量?

Dirty:等待写入磁盘的总内存大小。

nr_dirty:内存中等待写入磁盘的脏块数

pagesize:以字节为单位的连续内存块空间。

38036 KB / 9509 块 u003d 4 KB(4096 字节)

P.S.:当您将脏块空间大小除以脏块的数量时,您可能不会得到精确的 4(您的页面大小)。它应该更接近您的页面大小。例如:4.01、4.02

您可以使用 sync 命令将脏块刷新到磁盘:

如果您需要在系统程序中将脏块刷新到磁盘,您必须调用 sys_syncsys_fsyncsys_fdatasync 调用。

脏块多久刷新一次磁盘?

它取决于几个系统参数:dirty_background_ratiodirty_ratiodirty_expire_centisecsdirty_writeback_centisecs。 (这里查看每个参数的描述)

以下是用于分配块的 dirty_expire_centisecs 系统值的示例:

我将dirty_expire_centisecs 的值设置为1000(10 秒):

脏数据块在执行同步命令后刷新到磁盘,即使dirty_expire_centisecs的值为3000(30秒),

什么是 fs-verity?

fs-verity 是 ext4 支持的东西,我真的很喜欢它。假设您正在运行一个 SIEM 应用程序,并且您想要签署日志文件并将日志文件设为只读。 fs-verity 可能会在这种情况下为您提供帮助。

fs-verity 根据文件的内容计算哈希值,并使文件成为“只读”文件并且不能被禁用。

默认情况下不启用 fs-verity。您应该在创建文件系统时启用它:

mkfs.ext4 -O 真实性 /dev/sdb

fs-verity 的示例用法:

通过 lsattr 可以看到相关属性。

Logo

更多推荐