Что означает ошибка journal-space-exhausted
Ошибка journal-space-exhausted (или No space left on device) возникает в systemd-journald, когда раздел диска, предназначенный для хранения журналов, заполнен. systemd-journald — это служба, которая собирает и хранит системные логи в бинарном формате. Когда место заканчивается, journald перестаёт записывать новые записи и может выводить сообщения об ошибке в консоль или в логи (если они ещё могут записываться). Это может привести к потере важной диагностической информации и, в некоторых случаях, к сбоям в работе других служб, зависящих от журналирования.
Полный текст ошибки в логах может выглядеть так:
systemd-journald[123]: Failed to write entry (4 of 4) to /var/log/journal/.../system.journal: No space left on device
или
systemd-journald[123]: /var/log/journal/.../system.journal: No space left on device
Причины возникновения
- Недостаточно места на разделе диска, где хранятся журналы. По умолчанию journald пишет в
/var/log/journal(на постоянном хранилище) и/run/log/journal(в оперативной памяти, если включено). Если раздел заполнен, ошибка неизбежна. - Отсутствие ротации логов. Если не настроены ограничения на размер или время хранения, журналы могут бесконечно расти.
- Очень высокий уровень логирования. Уровень логирования по умолчанию —
INFO, но если установленDEBUGилиTRACE, объем логов резко увеличивается. - Сбои в работе служб, которые генерируют огромное количество логов (например, цикличные ошибки в каком-то демоне).
- Раздел
/varили/заполнен другими данными, а не только журналами. Это может быть из-за старых пакетов, кэшей, временных файлов и т.д.
Способы решения
Способ 1: Очистка старых журналов
Самый быстрый способ — удалить часть старых записей, чтобы освободить место. systemd-journald предоставляет команду journalctl с опциями --vacuum-size и --vacuum-time.
Шаги:
- Определите текущий размер журналов:
journalctl --disk-usage
Пример вывода:Archived and active journals take up 1.2G on disk. - Очистите журналы, оставив, например, только последние 3 дня:
sudo journalctl --vacuum-time=3d
Или ограничьте общий размер журналов 100 МБ:sudo journalctl --vacuum-size=100M
Команда удалит самые старые записи, пока размер не станет меньше указанного. - Проверьте, сколько места освободилось:
journalctl --disk-usage
⚠️ Важно: Очистка удаляет данные безвозвратно. Убедитесь, что вам не нужны старые логи для расследования инцидентов.
Способ 2: Настройка ограничений размера в конфигурации
Чтобы предотвратить повторное заполнение, настройте параметры journald в конфигурационном файле.
Шаги:
- Откройте файл конфигурации:
sudo nano /etc/systemd/journald.conf
Или используйте любой текстовый редактор. - Найдите и раскомментируйте (удалите
#в начале строки) следующие параметры, установив разумные значения:[Journal] # Ограничивает общий размер архивных журналов на диске SystemMaxUse=100M # Ограничивает размер журнала в оперативной памяти (если Storage=volatile или Storage=auto и /run/log/journal существует) RuntimeMaxUse=50M # Максимальное время хранения записей (например, 30 дней) MaxRetentionSec=30d # Ограничивает размер отдельного файла журнала SystemMaxFileSize=10M
Подробнее о параметрах:man journald.conf. - Сохраните файл и перезапустите службу:
sudo systemctl restart systemd-journald - Проверьте статус:
sudo systemctl status systemd-journald
Убедитесь, что нет ошибок.
Способ 3: Отключение журналирования (не рекомендуется)
Если журналирование systemd не нужно (например, на встраиваемых системах с крайне ограниченными ресурсами), его можно отключить. Не делайте этого на production-серверах без веской причины, так как вы потеряете системные логи, необходимые для диагностики.
Шаги:
- Отредактируйте
/etc/systemd/journald.conf:[Journal] Storage=none - Удалите существующие журналы (если они есть):
sudo rm -rf /var/log/journal sudo rm -rf /run/log/journal - Перезапустите journald:
sudo systemctl restart systemd-journald - Проверьте, что служба работает без ошибок:
sudo systemctl status systemd-journald
Способ 4: Перемещение журналов на отдельный раздел
Если раздел /var постоянно заполняется, можно перенести журналы на отдельный диск или раздел. Это особенно полезно на серверах с ограниченным местом на системном разделе.
Шаги:
- Остановите службу journald:
sudo systemctl stop systemd-journald - Создайте точку монтирования для нового раздела, например,
/mnt/journal. Примонтируйте раздел (убедитесь, что он отформатирован в файловую систему, поддерживающую бинарные файлы, например, ext4). Или используйте отдельную директорию на другом разделе. - Скопируйте существующие журналы в новое место:
sudo cp -r /var/log/journal/* /mnt/journal/
Если журналы хранятся в/run/log/journal, они временные и копировать не нужно. - Удалите старые журналы из
/var/log/journal(или переместите, если хотите оставить резерв):sudo rm -rf /var/log/journal/* - Создайте символическую ссылку или отредактируйте монтирование. Рекомендуется монтировать новый раздел на
/var/log/journal. Для этого отредактируйте/etc/fstab:/dev/sdXN /var/log/journal ext4 defaults 0 2
Замените/dev/sdXNна ваш раздел. - Перемонтируйте все разделы:
sudo mount -a - Запустите journald:
sudo systemctl start systemd-journald - Проверьте, что журналы пишутся в новое место:
journalctl --disk-usage
И проверьте, что раздел смонтирован:df -h /var/log/journal
Профилактика
Чтобы избежать повторного возникновения ошибки journal-space-exhausted, выполните следующие рекомендации:
- Настройте ограничения размера журналов в
/etc/systemd/journald.confсразу после установки системы. Используйте параметрыSystemMaxUse,RuntimeMaxUseиMaxRetentionSec. Пример конфигурации:[Journal] SystemMaxUse=100M RuntimeMaxUse=50M MaxRetentionSec=30d
Это предотвратит бесконечный рост журналов. - Регулярно проверяйте использование диска для разделов, хранящих журналы (обычно
/var). Добавьте задание в cron, например, раз в день:#!/bin/bash USAGE=$(df /var/log/journal | awk 'NR==2 {print $5}' | tr -d '%') if [ "$USAGE" -gt 90 ]; then logger "Журналы systemd занимают более 90% места на /var/log/journal" # Можно добавить автоматическую очистку journalctl --vacuum-size=50M fi - Используйте отдельный раздел для
/var/log/journal, если на системном разделе мало места. Это изолирует журналы от других данных. - Избегайте уровня логирования
DEBUGилиTRACEна production-системах, если это не требуется. Установите уровень по умолчаниюINFOчерезsystemctlили в конфигурации сервисов. - Мониторьте системные логи на предмет частых сообщений об ошибках, которые могут указывать на проблему до заполнения диска. Используйте инструменты вроде
journalctl -fили централизованное логирование. - Регулярно выполняйте очистку временных файлов и кэшей пакетов (
apt clean,yum clean all), чтобы высвободить место на разделе/var.
Для получения дополнительной информации по настройке journald обратитесь к руководству:
man journald.conf