Короткий ответ

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нарезка файлов

Возможные причины

  1. Нет SystemMaxUse, дефолт — процент ФС, на большом диске journal растёт гигабайтами.
  2. Сервис в debug spam (nginx access в journal, java stack каждую секунду).
  3. ForwardToDisk + rsyslog дубли.
  4. Много boot не vacuum (journalctl --list-boots).
  5. 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-usage

800M подставьте под свободное место. Не 1s retention.

Сценарий B. Постоянный лимит + срок

/etc/systemd/journald.conf.d/size.conf:

[Journal]
Storage=persistent
SystemMaxUse=1G
SystemKeepFree=2G
MaxRetentionSec=14day
SystemMaxFileSize=128M
sudo mkdir -p /etc/systemd/journald.conf.d
sudo systemctl restart systemd-journald
journalctl --disk-usage

restart 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.export

export формат восстанавливается 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 как в статье про диск.