删除 500G 的巨大文件不会释放磁盘空间

删除 500G 的巨大文件不会释放磁盘空间

我这里有一个运行 Ubuntu(服务器版)的远程服务器。

昨天我发现我的硬盘空间被占用了 100%。有一个日志文件越来越大,所以我通过 删除了它rm file.foo

然后我运行了,df -h但是存储文件的分区仍然被 100% 占用。

因此我认为重新启动可能会有帮助并运行sudo shutdown -r now

等了几分钟后,我无法通过 SSH 连接到服务器,因此我请数据中心的人员手动重新启动它。

一切正常并且服务器启动了。

所以我df -h再次运行,现在该分区的 80% 已被占用(至少有点)。

接下来,我想检查一下什么需要那么多磁盘空间,然后运行sudo du -h --max-depth 1 /,结果是:

16K /lost+found
942M    /home
52K /tmp
4.0K    /mnt
236K    /dev
du: cannot access `/proc/17189/task/17189/fd/4': No such file or directory
du: cannot access `/proc/17189/task/17189/fdinfo/4': No such file or directory
du: cannot access `/proc/17189/fd/4': No such file or directory
du: cannot access `/proc/17189/fdinfo/4': No such file or directory
0   /proc
4.0K    /media
4.0K    /opt
4.0K    /srv
32K /root
3.0G    /var
393M    /lib
37M /boot
6.9M    /etc
681M    /usr
4.0K    /selinux
8.0M    /bin
9.0M    /sbin
4.0K    /cdrom
0   /sys
5.0G    /

正如您在最后一行看到的,仅占用了 5 GB(因此该文件不能位于垃圾箱或“lost+found”中)——无论如何,由于我使用了rm命令,所以它不可能在那里。

那么,出了什么问题?

我个人的猜测是,在服务器重启时,它以某种方式清理了我删除的那个 500GB 大文件。强制手动重启可能会中断这个过程,所以它只能清理其中的 20%。

如果我的猜测是正确的,我该怎么做才能解决这个问题?

如果我的猜测是错误的,那么我的系统会怎么样?

答案1

我的第一个猜测是,无论程序正在写入什么,file.foo它都仍然处于活动状态,并且保持文件句柄打开:只有在清除对 inode(文件)的最后一个引用时,磁盘空间在内核眼中才是“空闲的”,而打开该文件的程序则算作一个引用。对于未来:当您移动或删除日志文件时记得让使用它的程序知道- 如果您想要真正安全,请重新启动相关程序。

但由于您重新启动了,这在理论上是不可能的——所有程序都应该被杀死,因此它们所持有的任何引用也会消失。这只剩下我能想到的两种可能性:

  1. 你有一个硬链接到您不知道的文件。
    如果是这种情况,dudf应该就您在系统上使用的空间量达成一致。

  2. 您的文件系统已损坏。可能处于这样的模式:一个 inode 具有正引用计数,但实际上没有被任何文件系统对象指向。
    这相对容易(但耗时)检查:在大多数 Linux 系统上,您可以通过创建一个名为/forcefscktouch /forcefsckroot 可以做到这一点)的文件在重启时强制检查文件系统 - 然后只需重启并等待(一段时间!),您的系统将扫描其文件系统,寻找诸如引用计数错误的“丢失”inode 之类的东西。

相关内容