GCE 持久磁盘块大小写入数据完整性

GCE 持久磁盘块大小写入数据完整性

SSD 持久磁盘的块大小似乎为 4096 字节。

如果我将 4096 字节的对齐块直接写入块设备(带有 O_DIRECT 和 posix_memalign 的 /dev/sdb),这些写入是否是原子的?

我想要的是写入调用要么成功写入整个 4K 块要么不写入任何内容。

我最终是否能得到新写入的 100 个字节,而其余的是旧数据?

答案1

请查看 O_ATOMIC,它与 O_DIRECT 配合使用以实现此目的。请参阅https://lwn.net/Articles/573092/

答案2

对于单扇区大小的写入是否对磁盘断电具有原子性,目前尚无统一意见 - 请参阅https://stackoverflow.com/a/2015068/4513656讨论这一点。至少从 SCSI 角度来看,单 LBA 单扇区原子性是预期的行为(请参阅http://www.t10.org/pipermail/t10/2011-November/016011.html) 但请注意,Linux 块层可以合并/拆分请求,并且处理多个 SCSI 设备。

还值得注意的是,对于 SCSI 设备,有明确的 T10 命令(例如WRITE ATOMIC)明确保证原子性,但设备不必实现它们,Linux 不会通过常规块设备操作公开它们。O_ATOMIC另一个答案中引用的标志补丁在撰写本文时不在主线内核中(2017 年 2 月内核 4.10),并且该标志未在open(2) 手册页

如果系统/磁盘从未崩溃,那么是的,单个扇区的单个 LBA 写入相对于同一个单个扇区的单个 LBA 读取应该看起来是原子的。

请注意,使用O_DIRECT并不意味着写入已成功写入非易失性存储,因此崩溃后您可能会发现确认的数据不存在。即使您使用的是块设备,也需要使用fsync或来进一步保证稳定性。O_SYNC

相关内容