有什么方法可以找到是什么占满了我的磁盘?

有什么方法可以找到是什么占满了我的磁盘?

今天早上,我的根分区出现了磁盘空间不足的警告。因此,我开始按照通常的调查路径进行调查,显然,我的第一个命令的结果如下所示。

[root@my-server /]# df -h
Filesystem            Size  Used Avail Use% Mounted on
/dev/sda3              97G   86G  6.0G  94% /
tmpfs                  12G  5.7G  6.1G  48% /dev/shm
/dev/sda2             360G   16G  326G   5% /www
/dev/sdb1             458G   38G  397G   9% /web
/dev/sdc1             458G   42G  393G  10% /server
/dev/sdd1             458G   44G  392G  10% /mysql
[root@my-server /]# df -i
Filesystem            Inodes   IUsed   IFree IUse% Mounted on
/dev/sda3            6406144  264687 6141457    5% /
tmpfs                3070273     175 3070098    1% /dev/shm
/dev/sda2            23928832    1373 23927459    1% /www
/dev/sdb1            30457856   52061 30405795    1% /web
/dev/sdc1            30457856    1995 30455861    1% /server
/dev/sdd1            30457856     793 30457063    1% /MySQL

但我想知道是谁占用了这么多空间,于是启动了磁盘使用情况,发现,

[root@my-server /]# du -shx /
24G /
[root@my-server /]# du -h --max-depth=1 /
1.6G /root
4.0G /home
14M /sbin
6.5G /var
0 /misc
12K /.dbus
4.0K /mnt
4.0K /media
5.7G /dev
4.8G /opt
0 /sys
52M /user
35M /etc
0 /net
4.0K /bak
43G /mysql
6.5G /usr
du: cannot access `/proc/3633/task/25117/fd/78': No such file or directory
du: cannot access `/proc/3633/task/7047/fd/70': No such file or directory
du: cannot access `/proc/24882/task/24882/fd/4': No such file or directory
du: cannot access `/proc/24882/task/24882/fdinfo/4': No such file or directory
du: cannot access `/proc/24882/fd/4': No such file or directory
du: cannot access `/proc/24882/fdinfo/4': No such file or directory
du: cannot access `/proc/24883': No such file or directory
0 /proc
244M /lib
4.0K /nas
4.0K /selinux
4.0K /srv
27M /lib64
42G /server
49M /boot
16G /www
16K /lost+found
38G /web
100M /tmp
8.9M /bin
168G /

哎呀,实际使用量大约为 30GB,我如何找出哪些文件占用了我的磁盘空间?

确认罪魁祸首是一个已删除的文件,如果文件不存在,则 find 或 du 之类的工具无法解析有问题的文件!好吧,找到它的实际操作顺序是,

[root@my-server ~]# lsof / | grep deleted
...
java  3633  wwwuser  1w  REG  8,3  66975347588  396715  /home/wwwuser/apache-tomcat-7.0.29/logs/catalina.out (deleted)
...

哎呀,62GB 的文件,现在,

[root@my-server ~]# cd /proc/3633/fd/
[root@my-server fd]# ll | grep deleted
[root@my-server fd]# > 1

好吧,上面的命令是我从另一个 SO 答案中得出的https://stackoverflow.com/questions/17860257/unable-to-find-large-files-in-linux-using-du-h但我想知道最后一个命令是什么?它是如何回收孤立磁盘空间的?

答案1

我最喜欢的查找占用空间的命令是这个:

$ du -sh ./*

当你运行磁盘使用量使用这些选项的命令会显示该文件夹中文件和文件夹的大小。对于文件夹,大小包括所有内容的大小。这样可以一眼就看出哪些空间被用完了。

专家提示:如果这是您想要频繁运行的命令,您可以在文件中为其创建别名,~/.bashrc如下所示:

alias showdisk='du -sh ./*'

现在,下次您打开终端时,您将输入$ showdisk,它将在命令行上显示您所在文件夹中文件和文件夹的大小。希望这能帮助您加快速度 :D

答案2

我喜欢这个工具:

http://dev.yorhel.nl/ncdu

它基本上是 du 的 ncurses gui 包装器。我发现它比普通的 du 更有帮助,因为它同时执行所有工作,而不是每次进入使用率最高的目录时执行。它对于包含大量数据的磁盘树尤其有用。

答案3

我总是使用这个简单的脚本来打印大文件

find /var/log -type f -size +3G -exec ls -lh {} \; | awk '{ print $5 ": " $9 }' | sort -rh

但如果有文件夹包含大量小文件,我总是使用

du -sh folder

或者

du -hsx /* | sort -rh | head -10

查找重复文件,首先按大小,然后按 md5sume

find -not -empty -type f -printf "%s\n" | sort -rn | uniq -d | xargs -I{} -n1 find -type f -size {}c -print0 | xargs -0 md5sum | sort | uniq -w32 --all-repeated=separate

相关内容