我如何找出什么用完了/分区上的所有空间?


9

我正在使用Amazon EC2服务器上的大型实例。我运行df命令并得到:

root@db:~# df -h
Filesystem            Size  Used Avail Use% Mounted on
/dev/sda1             9.9G  9.1G  284M  98% /
tmpfs                 3.8G     0  3.8G   0% /lib/init/rw
varrun                3.8G  116K  3.8G   1% /var/run
varlock               3.8G     0  3.8G   0% /var/lock
udev                  3.8G   80K  3.8G   1% /dev
tmpfs                 3.8G     0  3.8G   0% /dev/shm
/dev/sdb              414G  957M  392G   1% /mnt
/dev/sdf               50G   12G   35G  26% /byp
/dev/sdk               99G   31G   63G  33% /backups

然后,我运行du命令并获得:

root@db:/# du -s -h /*
31G     /backups
5.5M    /bin
136K    /boot
12G     /byp
80K     /dev
5.8M    /etc
12K     /home
70M     /lib
11M     /lib32
0       /lib64
16K     /lost+found
759M    /mnt
4.0K    /opt
du: cannot access `/proc/6917/task/6917/fd/4': No such file or directory
du: cannot access `/proc/6917/fd/4': No such file or directory
0       /proc
31M     /root
7.7M    /sbin
4.0K    /selinux
4.0K    /srv
0       /sys
11M     /tmp
1.1G    /usr
114M    /var

如果您注意到了,当您在未挂载目录的du命令输出上加总所有大小时,您将无法获得df命令中所示接近9.1G的任何值。

这是否意味着我的磁盘有问题?如果是这样,我该如何解决?

Answers:


20

您完全有可能拥有一个很大的已删除文件(或很多小文件),而某个进程仍具有打开的文件句柄。找到它们的方法是运行

# lsof | grep "deleted"

如果您看到许多以“((已删除)”)结尾的行,则可以找到使它们打开并重新启动的进程ID。一旦发生这种情况,您的磁盘空间将返回。

如果这不能解决问题,那么我建议您使用fsck。


1
太棒了!就是这样 我有一个仍在登录的PostgreSQL日志。
09年

如果要释放一些空间而不重新启动守护程序,而不是删除文件,请使用“ echo> file”代替。这将截断文件,但是由于句柄仍处于打开状态,因此它将成为稀疏文件。这意味着它仍将是相同大小,但将占用更少的磁盘空间。
David Pashley 09年

lsof +L1有时可以比那个grep更好地工作...
derobert

5

du不等于df有很多原因。请参阅此问题的答案。

其中一些是覆盖安装,许多小文件和较大的块大小,以及仍在使用的已删除文件。覆盖式挂载是在文件系统中挂载了文件系统的挂载点上进行的,因此du看不到它们。

两者之间的主要区别是df仅检查超级块并信任它,而du则扫描该超级块能够看到的所有文件,并将它们加起来。请参阅此IBM链接以获取有关超级块的信息。


4

追逐此类问题时,请始终对du使用-x选项。它防止du跨越文件系统。


这不会有任何区别,因为OP明确要求/ *,因此要求其他分区。如果在“ / mnt / backups”下面安装了某些内容,将有所帮助
David Pashley 09年
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.