Journaldはカーネルから開始メッセージをどのように取得しますか?

Journaldはカーネルから開始メッセージをどのように取得しますか?

私はsystemd-journaldがカーネルの起動後にロギングを開始し、ストレージやネットワークサービスなどのシステムを設定するのに時間がかかると思います。ただし、ログログにはdmesgなどのカーネルメッセージがあり、実際のタイムスタンプもあります。ただし、カーネルは初期段階でRTCから実際の日時を回復する機会がありません。 Journaldはどのようにカーネルログメッセージを取得または表示しますか?

答え1

/dev/kmsgJournaldはカーネルログを含むリングバッファから読み込みます。dmesg同じバッファにアクセスします。私はログが始まるまで、最初のカーネルログの「実際の日時」は非常に正確であるとは思わない。

ここに例があります。dmesgどちらもjournalctl開始と同じオフセットを表示します。

root@ubuntu:~# dmesg | head -n 1
[    0.000000] Linux version 5.4.0-131-generic (buildd@lcy02-amd64-108) (gcc version 9.4.0 (Ubuntu 9.4.0-1ubuntu1~20.04.1)) #147-Ubuntu SMP Fri Oct 14 17:07:22 UTC 2022 (Ubuntu 5.4.0-131.147-generic 5.4.210)

root@ubuntu:~# journalctl --quiet -k -b --output short-monotonic | head -n 1
[    0.000000] ubuntu kernel: Linux version 5.4.0-131-generic (buildd@lcy02-amd64-108) (gcc version 9.4.0 (Ubuntu 9.4.0-1ubuntu1~20.04.1)) #147-Ubuntu SMP Fri Oct 14 17:07:22 UTC 2022 (Ubuntu 5.4.0-131.147-generic 5.4.210)

ただし、初期カーネルログメッセージの実際の時間は9秒以上異なります。

root@ubuntu:~# dmesg --time-format iso | head -n 1
2022-11-02T20:29:35,000000+00:00 Linux version 5.4.0-131-generic (buildd@lcy02-amd64-108) (gcc version 9.4.0 (Ubuntu 9.4.0-1ubuntu1~20.04.1)) #147-Ubuntu SMP Fri Oct 14 17:07:22 UTC 2022 (Ubuntu 5.4.0-131.147-generic 5.4.210)

root@ubuntu:~# journalctl --quiet -k -b --output short-iso-precise | head -n 1
2022-11-02T20:29:44.345820+0000 ubuntu kernel: Linux version 5.4.0-131-generic (buildd@lcy02-amd64-108) (gcc version 9.4.0 (Ubuntu 9.4.0-1ubuntu1~20.04.1)) #147-Ubuntu SMP Fri Oct 14 17:07:22 UTC 2022 (Ubuntu 5.4.0-131.147-generic 5.4.210)

最初のカーネルログの「リアルタイム」の違いがログが始まるまでにかかる時間に近いのが偶然かどうか疑問に思います。

[    8.335415] systemd[1]: Started Journal Service.

Journaldが始まった後の「リアルタイム」距離は非常にdmesg近いですjournalctlが、まったく同じではありません。

別の例があります。新しいカーネルログを作成します。

root@ubuntu:~# echo "THE TIME IS NOW: $(date --iso-8601=ns)" | tee /dev/kmsg
THE TIME IS NOW: 2022-11-02T22:17:22,986374849+00:00

オフセットは同じままです。

root@ubuntu:~# dmesg | tail -n 1
[ 6467.404507] THE TIME IS NOW: 2022-11-02T22:17:22,986374849+00:00

root@ubuntu:~# journalctl --quiet -b -k --output short-monotonic | tail -n 1
[ 6467.404507] ubuntu unknown: THE TIME IS NOW: 2022-11-02T22:17:22,986374849+00:00

「リアルタイム」はまだ少し異なります。

root@ubuntu:~# dmesg --time-format iso | tail -n 1
2022-11-02T22:17:22,404507+00:00 THE TIME IS NOW: 2022-11-02T22:17:22,986374849+00:00

root@ubuntu:~# journalctl --quiet -b -k --output short-iso-precise | tail -n 1
2022-11-02T22:17:22.988718+0000 ubuntu unknown: THE TIME IS NOW: 2022-11-02T22:17:22,986374849+00:00

dmesg私たちは一生懸命働いていると信じています時間計算journalctl使用時のオフセット__REALTIME_TIMESTAMPフィールド日記帳に含まれる。もう少し確実になってほしいです。

関連情報