最近,我正在测试ext4文件系统的正确用法。我的专家是:
当系统崩溃时,数据已经写入返回确定不能丢失,但是metadate可以
这是我的用法:
1.调用fallocate来分配centain空间
fallocate(fd,0,0,4 * 1024 * 1024); // 4MB
2.调用fsync(fd)让数据和元数据写入磁盘
3.然后我调用函数随机写入4k大小的文件(随机数据但不是0)。使用O_DRICT标志,但不调用fsync。我用返回写正确记录偏移量。
4.检查记录的偏移量。但我发现在一些偏移量,读取4k数据,是0.这似乎意味着偏移量不像孔文件那样使用。
我的问题是:
&。1。为什么在调用fallocate和fsync之后仍然会看到文件的元数据
表示未使用某些块,因此在读取时返回null。这是我的理解。
&2。有其他api来调用,可以确保在文件分配空间不是漏洞,之后用O_DIRECT写入数据返回ok时可以确保数据不会丢失甚至系统崩溃。
Thanks.
答案 0 :(得分:0)
只有写入文件空间才能消除漏洞。没有写,没有脏页面,fsync什么都不做。
我想知道你是如何执行第4步的。看来你是通过手动崩溃来做到的,是吗?如果你在写入后没有崩溃就读它,它不应该为零,只要你写了非零。如果在崩溃后读取它,如果存在磁盘缓存,则可能发生零。但是,这种零不像孔,它们是从磁盘读取的零(很可能是磁盘包含零)。