我这里有一个运行 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(文件)的最后一个引用时,磁盘空间在内核眼中才是“空闲的”,而打开该文件的程序则算作一个引用。对于未来:当您移动或删除日志文件时记得让使用它的程序知道- 如果您想要真正安全,请重新启动相关程序。
但由于您重新启动了,这在理论上是不可能的——所有程序都应该被杀死,因此它们所持有的任何引用也会消失。这只剩下我能想到的两种可能性:
你有一个硬链接到您不知道的文件。
如果是这种情况,du
则df
应该就您在系统上使用的空间量达成一致。您的文件系统已损坏。可能处于这样的模式:一个 inode 具有正引用计数,但实际上没有被任何文件系统对象指向。
这相对容易(但耗时)检查:在大多数 Linux 系统上,您可以通过创建一个名为/forcefsck
(touch /forcefsck
root 可以做到这一点)的文件在重启时强制检查文件系统 - 然后只需重启并等待(一段时间!),您的系统将扫描其文件系统,寻找诸如引用计数错误的“丢失”inode 之类的东西。