Очистка свободного места в Linux не выглядит трудной задачей. Гораздо сложнее на незнакомом сервере найти те файлы, появление которых послужило причиной нехватки места на диске и принять решение что с ними можно сделать. В этой статье буду коллекционировать команды, которых постоянно не найти под рукой, когда они так нужны.
Содержание
Очистка свободного места в Linux
Представим ситуацию, когда вы попадаете впервые на незнакомый сервер с задачей освободить место на диске. Возможно некоторое время до этого вы получили алерт по этому серверу и вам нужно что-то предпринять, чтобы устранить проблему.
Базовые команды
Первым делом нужно понять что из себя представляет дисковая подсистема сервера. Для этого как нельзя лучше подойдут следующие команды. Для начала выведем список блочных устройств:
1 |
lsblk |
А вот вывод:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
$ lsblk NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINT loop0 7:0 0 67.2M 1 loop /snap/lxd/21835 loop1 7:1 0 61.9M 1 loop /snap/core20/1434 loop2 7:2 0 61.9M 1 loop loop3 7:3 0 67.8M 1 loop /snap/lxd/22753 loop5 7:5 0 61.9M 1 loop /snap/core20/1494 loop6 7:6 0 44.7M 1 loop /snap/snapd/15534 loop7 7:7 0 44.7M 1 loop /snap/snapd/15904 sda 8:0 0 16G 0 disk ├─sda1 8:1 0 763M 0 part /boot/efi ├─sda2 8:2 0 1.4G 0 part /boot └─sda3 8:3 0 13.9G 0 part └─ubuntu--vg-ubuntu--lv 253:0 0 10G 0 lvm / sr0 11:0 1 1024M 0 rom |
Кстати, уже из вывода команды df можно выяснить, что используется lvm.
Оценка размера файлов и каталогов
В этом поможет всем известная команда du, с работой которой, однако, есть пара нюансов. Вот так можно посмотреть размер вложенных файлов и каталогов определенного раздела:
1 |
du -shc /var/* |
Но если вы запустите её в корне своей домашней директории, то обнаружите, что каталоги с точкой в начале имени она не выведет:
1 2 3 |
# du -shc ~/* 28K /root/snap 28K total |
Чтобы это обойти, команду придется усложнить 1:
1 2 3 4 5 6 7 8 9 10 |
# du -shc ~/.[^.]* ~/* 4.0K /root/.bash_history 4.0K /root/.bashrc 4.0K /root/.lesshst 12K /root/.local 4.0K /root/.profile 4.0K /root/.ssh 4.0K /root/.viminfo 28K /root/snap 64K total |
Еще одной полезной опцией у du является -x (–one-file-system), которая позволяет не проваливаться в другие файловые системы, если например вы хотите посчитать размер каталогов из корня, но при этом у вас в /mnt подмонтированы другие разделы:
1 |
du -shcx /* 2>/dev/null |
Возможно вам также будет полезен ключ –time, который показывает самое свежее время изменения файла в каталоге или его подкаталогах, но я эту опция обычно не использую.
Поиск файлов
Теперь пришло время find. Всем известная команда с очень широким функционалом и возможностями. В контексте поиска нас интересует время модификации файлов (например за последние сутки):
1 |
find . -mtime -1 -type f |
Если мы ищем файлы больше определенного размера, то добавим еще ключ -size (- и + означают меньше и больше определенного размера соответственно):
1 |
find . -mtime -1 -type f -size +50M |
Если вы хотите найти файлы определенного пользователя, то на помощь придет ключ -user:
1 |
find . -mtime -1 -type f -size +50M -user username |
Ну и напоследок команда, с помощью которой легко удалить найденные файлы (будьте аккуратны!):
1 |
find . -mtime -1 -type f -size +50M -user username -exec rm -rf {} \; |
А теперь переходим к задачке поинтереснее.
Поиск удаленных файлов
Очень может получиться так, что файл был удален, но еще не освобожден процессом. В этом случае к имени файла уже не обратиться и потому du не учтет его в итоговом объеме, но реальные блоки данных все еще не будут удалены с диска и, следовательно, df справедливо отобразит их в итоговом занятом объеме. Отыскать такие файлы можно командой:
1 |
lsof +L1 | grep deleted |
Далее уже вам решать что делать с найденными файлами. Можно корректно перезапустить процесс и тогда файловый дескриптор будет освобожден, а сами блоки данных файла окончательно удалятся с диска. Если процесс беспросветно завис, то поможет kill -9.
Стороннее программное обеспечение
Есть много программного обеспечения, которое самостоятельно управляет дисковыми ресурсами. Всем известно, что Docker особым образом оптимизирует занимаемое образами место на диске, используя слои.
Посмотреть подробный отчет об использовании дискового пространства Docker можно командой:
1 |
docker system df -v |
Ну а очистить неиспользуемые слои и образы можно командой:
1 |
docker prune -a |
Команда также удаляет “подвисшие” образы (dangling images) – образы с <none> вместо имени и тега. Это самый безопасный способ очистки места, занимаемого образами Docker, не пытайтесь сами удалять слои в каталоге /var/lib/docker/overlay2!
На этом все. Как будет появляться что-то полезное, обязательно дополню статью. Если нужна помощь в изучении основ Linux, пишите.