我有一个嵌入式设备(Linux + BusyBox),在该设备上加载了文件"my_file.txt"
。我使用cat
检查文件的内容,结果令人满意。然后,我拔下插头,重新启动后,我看到文件仍然存在,但是大小为0字节...
这可以由文件系统不同步引起吗?这实际上是一个双面问题:
cat "my_file.txt"
] ,但实际上,我看到的是一个缓存版本,该版本在重启后将不再存在,除非将调用sync
? ,“不存在”是指内容,因为文件本身仍然存在 BTW,Linux何时刷新文件系统?我知道,例如,在引入stdout
时,"\n"
会被刷新(默认情况下)[并且可以通过某种方式进行配置,不记得具体如何]。文件系统也有规则吗?
答案 0 :(得分:1)
- 文件的创建及其内容的副本是否发生在不同的阶段? (允许一个阶段,只要存在一个0字节的文件)
是的,复制文件不是原子操作,因为您首先调用open()
,然后在...之后以write()
模式打开将创建一个空文件,因此依次调用O_CREAT
:首先是一个空文件,然后填充。
- 我是否有可能“看到”该文件[这意味着我成功管理了“ my_file.txt”文件],但实际上看到的是已缓存 重启后将不会存在的版本,除非将进行同步 叫? “不存在”是指内容,如文件本身 遗物
是的,您看到的是以前操作的缓存版本。
Linux何时刷新文件系统?
一般规则是内核在需要时会刷新内容。您唯一可以做的就是要求刷新,但是,即使这只是一个询问,并不意味着刷新已发生,而只是意味着刷新将很快发生。相应的命令行为sync
。
文件系统也有规则吗?
您可以挂载一个文件系统,请求以直接模式进行IO,也可以逐个文件地请求它(请参阅O_DIRECT
和open
中的类似内容)。但是请注意,直接模式通常会降低性能……
答案 1 :(得分:0)
文件的创建及其内容的副本是否发生在不同的阶段? (允许存在0字节文件的阶段)
是的。对文件的常规操作是
我是否有可能“看到”该文件[这意味着我成功管理了“ my_file.txt”文件],但实际上,我看到的是一个缓存版本,该版本在重启后将不再存在,除非进行同步叫吗?
是的。如果上面的步骤1已同步到硬盘驱动器,但步骤2没有同步,则会丢失文件内容。
顺便说一句,Linux什么时候刷新文件系统?我知道,例如,在引入“ \ n”时,stdout会被刷新(默认情况下)[并且可以通过某种方式进行配置,不记得具体如何]。文件系统也有规则吗?
不,没有通用规则-这很复杂。操作系统/内核和文件系统将数据缓存在RAM中,并在内部算法认为是时候这样做时将其写入磁盘。
请注意,在许多级别上都有刷新/同步功能。您所说的“引入“ \ n”时”的刷新只是从程序到操作系统的刷新。然后,操作系统可能只将数据保留在RAM中,然后再将其刷新到硬盘驱动器。 硬盘甚至可以将其缓存在硬盘上的RAM中,然后再将其写入永久存储。
通常,您可以在命令行上运行sync
命令,以确保所有缓存的数据都已从OS写入硬盘。 (尽管在不带电池备份的板载RAM的低端硬盘驱动器上,如果断电,这仍可能会丢失驻留在硬盘驱动器内存中的数据)。
答案 2 :(得分:-1)
如果在项目中使用文件时关闭设备,则该文件可能会被破坏,因为例如您要擦除文件的文档并再次写入文件。在这两个阶段之间,如果设备关闭,您的文件销毁。