line — заметки на полях

Куда делось место на диске

9 июня 2026

Классика: df говорит, что диск занят на 100%, а du по всем каталогам насчитывает едва половину. Я столько раз разбирал это заново, что записал порядок действий.

1. Кто занимает место — по-честному

df -h
du -xh --max-depth=1 / 2>/dev/null | sort -h

Ключ -x не даёт du уйти на другие файловые системы — иначе в подсчёт попадут сетевые шары и /proc. Дальше спускаемся в самый толстый каталог и повторяем. Удобнее то же самое делать в ncdu -x /, он ставится из стандартного репозитория.

2. Удалённые, но открытые файлы

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

lsof +L1

Чаще всего это лог, удалённый руками вместо ротации. Правильное решение — перезапустить процесс. Если перезапускать нельзя, файл можно обрезать через дескриптор (PID и номер fd берём из вывода lsof):

: > /proc/1234/fd/7

А чтобы не повторялось — настроить ротацию.

3. Кончились не байты, а иноды

Ошибка «No space left on device» при свободных гигабайтах — смотрим иноды:

df -i

Виновник обычно — каталог с миллионами мелких файлов: сессии PHP, кэш, очередь почты. Найти его помогает du --inodes -x --max-depth=1 / | sort -n.

4. Обычные подозреваемые

  • Журнал systemd: journalctl --disk-usage. Ограничить сразу — journalctl --vacuum-size=200M, навсегда — SystemMaxUse=200M в /etc/systemd/journald.conf.
  • Docker: docker system df покажет образы, остановленные контейнеры и тома. Логи контейнеров по умолчанию не ротируются — лимит задаётся через log-opts в daemon.json.
  • Старые ядра в /boot — apt autoremove.
  • Кэш пакетов — apt clean.

5. Зарезервированные блоки

На ext4 по умолчанию 5% места зарезервировано за root, поэтому обычный пользователь упирается в «полный» диск раньше, чем df покажет 100%. На большом диске с данными резерв можно уменьшить:

tune2fs -l /dev/sdb1 | grep -i "reserved block count"
tune2fs -m 1 /dev/sdb1

На системном разделе я резерв не трогаю — он нужен, чтобы при заполненном диске root мог зайти и навести порядок.