Короткий ответ
journalctl --disk-usage показывает, сколько занимает journal. Срочно: --vacuum-size= до разумного (например 300M–1G), не --vacuum-time=1s если завтра нужна ретроспектива инцидента. Постоянно: /etc/systemd/journald.conf SystemMaxUse= и MaxRetentionSec= под вашу политику (7–30 дней типично). Не Storage=none — выключите историю. Persistent journal — каталог /var/log/journal; volatile — /run/log/journal.
Хост host.example (10.0.20.10). Связь с заполненным диском: journal часто главный, но не единственный потребитель.
Симптомы и как отличить
du -sh /var/log/journalогромный,df -h /100%;df -iтоже может расти от множества файлов journal — inode;- rsyslog
/var/log/syslogотдельно — чистка journal не трогает syslog файлы; - unit не стартует из‑за ENOSPC — systemd.
| Директива | Эффект |
|---|---|
| SystemMaxUse | потолок диска persistent |
| SystemKeepFree | оставить свободным на ФС |
| MaxRetentionSec | возраст |
| SystemMaxFileSize | нарезка файлов |
Возможные причины
- Нет
SystemMaxUse, дефолт — процент ФС, на большом диске journal растёт гигабайтами. - Сервис в debug spam (nginx access в journal, java stack каждую секунду).
ForwardToDisk+ rsyslog дубли.- Много boot не vacuum (
journalctl --list-boots). - Rate limiting выключен, flood.
Диагностика
journalctl --disk-usage
sudo du -sh /var/log/journal /run/log/journal
sudo du --inodes -s /var/log/journal
journalctl --list-boots
ls -l /etc/systemd/journald.conf /etc/systemd/journald.conf.d/ 2>/dev/null
grep -v '^#' /etc/systemd/journald.confКто пишет больше:
journalctl --since '24 hours ago' -o json | jq -r '._SYSTEMD_UNIT // .SYSLOG_IDENTIFIER' 2>/dev/null | sort | uniq -c | sort -n | tailБез jq грубее:
journalctl --since 'today' --output=short-iso | awk '{print $5}' | sort | uniq -c | sort -n | tailДиск в целом:
df -h / /var
df -i /Решение
Сценарий A. Срочно место, сохранить неделю
Скопируйте наружу нужное:
journalctl -b -1 -o export > /mnt/backup/journal-boot-prev.export
sudo journalctl --vacuum-size=800M
journalctl --disk-usage800M подставьте под свободное место. Не 1s retention.
Сценарий B. Постоянный лимит + срок
/etc/systemd/journald.conf.d/size.conf:
[Journal]
Storage=persistent
SystemMaxUse=1G
SystemKeepFree=2G
MaxRetentionSec=14day
SystemMaxFileSize=128Msudo mkdir -p /etc/systemd/journald.conf.d
sudo systemctl restart systemd-journald
journalctl --disk-usagerestart journald безопасен для ssh. Срок 14 дней vs size: что раньше сработает, то обрежет.
Сценарий C. Спам одного unit
Чините приложение, LogRateLimitIntervalSec= / Burst в journald.conf. Не vacuum каждые 10 минут cron как стратегия.
Сценарий D. Volatile only (не рекомендуется как «hardening»)
Storage=volatile переживает reboot. Для production сервера нужен persistent, иначе OOM после reboot без улик.
Политика хранения: размер, дни и юридические требования
Сначала спросите, сколько дней логов нужно для разбора инцидента и для аудита. MaxRetentionSec=14day при SystemMaxUse=200M на болтливом хосте даст меньше 14 дней. Тогда либо режьте спам unit, либо увеличьте MaxUse, либо выносите journal на отдельный LV.
Копирование наружу:
journalctl --since '2026-09-01' --until '2026-09-08' -u ssh.service -o export > /mnt/backup/ssh-week.exportexport формат восстанавливается journalctl --file. Не храните export на том же заполненном /.
ForwardToSyslog=yes плюс rsyslog в /var/log/syslog без logrotate — вы почистите journal и всё равно упрётесь в syslog. На 24.04 rsyslog может быть не установлен: тогда только journal.
Storage=auto создаёт persistent при наличии каталога /var/log/journal. Если каталог удалили «для места», journal уйдёт в volatile и после reboot улики OOM исчезнут. Создайте каталог снова и systemd-tmpfiles --create --prefix /var/log/journal либо просто restart journald после mkdir.
Секреты в journal: не логируйте токены. Vacuum не замена ротации секретов.
journalctl --vacuum-files=2 оставляет N файлов, не дни. На хосте с огромными SystemMaxFileSize два файла = всё ещё гигабайты. Для инцидента предпочитайте --vacuum-size после export.
Права /var/log/journal: каталоги 2755 root:systemd-journal. Если вы chmod -R 777 «чтобы читать», сломаете sealed файлы и ACL adm. Пользователь admin в группе adm/systemd-journal читает без root:
id admin
ls -ld /var/log/journalНе vacuum от cron каждую минуту: journald сам ротирует по MaxUse. Cron vacuum гоняет диск вхолостую и рвёт чтение логов во время инцидента.
journalctl --disk-usage суммирует archived + active. Сразу после --vacuum-size=300M usage может быть чуть выше из-за активного файла. Подождите rotate (journalctl --rotate) и повторите usage.
На отдельном LV /var/log лимит journal всё равно нужен: иначе заполните только этот LV и получите ENOSPC на логах при живом корне. Алерт df по /var/log отдельно.
Секреты: logger "token=..." попадёт в journal. Vacuum не стерет бэкапы journal export. Политика: не логировать секреты, плюс ACL на /var/log/journal.
Как проверить, что проблема устранена
df -h /
journalctl --disk-usage
touch /tmp/.j-ok && rm /tmp/.j-ok
journalctl -u systemd-journald -n 10 --no-pagerЧерез сутки usage не превышает SystemMaxUse существенно (есть гистерезис). Старые boot старше retention исчезли, последние 14 дней на месте.
Если не помогло
- Usage снова растёт за час: flood, найдите unit.
/varотдельный маленький LV — лимит всё равно нужен, или расширьте LV.- syslog файлы 50G — logrotate, не journald.
Профилактика
- Сразу на новом Ubuntu Server drop-in MaxUse.
- Алерт
journalctl --disk-usageи df. - Не логировать access-log высоких RPS в journal.
- Экспорт критичных инцидентов в ticketing до vacuum.
- На хостах с болтливыми unit заранее
LogRateLimitIntervalSecи отдельный LV под/var/log, иначе MaxUse 1G всё равно кончится за ночь. - После смены
journald.confпроверяйтеsystemctl show systemd-journald -p Environmentне нужен: достаточноjournalctl --disk-usageна следующие сутки и факт, чтоjournalctl -b -1ещё читается.
FAQ
Чем vacuum-size от vacuum-time?
Size режет объём, time — возраст. Можно оба; сработает ограничение, которое наступит раньше.
journalctl --rotate?
Закрывает текущий файл, помогает перед vacuum. Не удаляет политику.
Нужен ли rsyslog ещё?
Многие оставляют для /var/log/auth.log совместимости. Тогда два потребителя диска — крутите оба.
Compress=yes?
По умолчанию часто да. Не замена MaxUse.
Почему после vacuum df не изменился?
Open-deleted, другой каталог, reserved blocks. Снова du vs df как в статье про диск.