Linux ENOSPCВысокая

Ошибка journal-space-exhausted в systemd: причины и способы исправления

Статья объясняет, что означает ошибка journal-space-exhausted в systemd-journald и как её исправить. Вы узнаете, как очистить старые логи и настроить ограничение размера журнала.

Обновлено 16 февраля 2026 г.
10-15 мин
Средняя
FixPedia Team
Применимо к:Ubuntu 20.04+Debian 10+CentOS 8+Fedora 35+

Что означает ошибка 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

Причины возникновения

  1. Недостаточно места на разделе диска, где хранятся журналы. По умолчанию journald пишет в /var/log/journal (на постоянном хранилище) и /run/log/journal (в оперативной памяти, если включено). Если раздел заполнен, ошибка неизбежна.
  2. Отсутствие ротации логов. Если не настроены ограничения на размер или время хранения, журналы могут бесконечно расти.
  3. Очень высокий уровень логирования. Уровень логирования по умолчанию — INFO, но если установлен DEBUG или TRACE, объем логов резко увеличивается.
  4. Сбои в работе служб, которые генерируют огромное количество логов (например, цикличные ошибки в каком-то демоне).
  5. Раздел /var или / заполнен другими данными, а не только журналами. Это может быть из-за старых пакетов, кэшей, временных файлов и т.д.

Способы решения

Способ 1: Очистка старых журналов

Самый быстрый способ — удалить часть старых записей, чтобы освободить место. systemd-journald предоставляет команду journalctl с опциями --vacuum-size и --vacuum-time.

Шаги:

  1. Определите текущий размер журналов:
    journalctl --disk-usage
    

    Пример вывода: Archived and active journals take up 1.2G on disk.
  2. Очистите журналы, оставив, например, только последние 3 дня:
    sudo journalctl --vacuum-time=3d
    

    Или ограничьте общий размер журналов 100 МБ:
    sudo journalctl --vacuum-size=100M
    

    Команда удалит самые старые записи, пока размер не станет меньше указанного.
  3. Проверьте, сколько места освободилось:
    journalctl --disk-usage
    

⚠️ Важно: Очистка удаляет данные безвозвратно. Убедитесь, что вам не нужны старые логи для расследования инцидентов.

Способ 2: Настройка ограничений размера в конфигурации

Чтобы предотвратить повторное заполнение, настройте параметры journald в конфигурационном файле.

Шаги:

  1. Откройте файл конфигурации:
    sudo nano /etc/systemd/journald.conf
    

    Или используйте любой текстовый редактор.
  2. Найдите и раскомментируйте (удалите # в начале строки) следующие параметры, установив разумные значения:
    [Journal]
    # Ограничивает общий размер архивных журналов на диске
    SystemMaxUse=100M
    # Ограничивает размер журнала в оперативной памяти (если Storage=volatile или Storage=auto и /run/log/journal существует)
    RuntimeMaxUse=50M
    # Максимальное время хранения записей (например, 30 дней)
    MaxRetentionSec=30d
    # Ограничивает размер отдельного файла журнала
    SystemMaxFileSize=10M
    

    Подробнее о параметрах: man journald.conf.
  3. Сохраните файл и перезапустите службу:
    sudo systemctl restart systemd-journald
    
  4. Проверьте статус:
    sudo systemctl status systemd-journald
    

    Убедитесь, что нет ошибок.

Способ 3: Отключение журналирования (не рекомендуется)

Если журналирование systemd не нужно (например, на встраиваемых системах с крайне ограниченными ресурсами), его можно отключить. Не делайте этого на production-серверах без веской причины, так как вы потеряете системные логи, необходимые для диагностики.

Шаги:

  1. Отредактируйте /etc/systemd/journald.conf:
    [Journal]
    Storage=none
    
  2. Удалите существующие журналы (если они есть):
    sudo rm -rf /var/log/journal
    sudo rm -rf /run/log/journal
    
  3. Перезапустите journald:
    sudo systemctl restart systemd-journald
    
  4. Проверьте, что служба работает без ошибок:
    sudo systemctl status systemd-journald
    

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

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

Шаги:

  1. Остановите службу journald:
    sudo systemctl stop systemd-journald
    
  2. Создайте точку монтирования для нового раздела, например, /mnt/journal. Примонтируйте раздел (убедитесь, что он отформатирован в файловую систему, поддерживающую бинарные файлы, например, ext4). Или используйте отдельную директорию на другом разделе.
  3. Скопируйте существующие журналы в новое место:
    sudo cp -r /var/log/journal/* /mnt/journal/
    

    Если журналы хранятся в /run/log/journal, они временные и копировать не нужно.
  4. Удалите старые журналы из /var/log/journal (или переместите, если хотите оставить резерв):
    sudo rm -rf /var/log/journal/*
    
  5. Создайте символическую ссылку или отредактируйте монтирование. Рекомендуется монтировать новый раздел на /var/log/journal. Для этого отредактируйте /etc/fstab:
    /dev/sdXN /var/log/journal ext4 defaults 0 2
    

    Замените /dev/sdXN на ваш раздел.
  6. Перемонтируйте все разделы:
    sudo mount -a
    
  7. Запустите journald:
    sudo systemctl start systemd-journald
    
  8. Проверьте, что журналы пишутся в новое место:
    journalctl --disk-usage
    

    И проверьте, что раздел смонтирован:
    df -h /var/log/journal
    

Профилактика

Чтобы избежать повторного возникновения ошибки journal-space-exhausted, выполните следующие рекомендации:

  1. Настройте ограничения размера журналов в /etc/systemd/journald.conf сразу после установки системы. Используйте параметры SystemMaxUse, RuntimeMaxUse и MaxRetentionSec. Пример конфигурации:
    [Journal]
    SystemMaxUse=100M
    RuntimeMaxUse=50M
    MaxRetentionSec=30d
    

    Это предотвратит бесконечный рост журналов.
  2. Регулярно проверяйте использование диска для разделов, хранящих журналы (обычно /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
    
  3. Используйте отдельный раздел для /var/log/journal, если на системном разделе мало места. Это изолирует журналы от других данных.
  4. Избегайте уровня логирования DEBUG или TRACE на production-системах, если это не требуется. Установите уровень по умолчанию INFO через systemctl или в конфигурации сервисов.
  5. Мониторьте системные логи на предмет частых сообщений об ошибках, которые могут указывать на проблему до заполнения диска. Используйте инструменты вроде journalctl -f или централизованное логирование.
  6. Регулярно выполняйте очистку временных файлов и кэшей пакетов (apt clean, yum clean all), чтобы высвободить место на разделе /var.

Для получения дополнительной информации по настройке journald обратитесь к руководству:

man journald.conf

Часто задаваемые вопросы

Почему возникает ошибка journal-space-exhausted?
Как проверить, сколько места занимают журналы systemd?
Можно ли отключить журналирование systemd?
Как настроить автоматическую очистку старых логов?

Полезное

Проверьте, какой раздел заполнен
Очистите старые журналы
Настройте ограничения размера в конфигурации
Перезапустите службу systemd-journald
Настройте регулярную очистку (опционально)

Эта статья помогла вам решить проблему?