Ротация и место на диске

Обновлено 19 июня 2026 · 6 мин чтения

Сценарий всегда один: df показывает сто процентов, сервис лёг, и надо освободить место прямо сейчас, а разбираться потом.

Найти виновника

Сначала — какой раздел

-h для читаемых размеров, -x tmpfs убирает виртуальные файловые системы из вывода.

df -h -x tmpfs -x devtmpfs

Потом — какой каталог

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

du -sh /* 2>/dev/null | sort -h | tail
du -sh /var/* 2>/dev/null | sort -h | tail

Крупные файлы точечно

find /var/log -type f -size +100M -printf '%10s %p\n' 2>/dev/null | sort -rn

Место кончилось, а du ничего не находит

Скорее всего, кончились не байты, а иноды. Такое бывает от миллионов мелких файлов в кэше или очереди.

df -i

Самая частая ошибка

rm на открытом логе не освобождает место

Пока процесс держит дескриптор, файл существует для ядра, хоть его и нет в каталоге. Место вернётся только после перезапуска сервиса.

# так не надо
rm /var/log/app/huge.log
# так правильно — обнулить, сохранив дескриптор
truncate -s 0 /var/log/app/huge.log
: > /var/log/app/huge.log

Если уже удалили

lsof +L1 показывает открытые файлы с нулевым числом ссылок — то есть удалённые, но всё ещё занимающие место.

lsof +L1 | head -20

Дальше два варианта: перезапустить процесс из колонки COMMAND либо обнулить файл через /proc: : > /proc/PID/fd/N, где N — номер дескриптора из вывода lsof.

logrotate

Минимальный рабочий конфиг

Кладётся в /etc/logrotate.d/app. Имя файла произвольное, расширения быть не должно.

/var/log/app/*.log {
daily
rotate 14
maxsize 200M
compress
delaycompress
missingok
notifempty
create 0640 app app
sharedscripts
postrotate
systemctl reload app > /dev/null 2>&1 || true
endscript
}

Что здесь важно

Когда приложение не умеет переоткрывать файл

copytruncate копирует содержимое и обнуляет оригинал, не трогая дескриптор. Ценой возможной потери строк, записанных между копированием и обнулением.

/var/log/legacy/*.log {
daily
rotate 7
compress
copytruncate
}

Проверить, не дожидаясь суток

-d — сухой прогон, ничего не меняет и показывает решения. -f — принудительная ротация.

logrotate -d /etc/logrotate.d/app
logrotate -f /etc/logrotate.d/app

Если -d говорит, что ротация не нужна, а вы уверены в обратном — посмотрите /var/lib/logrotate/status. Там записана дата последнего прогона по каждому шаблону.

Журнал systemd

Ограничить раз и навсегда

В /etc/systemd/journald.conf:

[Journal]
SystemMaxUse=500M
SystemMaxFileSize=50M
MaxRetentionSec=1month

Применить

systemctl restart systemd-journald
journalctl --disk-usage
var-log.online — личные заметки по администрированию. Примеры проверены на Debian и Ubuntu.