多挂载保护

多挂载保护(MMP)是一项功能,用于保护文件系统免受多个主机同时使用文件系统的影响。当文件系统被打开时(用于挂载、fsck 等),节点(称之为节点 A)上运行的 MMP 代码会检查一个序列号。如果序列号是 EXT4_MMP_SEQ_CLEAN,则打开操作继续。如果序列号是 EXT4_MMP_SEQ_FSCK,那么 fsck(希望)正在运行,并且打开操作立即失败。否则,打开代码将等待指定 MMP 检查间隔的两倍时间,并再次检查序列号。如果序列号已更改,则文件系统正在另一台机器上活动,并且打开操作失败。如果 MMP 代码通过所有这些检查,则会生成一个新的 MMP 序列号并写入 MMP 块,然后挂载继续。

当文件系统处于活动状态时,内核会设置一个定时器,在指定的 MMP 检查间隔时间重新检查 MMP 块。为了执行重新检查,MMP 序列号会被重新读取;如果它与内存中的 MMP 序列号不匹配,则另一个节点(节点 B)已经挂载了文件系统,并且节点 A 会将文件系统重新挂载为只读。如果序列号匹配,则内存和磁盘上的序列号都会递增,并且重新检查完成。

每当打开操作成功时,主机名和设备文件名都会写入 MMP 块。MMP 代码不使用这些值;它们纯粹是为了提供信息。

校验和是根据文件系统 UUID 和 MMP 结构计算的。MMP 结构体(struct mmp_struct)如下所示

偏移

类型

名称

描述

0x0

__le32

mmp_magic

MMP 的魔术数字,0x004D4D50 (“MMP”)。

0x4

__le32

mmp_seq

序列号,定期更新。

0x8

__le64

mmp_time

MMP 块上次更新的时间。

0x10

char[64]

mmp_nodename

打开文件系统的节点的主机名。

0x50

char[32]

mmp_bdevname

文件系统的块设备名称。

0x70

__le16

mmp_check_interval

MMP 重新检查间隔,单位秒。

0x72

__le16

mmp_pad1

零。

0x74

__le32[226]

mmp_pad2

零。

0x3FC

__le32

mmp_checksum

MMP 块的校验和。