磁盘已满,但找不到大文件或文件夹。

Ubuntu服务器告诉我,我几乎使用了所有的磁盘空间。
Usage of /:   95.5% of 118.12GB

我试着找到大的文件夹和文件,运行ncdu
ncdu 1.8 ~ Use the arrow keys to navigate, press ? for help                                                                                                                                                 
--- / ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
    5.5GiB [##########] /root                                                                                                                                                                               
    2.3GiB [####      ] /var
  628.6MiB [#         ] /usr
  209.9MiB [          ] /lib
   28.2MiB [          ] /boot
    8.6MiB [          ] /bin
    7.7MiB [          ] /sbin
    6.6MiB [          ] /etc
  208.0KiB [          ] /run
  112.0KiB [          ] /tmp
   48.0KiB [          ] /opt
e  16.0KiB [          ] /lost+found
    8.0KiB [          ] /dev
    8.0KiB [          ] /media
    4.0KiB [          ] /lib64
e   4.0KiB [          ] /srv
e   4.0KiB [          ] /selinux
e   4.0KiB [          ] /mnt
e   4.0KiB [          ] /home
    0.0  B [          ] /proc
    0.0  B [          ] /sys
@   0.0  B [          ]  initrd.img
@   0.0  B [          ]  vmlinuz

根据ncdu,我使用了大约10 GiB的128 GiB - 大约是10%。矛盾。
如何在不重新启动的情况下清理我的ubutntu服务器?
我以为ncdu在撒谎,并使用其他应用程序查找大文件和文件夹。它们所有都显示与ncdu相同的结果。
而且df -h命令显示磁盘已满。
# df -h

Filesystem      Size  Used Avail Use% Mounted on
/dev/xvda       119G  113G     0 100% /
udev            2.0G  8.0K  2.0G   1% /dev
tmpfs           788M  212K  788M   1% /run
none            5.0M     0  5.0M   0% /run/lock
none            2.0G     0  2.0G   0% /run/shm

更新

sudo du -sch /* 结果:

$ sudo du -sch

8.7M    /bin
29M /boot
8.0K    /dev
6.6M    /etc
4.0K    /home
0   /initrd.img
210M    /lib
4.0K    /lib64
16K /lost+found
8.0K    /media
4.0K    /mnt
48K /opt
du: cannot access `/proc/4470/task/4470/fd/4': No such file or directory
du: cannot access `/proc/4470/task/4470/fdinfo/4': No such file or directory
du: cannot access `/proc/4470/fd/4': No such file or directory
du: cannot access `/proc/4470/fdinfo/4': No such file or directory
0   /proc
5.0G    /root
212K    /run
7.8M    /sbin
4.0K    /selinux
4.0K    /srv
0   /sys
112K    /tmp
629M    /usr
2.3G    /var
0   /vmlinuz
8.1G    total

8.1G 通常都是总大小。但我发现无法访问的行,可能是因为它们出了问题。
然后我检查了最大的文件夹在/下。它是/root:
$ sudo du -sch /root

96K /root/Downloads
2.5G    /root/Dropbox
36K /root/nohup.out
4.0K    /root/npm-debug.log
4.0K    /root/readonly
980K    /root/redis-2.6.16.tar.gz
228M    /root/tmp
2.7G    total

只是一个想法,可以检查一下/var/log/目录的内容,看看是否有任何日志文件增长异常。 - Mordoc
/var/log大约有2 GiB。没问题。 - Maxim Yefremov
1尝试使用du -sch /*命令,查看哪些根目录占用了最多的空间,然后从那里进入占用空间最多的位置。 - DopeGhoti
@DopeGhoti 我尝试了,但看到的信息是相同的,大约有8.1 GiB已满(我添加了这部分内容进行更新)。无法找出剩下的100 GiB在哪里。 - Maxim Yefremov
你有没有在Valve Steam程序中安装一些游戏?如果下载10 GB,那么可能会继续占用50 GB或更多的空间... - dschinn1001
@dechinn1001 不是游戏,而是一个网络服务器。 - Maxim Yefremov
2我知道你不想这样做,但是硬着头皮重启吧。 - douggro
@douggro 重新启动有帮助,谢谢。可惜这是唯一的选择。 - Maxim Yefremov
9个回答

我在我们实验室的机器上遇到了同样的问题,使用这个命令解决了。
du -sch .[!.]* * |sort -h

我能够找到用户垃圾桶里尚未删除的隐藏文件。
原始答案来自这里

令人惊叹的解决方案! - AivanF.

检查由进程仍然保持打开的已删除文件:
sudo lsof | grep deleted | less

这将显示进程ID和文件描述符。我在服务器上遇到了完全相同的问题,ncdu中没有任何信息,但磁盘空间却被填满了。后来发现是一个每晚运行的进程将文件移动到挂载的Samba共享目录,并且偶尔没有正确关闭文件句柄。

如果你发现已删除的文件并想要清理它们,如果可以接受的话,重新启动可能是最简单的方法。或者你可以尝试终止该进程。如果你确定这些文件没有被使用,你可以手动清空它们,例如:
> /proc/14487/fd/12


这是我的问题。Tomcat保存了一个80GB的已删除文件。重新启动就足够解决了。 - AFP_555
1如果“重新启动”命令不足以删除它们,我该如何删除它们? - sparkle
1这显示了许多文件,我该如何处理这些信息?我已经重新启动了,但没有任何作用。 - Kvothe

我们之前也遇到了同样的问题,结果发现是存储在var/lib/docker下的docker镜像。
ncdu不会列出这些镜像,因为它们对用户来说是不可见的。即使以sudo权限运行ncdu也无济于事。
以下命令可以清除所有现有的docker镜像...
docker rmi $(docker images -a -q)

1我也遇到相同的问题。事实上,即使使用 docker system prune 命令也无法找到所有内容。而这个命令(早于 docker system prune 命令)能够解决这个问题。 - jscharf
2最近我们发现 docker system prune -a -f 更彻底一些。 - Baldy

以下命令将显示 /home 目录的磁盘利用情况,使用 --max-depth=1 参数:
sudo du -h -d 1 /

manual

-d--max-depth=N 仅在目录(或文件,使用--all参数)位于命令行参数的N级或更低级时打印总计;--max-depth=0--summarize相同。


确保检查您的磁盘挂载点。我在这里看到的解决方案都无法识别由于一个文件夹上放置了挂载而占用的空间。

有什么建议吗?我觉得这可能是我的问题。 - Eliethesaiyan
1https://unix.stackexchange.com/questions/198542/what-happens-when-you-mount-over-an-existing-folder-with-contents - Rich Remer
基本上,使用 mount 命令检查您现有的挂载点,然后为每个已经被其他挂载点覆盖的目录添加第二个挂载点。然后,您可以在新创建的挂载点上使用像 du 这样的常规磁盘工具来查看是否是问题所在。 - Rich Remer

有可能有一个进程打开了一个大文件,但后来该文件被删除了。你需要杀掉该进程来释放空间。你可以使用lsof命令来识别该进程。在Linux系统中,已删除但仍打开的文件在lsof的输出中会被标记为“(deleted)”。
你可以使用sudo lsof +L1来检查。
请参考:https://serverfault.com/questions/315181/df-says-disk-is-full-but-it-is-not

一个“隐藏”大文件的原因是可能将一个文件夹挂载到另一个磁盘上的某个文件夹/资源上-原始文件夹的整个内容被“隐藏”了-“du”不会显示它,因为它会与挂载的资源“重叠”。

我自己也遇到了这个问题。磁盘满了,完全找不到那些有问题的目录和/或文件。不过,我解决了这个难题。
之前的答案都非常有帮助,也是合法的,但如果你像我一样,在上面的提示中找不到那些有问题的目录和/或文件,我想分享一下我的解决方法。
我有一个外部USB驱动器(例如:dev/sdeX),专门用来备份根目录的内容(例如:/dev/sdaX)。根据这个线索,我卸载了除了根目录和其他必需挂载点之外的所有挂载点。然后,我注意到外部USB驱动器挂载到的挂载点使用了超过150G的空间。果然,我进入了这个目录,发现它包含了与外部USB驱动器(挂载时)完全相同的文件结构和内容。我将外部USB驱动器挂载起来,确认备份数据完好无损(确保检查),然后将其卸载并删除了该目录的内容(为了安心,请确保验证挂载点已经被卸载)。做完这些操作后,/(/dev/sdaX)的使用率从100%降低到了13%,这正是我所期望的。
我的回答要点是...尝试卸载所有外部驱动器,并仔细检查应该在外部驱动器上而不是根驱动器(/dev/sdaX)上的数据挂载点。
希望这能有所帮助。

您可以运行以下命令来查找磁盘使用量排名前10的文件:
find / -type f -printf '%s %p\n' 2>&1 \
     | grep -v 'Permission denied' \
     | sort -nr \
     | head -10

这个命令不起作用:find / -type f -printf '%s %p\n' 2>&1 \ | grep -v 'Permission denied' \ | sort -nr \ | head -10 - Shabby