多挂载保护¶
多挂载保护(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 块的校验和。 |