Назад | Перейти на главную страницу

Как узнать, чем заполняется мой диск?

Сегодня утром меня встретило предупреждение о нехватке диска в корневом разделе. Итак, я начал с обычного пути расследования и, очевидно, результатом моей первой команды стал такой, как показано ниже.

[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 /

упс, фактическое использование составляет около 30 ГБ, как мне узнать, какие файлы съедают мой диск?

Подтверждая подозрение, что виновником был удаленный файл, Ничто, подобное 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)
...

упс, файл 62 ГБ, теперь,

[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 но мне было интересно, что это была последняя команда? Как он освободил потерянное дисковое пространство?

Моя любимая команда для определения того, что занимает место, такова:

$ du -sh ./*

Когда вы запускаете диск используется с этими параметрами он отображает размеры файлов и папок в этой папке. для папок размер включает размер всего содержимого. Это позволяет очень легко увидеть, где ваше пространство используется.

Совет: если это команда, которую вы хотите запускать часто, вы можете создать для нее псевдоним в своем ~/.bashrc файл вроде этого:

alias showdisk='du -sh ./*'

Теперь, когда вы в следующий раз загрузите свой терминал, вы наберете $ showdisk и он будет отображать размеры файлов и папок в папке, в которой вы находитесь, в командной строке. Надеюсь, это поможет вам ускорить процесс: D

Мне нравится этот инструмент:

http://dev.yorhel.nl/ncdu

По сути, это оболочка ncurses gui для du. Я считаю его более полезным, чем простой du, поскольку он выполняет всю работу одновременно, а не каждый раз, когда вы входите в каталог с максимальной загрузкой. Это может быть особенно полезно для деревьев дисков с большим количеством данных.

Я всегда использую этот простой скрипт, который будет распечатывать файлы большого размера.

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