我如何检查 Linux 系统哪个部分使用了最多的磁盘空间?

我如何检查 Linux 系统哪个部分使用了最多的磁盘空间?

我的 ubuntu 服务器磁盘空间不足(37GB 中 36GB)。我使用了几种方法来检查磁盘使用情况,但结果对我来说似乎很模糊。

我使用以下命令进行检查,输出如下:

$ du -sh /*

6.2M    /bin
4.0K    /boot
20K     /dev
47M     /etc
2.1G    /home
72K     /include
27M     /lib
0       /lib64
4.0K    /media
4.0K    /mnt
546M    /opt
0       /proc
287M    /root
5.2M    /sbin
4.0K    /selinux
4.0K    /srv
0       /sys
59M     /tmp
2.7G    /usr
1.7G    /var

这些似乎都没有接近 36GB,因此我进行如下检查:

$ df -h

Filesystem            Size  Used Avail Use% Mounted on
/dev/sda1              38G   35G  835M  98% /
udev                   10M   20K   10M   1% /dev
none                  500M   16K  500M   1% /dev/shm
none                  500M   68K  500M   1% /var/run
none                  500M     0  500M   0% /var/lock

但是我无法确定哪个目录占用了大部分磁盘空间。有人能告诉我如何检查吗?谢谢。

答案1

我认为“磁盘空间可视化工具”在这种情况下无法帮助您:此类工具所占用和可见的空间与 可见的空间相同du,只是这些工具做得更详细。但该工具仍然只会报告您已经知道已使用的 8-10 GB,而不会报告“丢失”的另外 20 GB 在哪里。

对于这种比例的“消失”空间,一个可能的解释是,它位于一个(或多个)已删除文件

如果你在 Unix 中打开一个文件,并且在文件处于打开状态时,删除(取消链接)它,它仍然会“存在”,但仅对持有其文件描述符的进程可见,并且在进程结束后立即消失,释放描述符。

这是管理临时文件的好方法。

不幸的是,如果临时文件泄漏并且数据不断添加到其中,而没有关闭并重新创建文件,那么大量的磁盘空间可能会“消失”。

以 root 身份尝试:

ls -la /proc/*/fd/* | grep deleted

文件名和进程 ID 将告诉您哪些进程正在维护“未链接”的空间。

当然,如果你能做到,重启会更快达到同样的效果。有些进程与系统紧密相连,所以重启它们实际上比终止它们更好并管理所有其他相关流程和服务

例如,在我的机器上,我有大约 25 个这样的文件,而这个

lrwx------ 1 root  root  64 May  9 07:45 /proc/732/fd/8 -> /tmp/vmware-root/vmware-usbarb-732.log (deleted)

我知道有时会增长到几兆字节的范围。运行

vmware-usbarbitrator --kill

vmware-usbarbitrator

可以释放从零到 100M 的空间,具体取决于运行的时间长短以及我使用了多少vmplayer

自动检查

检查哪些文件占用空间的一种方法是检查它们的大小:大多数未链接的文件只有几个字节。

此方法使用wc,效率极低;可能打开文件、查找SEEK_END并返回 的值ftell()会快得多(尤其是对于大文件)。但需要编译一个小实用程序才能做到这一点。

for i in $( ls -la /proc/*/fd/* 2>/dev/null \
            | grep deleted \
            | sed -e 's/.*\(\/proc\S*\) -.*/\1/g' ); do
    wc -c $i | tr "\n" "="; readlink $i
done | grep -v "^0 " | sort -rn

这采用了一种(希望)可移植的方式来列出所有已删除文件的虚拟 fd,并使用 读取它们wc。然后,对于每个文件,读取符号链接。忽略零长度文件以避免混乱。

在我刚启动的系统上,这给了我

217032 /proc/812/fd/9=/var/run/nscd/dbMn7Auu (deleted)
217032 /proc/812/fd/8=/var/run/nscd/dbMn7Auu (deleted)
3278 /proc/2357/fd/3=/tmp/vmware-root/vmware-apploader-2327.log (deleted)
2257 /proc/2422/fd/7=/tmp/vmware-root/vmware-authdlauncher-2418.log (deleted)

所以我知道这nscd是在利用 400 Kb 的“不可见空间”(如果我重新启动,这不会改变nscd;所以它可能是一个不会增长太多的工作区。但是,没有什么能阻止我密切关注这个过程)。

将上述代码保存在一个小的实用程序中并运行它也很容易cron,丢弃所有低于(比如说) 500 兆的值,但如果最终出现某些情况,则向管理员发送电子邮件。

答案2

您可以尝试使用一些工具以图形方式表示系统上的所有不同文件和文件夹,并根据其磁盘使用情况调整其大小。其中一个工具是“xdiskusage”。请参阅链接查看更多。

答案3

在 Linux 中有很多不同的方法可以做到这一点。请查看以下答案:

如何了解什么占用了空间。

windirstat 的命令行替代品

答案4

使用磁盘使用情况分析器。它会以图形方式显示您的内存使用情况,您可以直接深入了解丢失内存的位置。很棒的工具。

注意:要安装,请sudo apt-get install baobab在终端中输入。

以下链接包含有关您的问题的更多信息:MakeUseOf - 分析 Linux 中的磁盘使用情况

相关内容