Настройка лимитов журнала systemd: оптимизация использования диска и ротация логов

Настройте размер журнала systemd и ограничения по времени хранения с помощью `journald.conf`, `journalctl` и безопасных команд очистки логов.

Настройка лимитов журнала systemd: оптимизация использования диска и ротация логов

Системные логи полезны, пока они незаметно не заполнят диск. На Linux-системах, использующих systemd, systemd-journald хранит индексированные логи и может принудительно устанавливать ограничения по размеру и возрасту, чтобы ваш журнал сохранял достаточно истории, не вытесняя остальную часть системы.

Это руководство показывает, где настраивать лимиты журнала systemd, чем различаются постоянное и временное хранилище, а также как проверять очистку с помощью journalctl.

Понимание режимов хранения журнала

Прежде чем устанавливать лимиты, важно понимать, где журнал хранит свои логи. systemd-journald поддерживает два основных режима хранения, определяемых директивой Storage= в journald.conf.

1. Временное хранилище (/run/log/journal)

Временное хранилище хранит логи во временной файловой системе, обычно tmpfs или каталоге, поддерживаемом памятью. Логи, хранящиеся здесь, теряются при перезагрузке системы.

  • Сценарий использования: Сильно временные логи, среды с ограниченными ресурсами, где не требуется постоянная история.
  • Конфигурация: Установите Storage=volatile.

2. Постоянное хранилище (/var/log/journal)

Постоянное хранилище гарантирует, что логи сохраняются после перезагрузок системы, что делает его стандартным выбором для серверов и производственных систем. Каталог /var/log/journal создается, если он еще не существует.

  • Сценарий использования: Производственные системы, требующие аудиторских следов и исторического анализа.
  • Конфигурация: Установите Storage=persistent или Storage=auto (по умолчанию, которое активирует постоянное хранилище, если существует /var/log/journal).

Совет: Если система настроена на Storage=auto, а /var/log/journal не существует, логи по умолчанию будут храниться во временном хранилище, пока не будет создан постоянный каталог.

Основной конфигурационный файл

Все основные лимиты и поведение systemd-journald управляются через основной конфигурационный файл, обычно расположенный по адресу /etc/systemd/journald.conf.

# Редактирование основного конфигурационного файла
sudo nano /etc/systemd/journald.conf

Чтобы будущие обновления пакетов не перезаписали ваши настройки, рекомендуется создать файл переопределения в каталоге /etc/systemd/journald.conf.d/. Например, создайте /etc/systemd/journald.conf.d/01-custom-limits.conf.

Реализация ограничений по размеру для оптимизации диска

Наиболее распространенный метод контроля роста журнала — установка максимальных лимитов использования диска. Когда указанный размер превышен, journald автоматически начинает удалять самые старые архивированные логи, пока лимит не будет достигнут.

SystemMaxUse (Абсолютный постоянный лимит)

Эта директива определяет максимальное общее дисковое пространство, которое могут занимать постоянные файлы журнала (/var/log/journal). Это основной механизм контроля использования постоянного диска.

Файлы журнала будут ротироваться и очищаться, если общий размер превышает это значение. Обычные единицы измерения включают K (килобайты), M (мегабайты), G (гигабайты) и T (терабайты).

Директива Описание Пример значения
SystemMaxUse Максимальный размер для постоянных данных журнала. 500M или 2G

Пример конфигурации:

Чтобы ограничить постоянное хранилище журнала максимум 1 Гигабайтом:

[Journal]
SystemMaxUse=1G

SystemKeepFree (Буфер безопасности диска)

В то время как SystemMaxUse устанавливает верхнюю границу, SystemKeepFree действует как важная мера безопасности. Он указывает минимальный объем дискового пространства, который должен оставаться свободным в файловой системе, содержащей файлы журнала.

Если доступное свободное пространство падает ниже значения SystemKeepFree, journald очистит логи, даже если лимит SystemMaxUse еще не достигнут. Это предотвращает полное заполнение диска ростом логов и остановку критических системных операций.

Директива Описание Пример значения
SystemKeepFree Минимальное свободное пространство, необходимое в файловой системе журнала. 10% или 4G

Лучшая практика: Настоятельно рекомендуется устанавливать как SystemMaxUse, так и SystemKeepFree. Используйте процент (%) для SystemKeepFree на больших дисках для лучшей масштабируемости.

RuntimeMaxUse (Лимит временного хранилища)

Если вы используете временное хранилище (/run/log/journal) или хотите контролировать использование памяти/tmpfs даже при включенном постоянном хранилище, используйте RuntimeMaxUse. Это контролирует дисковое пространство, используемое временными файлами журнала, которые являются временными и находятся в памяти или tmpfs.

Директива Описание Пример значения
RuntimeMaxUse Максимальный размер для временных данных журнала. 300M

Реализация временных ограничений для хранения логов

Лимиты на основе размера гарантируют поддержание дискового пространства, но не гарантируют возраст логов. Если объем логов низкий, логи могут храниться бесконечно. Лимиты на основе времени гарантируют, что логи будут удалены после определенного периода, независимо от общего размера.

MaxRetentionSec

Эта директива определяет максимальное время хранения логов. Любые логи старше этого срока будут автоматически удалены, дополняя лимиты по размеру.

Директива Описание Пример значения
MaxRetentionSec Максимальный возраст хранимых логов. 30 days, 1 month, 2 weeks

Пример конфигурации:

Чтобы гарантировать, что логи никогда не будут старше 30 дней, а общее постоянное хранилище никогда не превысит 5 Гигабайт:

[Journal]
Storage=persistent
SystemMaxUse=5G
SystemKeepFree=10%
MaxRetentionSec=30 days

Примечание: Если MaxRetentionSec установлен на 30 дней, а SystemMaxUse на 5G, journald будет соблюдать лимит, который будет достигнут первым. Если лимит в 5G будет достигнут за 10 дней, логи старше 10 дней будут удалены, переопределяя политику хранения в 30 дней.

Практические шаги: применение и проверка конфигурации

1. Проверка текущего использования журнала

Перед внесением изменений проверьте текущее использование диска журналом:

journalctl --disk-usage

Пример вывода:

Journals take up 3.4G of disk space.

2. Настройка лимитов

Отредактируйте /etc/systemd/journald.conf (или ваш файл переопределения) и раскомментируйте/установите нужные директивы. Например, чтобы обеспечить максимальное использование 500 МБ и хранение в течение 30 дней:

[Journal]
Storage=persistent
SystemMaxUse=500M
SystemKeepFree=1G
MaxRetentionSec=30 days

3. Перезапуск службы журнала

Чтобы изменения вступили в силу, необходимо перезапустить службу systemd-journald. Это не влияет на активное ведение логов, но сообщает демону о необходимости немедленно применить новые ограничения по размеру и начать процесс очистки.

sudo systemctl restart systemd-journald

4. Принудительная ручная очистка

Если необходимо немедленно освободить дисковое пространство в соответствии с новыми лимитами, перезапуска службы часто достаточно. В качестве альтернативы вы можете явно очистить файлы с помощью journalctl.

Чтобы очистить логи для освобождения места, оставив только последние 500 МБ:

sudo journalctl --vacuum-size=500M

Чтобы очистить логи старше 7 дней:

sudo journalctl --vacuum-time=7d

Сводка ключевых директив

Директива Область действия Назначение
Storage Глобальная Определяет место хранения (persistent, volatile, auto).
SystemMaxUse Постоянное (/var/log/journal) Абсолютный максимальный общий размер для постоянных логов.
SystemKeepFree Постоянное (/var/log/journal) Обеспечивает минимальный объем свободного дискового пространства.
RuntimeMaxUse Временное (/run/log/journal) Абсолютный максимальный общий размер для временных (runtime) логов.
MaxRetentionSec Оба Определяет максимальный возраст хранимых логов.

Вывод

Устанавливайте лимиты журнала до того, как логи станут причиной сбоя. Для большинства серверов используйте drop-in в /etc/systemd/journald.conf.d/, установите SystemMaxUse плюс SystemKeepFree, добавьте MaxRetentionSec, если у вас есть цель по хранению, перезапустите systemd-journald и подтвердите результат с помощью journalctl --disk-usage.