我安装了 FAT32 文件系统。更改文件后,我可以读回该文件,但仍然看到旧版本。在卸载并重新安装分区之前,我的更改实际上不会持续。这种行为正常吗?如果是,为什么它有意义或者为什么需要它?有没有办法设置它以便自动显示更改?
答案1
Linux 与大多数其他操作系统一样,会缓存磁盘 IO 操作。sync
在执行文件修改后,您可以使用命令强制内核刷新其缓冲区。但是,这会降低整个系统的性能,因为所有当前“脏”缓冲区都会使用此命令刷新到磁盘。或者,您可以使用fsync
C 库函数刷新刚刚对某个特定文件所做的更改,但此函数不能保证整个文件系统在介质上处于一致状态。
答案2
即使卸载后,您也可能能够找到同一文件的旧版本,因为文件系统不一定必须将新文件存储在同一位置。因此,如果新文件存储在另一个空闲位置,则它不一定会覆盖旧文件。
由于性能原因,您在文件系统中所做的更改不会立即写入磁盘。当您可以让操作系统在后台执行此操作时,为什么要让程序等到文件实际上完全被物理写出呢?有时,这种异步行为甚至可以完全保存写入,例如当文件在创建后立即被删除或覆盖时,它根本不需要物理存储。
您可以使用 mount 选项禁用大多数文件系统的该行为sync
。还有一个sync
命令强制将数据写入磁盘而不卸载。
不过,您永远不应该访问文件系统的原始数据。如果您安装了 /dev/sdb1,然后使用另一台机器安装完全相同的文件系统(通过网络块设备或其他方式),那么两个系统同时使用相同的文件系统数据,您最终会崩溃。只有特殊(集群)文件系统才以这种方式工作;对于所有其他人,您需要一个网络文件系统(其中只有一台机器安装磁盘,并通过网络透明地公开其文件)。