EXT barrier:一个增强文件系统安全性的机制
2024-04-10 10:40:32  阅读数 564

部分摘取自华为服务支持的EX barrier机制

常用的文件系统使用日志功能来保证文件系统的完整性。该功能背后的思路很简单:在写入新的数据块到磁盘之前,会先将元数据写入日志。预先将元数据写入日志可以保证在写入真实数据前后一旦发生错误,日志功能能很容易地回滚到更改之前的状态。

单独使用日志功能不能保证没有任何差错。现在的磁盘大都有大容量的缓存,数据不会立即写入到磁盘中,而是先写入到磁盘缓存中。到这一步,磁盘控制器就能更加高效地将其复制到磁盘中。这对性能来说是有好处的,但是对日志功能来说则相反。为了保证日志百分之百可靠,它必须绝对保证元数据在真实数据写入之前被预先写入。

也就是有了JBD2日志机制,仍然存在问题。

做了文件写操作后,大多数情况下调用fsync就能保证数据可靠地写入磁盘。

由于磁盘缓存的存在,fsync这些同步操作,并不能完全保证存储设备把数据写入非易失性介质。如果此时存储设备发生掉电或者硬件错误,此时存储缓存中的数据将会丢失。

对于像日志文件系统中日志这样的数据丢失,其后果可能是非常严重的。因为数据的写入和日志的写入存在先后顺序, 日志记录也存在顺序。而IO落到磁盘缓存后,操作系统将无法再控制数据的落盘顺序。 如果数据从磁盘缓存刷入非易失性介质的过程中发生掉电,所有IO的落盘顺序将无法保证。

举例:

JBD2 descriptor block 和 commit block落盘,而实际JBD2的metedata journal没有落盘,则这部分数据变为脏数据,会大面积破坏文件系统。

为了规避这种情况,EX barrier应运而生。

Barrier 的原理:barrier之前的I/O需要在其之前写入存储介质,之后的I/O需要等到barrier写入完成后才能得到执行。磁盘数据将在barrier被写入之前完全写入磁盘(本身禁止在barrier之后写入数据,真实的数据块将在barrier被写入之前完 全写入磁盘)。借用barrier机制,EXT4能够保证磁盘缓存中的数据能够及时落盘。

barrier在EXT4文件系统中默认启用。通过/proc/mounts文件来监控文件系统barrier的当前状态,对于每一个挂载的文件系统,打开这个文件都能看到所有的挂载选项。如果你看到barrier=1。

/dev/sda1 /boot ext4 rw,seclabel,relatime,barrier=1,data=ordered 0 0

/dev/mapper/l4a27-a1bf  /home  ext4  rw,seclabel,noatime,barrier=1,data=ordered 0 0

RAID控制卡或者磁盘需要上报存在磁盘cache, 否则barrier不生效。(之前出过磁盘有cache,但是RAID控制卡没有cache,导致barrier不生效问题)。

另外虚拟化场景下,I层需要支持flush刷新,能够将缓存(host或者存储缓存)中的内容刷到实际存储设备中。


Barrier的问题在于,它不能应用于所有条件下。如果设备映射器作为存储层的优先级使用,那么文件系统barrier就无法工作了,因为设备映 射器不支持barrier。所以,哪怕你的文件系统默认支持barrier,还是无法在逻辑卷、软RAID或者多路径磁盘上运行该功能(RED HAT和所有相关的Linux版本都将barrier作为默认选项)。

解决这个问题的方案之一是避免使用设备映射器。所以在安装服务器时,你需要充分考虑配置选项。首先,你不该使用LVM安装服务器,而应该选择用传统的分区方式。接着,你不能使用和设备映射器配合工作的多路径磁盘,它会在SAN上创建多个冗余路径。某些情况下,SAN供应商会提供一个专有驱动器作为选择,但不是所有供应商都提供该选项。最好的办法是采用智能硬件。

使用barrier保护的风险之一是,在系统中断时,数据会留在缓存中,而永不会写入文件系统。一个简单的电池备份控制器可以避免这个问题。当服务器使用的这个控制器出故障了,磁盘控制器仍然能保证变更操作,这充分排除了barrier使用的需要。

使用barrier的另一个不利之处在于,你需要付出降低性能的代价。如果你需要顶级的性能,那么你可以用挂载选项-o barrier=0来关闭barrier功能,比如:mount /dev/sda2 -o barrier=0 /data。

文件系统barrier功能非常有用,但是不能和设备映射器配合工作。如果你需要使用这类设备,但是又想要保证文件系统完整性,那么你可以用电池备份磁盘控制器。如果你的硬件不支持这个,那么你只能避免使用设备映射器,这样才能用barrier功能来保障文件系统完整性。还有,如果你希望得到更好的 系统性能,最好也不要开启barrier功能,它会降低系统运行速度。