Как получить журнал загрузки ядра с помощью журналаctctl?

У меня на моей плате работает systemd / journald . Система была построена с помощью yocto ; systemd версия – 216.

Я хочу получить журнал загрузки ядра, который можно получить с помощью journalctl -k . Но, насколько я вижу, длинная версия этого параметра – --dmesg , что заставляет меня думать, что это извлекается из кольцевого буфера ядра. Очевидно, что если система работает несколько дней, я не могу получить эту информацию. Мое понимание здесь правильно?

Вопрос в том, есть ли опция для journald dump эту информацию сразу после загрузки системы? Если нет, достаточно ли просто вызвать в качестве последнего шага процесса загрузки вызов journalctl -k > dmesg.log ?

Очевидно, что если система работает несколько дней, я не могу получить эту информацию. Мое понимание здесь правильно?

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

Поэтому возьмите лист из FreeBSD и NetBSD и их производных. Все они имеют службы, которые запускаются один раз, при загрузке сразу после установки локальных файловых систем, которые просто выполняются:

  dmesg> /var/run/dmesg.boot 

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

Вам просто нужно написать службу systemd, которая делает то же самое. Используйте оболочку для перенаправления,

  ExecStart = / bin / sh -c "exec dmesg> /run/dmesg.boot" 

или использовать что-то вроде redirfd Laurent redirfd или redirfd набора инструментов fdredir

  ExecStart = / usr / local / bin / fdredir --write 1 /run/dmesg.boot dmesg 

Замените journalctl -k если вы хотите сделать снимок журнала systemd, а не только журналом ядра, и сделайте это Type=oneshot . Либо сделайте его multi-user.target помощью multi-user.target либо сделайте его DefaultDependencies=no который basic.target . Обратите внимание, что его не нужно заказывать после монтирования локальной файловой системы (например, local-fs.target ). Этот порядок необходим для FreeBSD и OpenBSD, потому что /var/run может быть файловой системой диска с ними. В системных операционных системах /run – это «файловая система API», созданная при загрузке перед любыми службами.

(Подход, который я лично предпочитаю, заключается не в том, чтобы в первую очередь иметь гигантский центральный лог-поток. Специальная служба подает только канал журнала ядра и регистрируется в частном каталоге журнала. Это занимает намного больше времени, чтобы достичь точки, в которой последний bootstrap информация прокручивается сверху, а также содержит журналы загрузки из предыдущих загрузок.

Однако это намного сложнее настроить в мире systemd, чем тот, который пишет /run/dmesg.boot . Однако это просто в семейном мире daemontools. Это тривиальное упражнение в использовании таких инструментов, как fifo-listen и klog-read или socklog . Проводя выходные данные через журнал dæmon, который записывается в закрытый, автоматически зависящий от размера каталог с автоматическим поворотом, входит в стандартную комплектацию с помощью службы daemontools / runit / s6 / nosh / perp.)

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

Если этого не достаточно, вы можете возиться с journald.conf

Затем он просто использует journalctl -t kernel (что похоже на -k , за исключением того, что оно также позволяет вам видеть предыдущие загрузки и использовать фильтры)

Журналы ядра копируются в журнал systemd. Вам не нужно делать это вручную.

ОПИСАНИЕ

systemd-journald – это системная служба, которая собирает и хранит данные регистрации. Он создает и поддерживает структурированные индексированные журналы на основе информации о регистрации, полученной из различных источников:

· Сообщения журнала ядра , через kmsg