Сегодня утром меня встретило предупреждение о нехватке диска в корневом разделе. Итак, я начал с обычного пути расследования и, очевидно, результатом моей первой команды стал такой, как показано ниже.
[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
Мне нравится этот инструмент:
По сути, это оболочка 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