Когда диск заполняется, перестают писаться журналы, падают базы данных, не обновляются пакеты, а иногда не удаётся даже войти в систему. Порядок действий всегда одинаковый: понять, какой раздел заполнен, найти, что занимает место, и убрать лишнее - не задев нужного.

Какой раздел заполнен

bash
df -h

Столбец Use% показывает заполненность каждого раздела, Mounted on - куда он подключён. Обращайте внимание на /, /var и /home, если они отдельные.

Бывает, что место есть, а файлы не создаются с ошибкой «No space left on device». Тогда закончились не байты, а индексные дескрипторы (inode) - так бывает, когда в папке миллионы мелких файлов:

bash
df -i

Что занимает место

Карта диска из прямоугольников, крупные блоки выделены, сверху лупа

du

Размер папок первого уровня в корне, по убыванию:

bash
sudo du -xh --max-depth=1 / | sort -rh | head -20

Ключ -x не даёт du заходить на другие разделы (например, смонтированные диски и /proc). Дальше спускайтесь в самую большую папку и повторяйте:

bash
sudo du -xh --max-depth=1 /var | sort -rh | head -20

ncdu

ncdu делает то же интерактивно: показывает папки по размеру, позволяет переходить по ним стрелками и удалять клавишей d.

bash
sudo apt install ncdu    # или    sudo dnf install ncdu
sudo ncdu -x /

Самые большие файлы

bash
sudo find / -xdev -type f -size +500M -exec ls -lh {} \; 2>/dev/null

Файлы больше 500 МБ на корневом разделе. Порог меняйте под ситуацию. Другие полезные запросы:

bash
sudo find /var/log -type f -name "*.gz" -mtime +30      # сжатые журналы старше 30 дней
sudo find /home -type f -size +1G                       # большие файлы пользователей
sudo find /tmp -type f -atime +10                        # временные файлы, которые давно не читались

Если много мелких файлов съели inode, найти такую папку поможет подсчёт файлов:

bash
sudo find / -xdev -type f | cut -d/ -f2-3 | sort | uniq -c | sort -rn | head

Где обычно копится мусор

Журналы systemd

bash
journalctl --disk-usage
sudo journalctl --vacuum-size=500M    # оставить не больше 500 МБ
sudo journalctl --vacuum-time=14d     # оставить последние 14 дней

Постоянный лимит задаётся в /etc/systemd/journald.conf параметром SystemMaxUse=, после изменения - sudo systemctl restart systemd-journald.

Журналы в /var/log

Ротацией журналов занимается logrotate. Если какой-то журнал растёт до гигабайтов, проверьте его настройку в /etc/logrotate.d/. Активный журнал не удаляйте командой rm - программа продолжит писать в удалённый файл, и место не освободится (см. ниже). Очищайте его так:

bash
sudo truncate -s 0 /var/log/имя.log

Старые архивы *.gz и *.1, *.2 удалять можно.

Кэш пакетов

bash
sudo apt clean           # Debian, Ubuntu: удалить скачанные пакеты
sudo apt autoremove      # удалить ненужные зависимости и старые ядра
sudo dnf clean all       # Fedora, RHEL и родственные
sudo dnf autoremove
sudo pacman -Sc          # Arch: удалить кэш неустановленных пакетов

Старые ядра

В Debian и Ubuntu старые ядра удаляет apt autoremove. В Fedora и RHEL число хранимых ядер задаёт параметр installonly_limit в /etc/dnf/dnf.conf, а удалить лишние сразу можно так:

bash
sudo dnf remove $(dnf repoquery --installonly --latest-limit=-2 -q)

Команда оставит два последних ядра. Текущее ядро (uname -r) никогда не удаляйте.

Snap

Snap хранит несколько старых версий каждого пакета. Ограничить их число:

bash
sudo snap set system refresh.retain=2
snap list --all | awk '/disabled/{print $1, $3}' | while read name rev; do sudo snap remove "$name" --revision="$rev"; done

Вторая команда удаляет уже отключённые старые версии.

Docker

Образы, остановленные контейнеры и кэш сборки быстро занимают десятки гигабайт:

bash
docker system df               # сколько занимают образы, контейнеры, тома и кэш
docker system prune            # удалить остановленные контейнеры, неиспользуемые сети и висящие образы
docker system prune -a         # плюс все образы, не используемые контейнерами
docker builder prune           # кэш сборки

Тома (docker volume prune) удаляйте только если уверены, что данных в них не нужно: там обычно лежат базы данных.

Пользовательские кэши

~/.cache в домашних папках - кэш браузеров, миниатюр и программ. Его можно удалить целиком, программы создадут заново. Ещё стоит заглянуть в корзину (~/.local/share/Trash) и папку загрузок.

Место не освобождается после удаления

Если файл удалён, а df показывает прежнюю заполненность, файл всё ещё открыт каким-то процессом. Место освободится, только когда процесс его закроет. Найти такие файлы:

bash
sudo lsof +L1

В выводе будет процесс (COMMAND, PID) и размер. Перезапустите эту службу - и место вернётся. Если перезапуск невозможен, файл можно обрезать через дескриптор процесса:

bash
sudo truncate -s 0 /proc/<PID>/fd/<номер дескриптора>

Когда места совсем нет

  • Зарезервированные блоки. На разделах ext4 по умолчанию резервируется часть места для root. Поэтому root может освободить место, даже когда обычные пользователи уже не могут писать. На разделах с данными (не системных) резерв можно уменьшить: sudo tune2fs -m 1 /dev/sdXN.
  • Невидимые файлы под точкой монтирования. Если раньше в папку писали до того, как туда смонтировали отдельный диск, старые файлы прячутся под ним и занимают место на корневом разделе. Их видно, если временно отмонтировать диск или смонтировать корень в другую папку: sudo mount --bind / /mnt и du по /mnt.
  • Если ничего не удаляется - увеличьте раздел (на виртуальной машине это делается за минуты) или вынесите тяжёлые данные на отдельный диск.

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