查询磁盘空间被谁占用了
先说下常见的几种原因:
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释放
- 查询工具:使用ncdu命令查看文件系统磁盘的使用情况:
sudo apt install ncdu # 安装 ncdu
sudo ncdu /
sudo ncdu #查询所有
sudo yum install ncdu # 安装 ncdu
sudo ncdu /
sudo ncdu #查询所有
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=2G
3、执行df -h 查看分区大小
4、格式化第二个盘
mkfs.ext4 /dev/sdb ## 不需要分区,直接格式化就行
5、挂载到/data路径下
mount /dev/sdb /data
6、再次查看分区大小
发现一个问题,之前生成的2G的测试文件,并没有在新分区挂载后显示。应该是被覆盖了,但/的大小却没有释放。
7、卸载/dev/sdb在看后,test.dmp文件还在。
总结,如果磁盘空间占用太多,可能用这个方法看看是否是挂载新盘之前,有数据落在了之前的文件夹没有及时清理