linux ☞ df与du数据不一致的原因
-
问题表现:
df 数据比 du 数据小,而且是发生在删除文件之后。
这个问题牵扯到 linux 系统是将如何确认和回收数据的.
-
空间是如何被判定占用的
linux文件系统判定空间是否被占用,是查看空间的 imap 是否为1,而 imap 是否为1,则取决于占用空间的文件的 inode 节点的 Links 是否为0。而每当程序调用文件且没有关闭,那么此文件的 inode 的 Links 就会加 1。
如果 Links 不为0,则 imap 就不会是 0 ,则这份空间就无法被再次调用.
另外,每一个文件,默认 inode Links 是1
-
系统是如何删除一个文件的
文件系统首先在父目录文件里找到所要删除的文件名,将此文件信息从父目录里清除掉,如若清除后,Links 为0 ,则删除 inode 节点,将 imap 就置为0,空间可以再次被利用。但是,如果父目录文件信息清除后,有程序在调用文件,则 Links 不为0,那么 inode 无法被删除, imap 也无法置为0,结果就是文件看着没了,但是空间还是没有释放。
df 和 du 的最大区别就是:
df 是根据 inode 的 Links 来确认空间是否被占用,并进而统计
du 是根据目录的文件信息来确认空间是否被占用,并进而统计
-
如何释放被占用的空间
从上面可知,我们只需要将被删除文件的 inode Links 降成 0 即可,也就是关闭此文件的调用程序.
如何查找调用程序?
lsof -n | grep rm_file_name # 获取到程序 pid,并将其杀死即可