Почему после удаления файлов место не освобождается
Что проверяют
Умеете ли вы искать причину, а не перезагружать сервер. Место кончилось, файлы удалены, df по-прежнему показывает заполненный раздел: интервьюер смотрит, назовёте ли вы хотя бы три разных механизма и знаете ли команды, которыми проверяется каждый.
Как отвечать
Перечислите причины по частоте:
- удалённый, но открытый файл. Пока процесс держит дескриптор, inode жив и место занято. Видно через
lsof +L1, лечится перезапуском процесса или обнулением дескриптора командой: > /proc/PID/fd/N; - кончились inode, а не байты:
df -i. Симптом тот же самый, при этом свободных гигабайт сколько угодно; - файлы под точкой монтирования: их записали до монтирования, сверху смонтировали раздел, и снаружи содержимое не видно. Проверяется временным монтированием через
mount --bind; - снимки и тонкие тома: btrfs, ZFS, LVM и диски виртуальных машин держат блоки, пока жив снимок, а освобождение внутри гостя доходит до хранилища только с
discardилиfstrim; - слои контейнеров: удаление внутри контейнера не уменьшает образ, а логи живут в каталоге демона.
Порядок действий понятный: сначала df -h и df -i, затем du -x вниз по дереву, затем lsof +L1, и только потом снимки и монтирования.
Где спотыкаются
Удаляют активный лог через rm. Пишущий процесс держит дескриптор, место не возвращается, а запись продолжается в никуда. Правильно обнулить файл через truncate -s 0 или настроить ротацию с усечением.
Второе: доверяют du как единственному источнику правды. Он считает то, что видно в дереве, поэтому удалённые открытые файлы и содержимое под точкой монтирования в нём не появятся вовсе, и расхождение с df останется необъяснённым.
Третье: забывают про резерв для суперпользователя. На ext4 часть блоков зарезервирована, и обычный процесс получает отказ по месту, когда у root запас ещё есть. Смотрится это в tune2fs -l, но менять резерв стоит осознанно, он защищает систему от полной остановки.