Сервер встал с ошибкой No space left on device. Первая задача — понять, что именно съело диск, и только потом что-то удалять.
Что решает эта инструкция
Пошаговый разбор: сколько места занято, какие каталоги самые тяжёлые, какие файлы можно безопасно удалить. Отдельно — частая ловушка, когда место занято, но файлов нет.
Когда это нужно
- Сервис перестал писать логи или БД ушла в read-only
- Мониторинг прислал алерт о заполнении диска
- Плановая уборка перед добавлением новых сервисов
Шаг 1: посмотреть общую картину
df -h
Ключ -h выводит размеры в человекочитаемом виде. Смотрите на колонку Use% и на точку монтирования — часто заполняется не корень, а отдельный раздел вроде /var.
Отдельно проверьте inode. Их можно исчерпать при нормальном свободном месте — тогда система тоже откажется создавать файлы:
df -i
Шаг 2: найти тяжёлые каталоги
du -h --max-depth=1 / 2>/dev/null | sort -rh | head -20
Что происходит:
--max-depth=1— не углубляться дальше первого уровня, иначе вывод будет бесконечным2>/dev/null— убрать ошибки доступа к/procи/syssort -rh— сортировка по убыванию с учётом суффиксов K/M/G
Дальше спускайтесь в самый тяжёлый каталог и повторяйте:
du -h --max-depth=1 /var 2>/dev/null | sort -rh | head -10
Шаг 3: найти конкретные файлы
find / -xdev -type f -size +100M -exec ls -lh {} \; 2>/dev/null | awk '{print $5, $9}'
Ключ -xdev запрещает find уходить на другие файловые системы — без него команда полезет в сетевые монтирования и будет работать очень долго.
Совет. Если доступен ncdu, он удобнее: интерактивная навигация по дереву с размерами. Ставится одной командой apt install ncdu, запускается как ncdu -x /.
Шаг 4: типовые источники мусора
Журналы systemd. Часто занимают гигабайты:
journalctl --disk-usage
journalctl --vacuum-time=7d
Кэш пакетного менеджера:
apt clean
Старые ядра в /boot:
apt autoremove --purge
Ротация логов в /var/log — файлы с суффиксами .1, .gz. Если их много, стоит пересмотреть настройки logrotate, а не удалять вручную каждый раз.
Проверка результата
df -h /
Свободное место должно вырасти. Если нет — переходите к разделу ниже.
Возможные проблемы
Файлы удалены, но место не освободилось
Классика. Процесс держит открытым дескриптор удалённого файла — место вернётся только после его перезапуска. Найти такие файлы:
lsof +L1 2>/dev/null | grep -v '^COMMAND'
Колонка NLINK будет равна нулю. Перезапустите указанный сервис — место освободится сразу.
du показывает меньше, чем df
Та же причина: du считает файлы в каталогах, df — реально занятые блоки. Разница как раз и есть удалённые, но ещё открытые файлы.
Осторожно. Не удаляйте файлы в /var/lib — там лежат данные баз, пакетного менеджера и Docker. Прежде чем удалять что-то в /var, выясните, какой сервис это создал.
Итог
Порядок действий: df -h → du --max-depth=1 по подозрительному каталогу → find -size +100M для точечного поиска. Если после удаления место не вернулось — ищите процессы с открытыми дескрипторами через lsof +L1.