systemd-journald: разбор проблем с журналом
Журнал — первый инструмент разбора любого сбоя, поэтому проблемы самого журнала обходятся дорого: записей нет там, где их ищут. Три главные ловушки — журнал только в памяти, исчерпанный предел размера и отброшенные по ограничению частоты записи.
О службе
Служба принимает записи из четырёх источников: потоки вывода служб, сокет системного журнала, сообщения ядра и собственный сокет журнала. Всё складывается в двоичные файлы с индексами, поэтому поиск по полям (_SYSTEMD_UNIT, _PID, приоритет) работает быстро, а не перебором строк. Расплата — файлы нельзя читать обычными средствами для текста.
Хранение зависит от наличия каталога /var/log/journal. Если каталога нет, записи живут в /run и исчезают при перезагрузке — именно поэтому после сбоя с перезагрузкой разбирать бывает нечего. Режим задаётся параметром Storage= в настройках журнала: значение persistent создаёт каталог само.
Объём ограничен долей раздела, а частота записей — пределом на источник. Оба ограничения молча теряют данные: при исчерпании размера удаляются старые файлы, при превышении частоты отбрасываются новые записи с пометкой о числе отброшенных. Оба случая надо уметь замечать: иначе разбор идёт по неполной картине.
Как устроена
| Постоянное хранение | каталог /var/log/journal — есть он, есть и журнал после перезагрузки |
|---|---|
| Временное хранение | /run/log/journal, очищается при каждой загрузке |
| Предел объёма по умолчанию | десятая часть раздела, но не более 4 ГБ |
| Проверка целостности | journalctl --verify |
| Обрезка | journalctl --vacuum-size= и --vacuum-time=; активный файл не удаляется |
| Кто читает системный журнал | root и члены групп systemd-journal и adm |
Частые ошибки
12 записей базы отмечены за этой службой.
Конфигурация unit
- Журнал пропадает после перезагрузкиjournalctl не показывает записи прошлых загрузок: журнал хранится только в памяти. Как включить постоянное хранение.
Сообщения журнала
- Журнал занимает слишком много местаЖурнал разросся: где задаются пределы, как обрезать и почему обрезка иногда не помогает.
- Suppressed N messages from unit: часть записей потерянаjournald отбросил часть записей из-за ограничения частоты. Как понять, что именно потеряно, и когда предел нужно поднять.
- File corrupted or uncleanly shut down, renaming and replacingЖурнал повреждён после жёсткой перезагрузки: что означает сообщение и когда нужно вмешательство.
- Обычный пользователь не видит журнал службыjournalctl показывает только свои записи: доступ к системному журналу даёт членство в группе.
- journalctl -b -1: Failed to look up boot, no such boot IDЗапрос журнала прошлой загрузки не находит её: журнал непостоянный или обрезан.
- В журнале нет сообщений об ошибке, хотя служба падаетОшибки не видны: уровень подробности обрезан параметрами unit-файла или настройками журнала.
- rsyslog: ошибка файла состояния при чтении журналаПриёмник журналов теряет записи или читает их заново: файл состояния повреждён или недоступен.
- В журнале контейнера видны записи хостаЖурнал внутри контейнера показывает не то, что ожидалось: каталог журнала хоста проброшен внутрь.
- Журнал забит записями о сеансах: Started Session N of userКаждая проверка по ssh создаёт сеанс и три записи в журнале: полезные сообщения тонут в этом потоке.
- Записи дублируются: журнал и syslog пишут одно и то жеКаждая строка в журнале и в файлах syslog: пересылка включена дважды, объём растёт вдвое.
- Записи пользовательской службы не находятся обычным запросомjournalctl -u не находит записи: пользовательские службы требуют указания области.
Коды выхода этой службы
Числа в status=N ниже 200 назначает сама программа, 200 и выше — systemd, когда не смог подготовить запуск.
Диагностика
Сколько места занимает журнал прямо сейчас.
journalctl --disk-usageИтоговые настройки журнала со всеми переопределениями.
systemd-analyze cat-config systemd/journald.confПроверка целостности файлов журнала.
journalctl --verifyКакие загрузки сохранились: сразу видно, постоянный ли журнал.
journalctl --list-bootsБыли ли отброшены записи по ограничению частоты.
journalctl -b --no-pager | grep -i suppressed | tailПараметры unit, которые тут важны
- StandardOutput=куда идёт вывод службы: `journal` по умолчанию, `null` прячет всё
- LogLevelMax=обрезает уровень записей на входе — легко спрятать собственные ошибки
Частые вопросы
Почему journalctl -b -1 ничего не показывает?
Скорее всего журнал не постоянный: записи прошлых загрузок не сохраняются. Проверяется наличием каталога /var/log/journal и командой journalctl --list-boots.
Можно ли удалить файлы журнала вручную?
Лучше использовать обрезку: journalctl --vacuum-size= или --vacuum-time=. Удаление файлов активной службы оставляет занятые описатели, и место не освобождается до перезапуска службы журнала.
Почему обычный пользователь не видит записи служб?
Системный журнал читают root и члены групп systemd-journal и adm. Без членства видны только собственные записи пользователя.
Источники
- systemd-journald.service(8)
- journald.conf(5)
- journalctl(1)
- Воспроизведено на тестовой машине, systemd 255 (Ubuntu 24.04)