当我的系统启动时,当它探测外部 USB 连接硬盘驱动器时,我会在 dmesg 输出中收到消息Assuming drive cache: write through
,并标有外部驱动器的设备名称。
由于我使用此驱动器来存储备份,我真的更喜欢系统不对驱动器的特性做出任何假设。我愿意以写入性能为代价为了确保当某些内容被写入相关驱动器上的文件系统时,它确实一直致力于永久存储并且不在某处的缓存中(最好甚至不在驱动器本身上,因为电源故障会导致计算机和驱动器立即断电)。
一个可能复杂的因素是驱动器拥有一个经过 LUKS 加密的分区。文件系统仅存在于 LUKS 容器中,如下所示:
+- physical drive ------------------------+
| |
| +- partition -----------------------+ |
| | | |
| | +- LUKS encryption -----------+ | |
| | | | | |
| | | +- file system ---------+ | | |
| | | | | | | |
| | | | actual data | | | |
| | | | | | | |
| | | +-----------------------+ | | |
| | | | | |
| | +-----------------------------+ | |
| | | |
| +-----------------------------------+ |
| |
+-----------------------------------------+
因此我的问题是:如何确保所有写入都已提交到物理存储,然后再报告回用户空间应用程序已完成?
答案1
这里有两个组成部分:磁盘写入缓存和文件系统缓存。
可以使用 禁用磁盘写入缓存hdparm -W 0 [device]
。您可以通过使用该sync
选项安装/重新安装文件系统来禁用文件系统写入缓存。请注意,这些更改将极大地降低性能。