磁盘空间莫名消失,找不到具体原因的思路
先说下常见的几种原因:
1、删除的文件未释放空间
2、日志或过期文件未及时清理
3、inode导致
4、隐藏文件夹或者目录
6、磁盘碎片
最后一种单独介绍。
环境:情况是根分区(/)的总容量为44GB,已使用了9.9GB,但实际文件内容查询显示只有7GB的文件,剩余的2GB似乎没有直接可见的文件。这种情况可能是由于以下几种原因导致的:
可能原因及排查方法:
1. 删除文件未释放空间(缓存和懒加载):
-
在Linux系统中,当你删除一个文件时,系统并不会立刻释放磁盘空间,尤其是在文件被某些进程占用的情况下。即使文件已经被删除,它的空间也不会立即释放,直到该文件不再被任何进程使用。
-
解决办法:可以使用
lsof
命令查看哪些文件被进程占用。若发现已删除的文件仍被某个进程占用,可以通过重启进程或重启系统来释放空间。lsof | grep deleted
-
该命令会列出所有已删除但仍被进程占用的文件。
kill -9 <上述命令找到的pid> # 上述命令会杀掉进程,生产慎重操作!
2. 日志文件或临时文件未清理:
-
系统中有很多临时文件或者日志文件,这些文件可能不会出现在常规目录(如
/home
或/var
)下,但它们依然占用空间。例如,/var/log
下的日志文件可能非常大。 -
解决办法:检查
/var/log
等目录是否有过大的日志文件。你可以使用du -sh
来查找占用空间最多的目录:du -sh /* | sort -h
3. 文件系统占用空间:
-
文件系统可能被其他非文件数据(如 inode 或文件系统缓存)占用了空间。即使文件已经删除,文件系统中仍可能存在未释放的空间。
-
解决办法:可以运行
df
和du
命令检查文件系统和磁盘使用情况:df -h # 查看分区使用情况 df -ih # 查看inode占用情况 du -sh / # 查看根分区的空间占用情况 rm -f /tmp/* # 删除临时文件,将inode释放
4. 隐藏文件或目录:
-
在Linux系统中,所有以“.”开头的文件和目录是隐藏的。你可能未能查找这些隐藏的文件或目录。
-
解决办法:使用
du
或ls
命令查看隐藏文件:ls -la # 使用ls -la 命令可以看到全部文件,包括隐藏文件 du -sh .cache # 查看隐藏文件
5. 磁盘碎片:
-
在某些情况下,尤其是在较老的文件系统中,磁盘碎片可能会导致空间不一致的问题,尽管现代的文件系统(如 ext4、XFS)通常能够有效管理碎片。
检查并优化文件系统碎片:
-
对于
ext4
文件系统,你可以尝试使用e4defrag
工具对文件系统进行碎片整理:sudo e4defrag /dev/sda1 ## 这里需要注意,/dev/sda1 分区为ext4
-
这个过程可能需要一些时间,尤其是当文件系统中存在大量小文件时。整理碎片后,执行
df -h
查看空间是否得到释放。
-
6. 磁盘空间占用:
- 这个问题之前没有考虑,后续发现确实可能存在这个问题
做一个实验
准备:1个虚拟机,2块盘,一个正常使用,另一个给20G,测试用
1、创建一个/data路径
mkdir /data # 这里路径名称无所谓,但必须要在根分区
2、在/data下面,手动dd一个文件,比较大的
dd if=/dev/zero of=/data/test.dmp count=1 bs=5G
3、执行df -h 查看分区大小
4、格式化第二个盘
mkfs.ext4 /dev/sdb ## 不需要分区,直接格式化就行
5、挂载到/data路径下
mount /dev/sdb /data
6、再次查看分区大小
发现一个问题,之前生成的2G的测试文件,并没有在新分区挂载后显示。应该是被覆盖了,但/的大小却没有释放。
7、卸载/dev/sdb在看后,test.dmp文件还在。
总结,如果磁盘空间占用太多,可能用这个方法看看是否是挂载新盘之前,有数据落在了之前的文件夹没有及时清理