作者:D之phper | 来源:互联网 | 2017-10-08 20:22
最近在Linux下面往一个NTFS分区写内容的时候,不时的会出现创建文件失败的问题。重启机器,问题照旧。我试呀试,终于发现,如果重启系统,进入Windows,对在Linux下不能创建文件的分区进行一些简单操作,再回到Linux下面,就一切OK了。
但看上面这些症状,好像并不能确定问题是来自于NTFS,于是我进行了更多的实验:一切正常以后,我先在NTFS分区建立了几个垃圾文件,然后从其他地方拷贝大量文件到该分区。不出所料,在又拷贝了30K个文件之后,重现了文件创建失败的问题。我删掉一个垃圾文件,然后再创建一个文件,OK。删掉两个文件,再创建两个文件,OK。删掉三个垃圾文件,再创建四个文件,不出意料的,创建第四个文件时候就失败了。
不过要说明的是,也许这个问题并不是很常见。因为现在,我在NTFS分区内已经写了500k+的文件。第一次问题出在什么时候,我已经不记得了,应该也是N多文件以后的事情了吧。
更进一步,我们可以讨论一下NTFS的实现。假设NTFS在磁盘上A地址到B地址之间存放该分区所有文件的文件信息(inode),那么当一个分区中文件太多的时候,这段地址空间就不能装下所有的文件信息,这个时候就需要把文件信息空间扩张。如果扩张不成功呢,则我们就不可以新建文件了,这么想应该是很合理的。
那么,为了让硬盘不因为文件信息空间充满而不能新建文件,操作系统应该在检测到文件信息空间将满的时候,引出一个链接指向下一个地址区间,假设该地址区间起址为C,末址为D。如此则可让文件信息空间和文件数据空间同步增长,从而逐渐充满整个硬盘。
做个收尾吧:如果上述假设成立的话,那么Windows里面大概处理了文件信息空间即将充满的问题,并且处理过程虽然面向文件系统,却不是文件系统本身的功能。所以,在Linux下面如果Linux不自己解决这个问题,那就是Linux的bug了。
因为我们看到了,当Linux下面报错的时候,windows下还是可以正常操作的。