在什么情况下,文件会在卸载期间写入块设备?

在什么情况下,文件会在卸载期间写入块设备?

我有一个紧凑型闪存卡被检测为块设备/dev/sdb。它有一个 FAT16 分区。现在,如果我挂载 FAT16 文件系统,向文件系统和umount文件系统写入一些内容,则文件的实际写入发生在umount

# mount | grep sdb
/dev/sdb1 on /media type vfat (rw)
# time cp image.bin /media/

real    0m0.179s
user    0m0.000s
sys 0m0.104s
# time umount /media 

real    0m18.185s
user    0m0.004s
sys 0m0.032s
# 

我在 USB 闪存上也看到过类似的行为。什么决定文件是立即写入文件系统还是在文件系统分离期间写入?

答案1

如果文件同步打开,或者文件系统使用同步选项挂载,则写入会立即完成。

这通常对整体系统性能不利,因此仅当写入调用返回时必须将关键数据提交到存储设备时才执行此操作。复制文件并不被认为是关键的,因此内核会在内部缓冲写入,并且仅定期将数据刷新到介质。

sync您可以使用以下命令要求操作系统刷新所有这些缓存

答案2

内核将数据缓存在内存中,阅读数据至关重要(有人正在等待它),写作可以懒惰地完成(没有人催你;数据可能会被再次使用/重新修改)。由于设备可以同时读取或写入,因此尽可能推迟写入是值得的。因此,只有在没有出路的情况下(需要空间),数据才会由内核“自愿”写入现在)。您可以通过同步打开文件(一旦发生任何更改就写入)、fsync(2)调用文件以强制输出数据来强制内核进行操作。当您卸载设备时,显然必须事先写出为其缓存的所有数据。

上面的内容应该会让你不寒而栗,因为机器随时可能崩溃并留下大量未写入的数据。这就是为什么有一个名为 的程序sync(1),它使内核写出所有缓存的文件数据。它通常设置为定期运行(通常每 5 秒左右)以避免如上所述的数据丢失。您需要检查发行版的文档,了解其具体设置或调整的方式。

相关内容