dmesgのタイムスタンプは起動からの経過秒
dmesgでカーネルのメッセージを確認すると、行頭の角括弧に数値が並ぶ。
$ dmesg | tail -4
[1500839.421998] veth63e4340: entered promiscuous mode
[1500839.498290] eth0: renamed from vethd6a1e0d
[1500839.507428] docker0: port 1(veth63e4340) entered blocking state
[1500839.507434] docker0: port 1(veth63e4340) entered forwarding state
1500839.421998は起動からの経過秒である。
アプリケーションのログやアラートの発生時刻と突き合わせたい場面では、経過秒のままでは扱いにくい。
-Tで日時として表示する
-Tオプションを付けると、経過秒を日時に変換して表示する。
$ dmesg -T | tail -4
[Tue Aug 11 14:45:25 2026] veth63e4340: entered promiscuous mode
[Tue Aug 11 14:45:25 2026] eth0: renamed from vethd6a1e0d
[Tue Aug 11 14:45:25 2026] docker0: port 1(veth63e4340) entered blocking state
[Tue Aug 11 14:45:25 2026] docker0: port 1(veth63e4340) entered forwarding state
dmesgが起動時刻と経過秒を足して日時を求めている。
先頭のメッセージの時刻は、uptime -sが示す起動時刻と一致する。
$ uptime -s
2026-07-25 05:51:25
$ dmesg -T | head -1
[Sat Jul 25 05:51:25 2026] Booting Linux on physical CPU 0x0000000000 [0x610f0000]
uptime -sは【Linux】uptime -sでシステムの起動時刻を表示する
を参照。
表示される日時のタイムゾーン
-Tはシステムのローカルタイムゾーンで日時を表示する。
タイムゾーンはTZ環境変数で切り替えられる。
$ TZ=UTC dmesg -T | tail -1
[Tue Aug 11 05:45:25 2026] docker0: port 1(veth63e4340) entered forwarding state
$ TZ=Asia/Tokyo dmesg -T | tail -1
[Tue Aug 11 14:45:25 2026] docker0: port 1(veth63e4340) entered forwarding state
サーバーをUTCで運用している場合、日本時間で読みたければTZ=Asia/Tokyoを付けて実行する。
秒未満まで確認する(–time-format=iso)
-Tの表示は秒単位で、それより細かい値は落ちる。
先ほどの4行はすべて14:45:25と表示されており、順序はわかっても間隔はわからない。
--time-format=isoを使うとマイクロ秒とタイムゾーンオフセットまで表示する。
$ dmesg --time-format=iso | tail -4
2026-08-11T14:45:25,410835+09:00 veth63e4340: entered promiscuous mode
2026-08-11T14:45:25,487127+09:00 eth0: renamed from vethd6a1e0d
2026-08-11T14:45:25,496265+09:00 docker0: port 1(veth63e4340) entered blocking state
2026-08-11T14:45:25,496271+09:00 docker0: port 1(veth63e4340) entered forwarding state
フォーマットが固定長のため、他のログとマージしてソートする用途にも向く。
前のメッセージからの経過時間を見る(-e)
障害調査ではメッセージの間隔が手がかりになる。
-eは日時と、1つ前のメッセージからの経過時間を表示する。
$ dmesg -e | tail -4
[ +0.000021] veth63e4340: entered promiscuous mode
[ +0.076292] eth0: renamed from vethd6a1e0d
[ +0.009138] docker0: port 1(veth63e4340) entered blocking state
[ +0.000006] docker0: port 1(veth63e4340) entered forwarding state
分が変わるタイミングでは[Aug11 14:46]のように日時の行を挟むため、絶対時刻も追える。
$ dmesg -e | tail -8
[ +0.000003] docker0: port 1(vethd93eb6f) entered disabled state
[Aug11 14:46] docker0: port 1(veth3177228) entered blocking state
[ +0.000006] docker0: port 1(veth3177228) entered disabled state
[ +0.000070] veth3177228: entered allmulticast mode
[ +0.000028] veth3177228: entered promiscuous mode
[ +0.076264] eth0: renamed from veth729bfe8
[ +0.010159] docker0: port 1(veth3177228) entered blocking state
[ +0.000005] docker0: port 1(veth3177228) entered forwarding state
日時の行を挟まず経過時間だけを見たい場合は--time-format=deltaを使う。
$ dmesg --time-format=delta | tail -4
[< 0.000021>] veth63e4340: entered promiscuous mode
[< 0.076292>] eth0: renamed from vethd6a1e0d
[< 0.009138>] docker0: port 1(veth63e4340) entered blocking state
[< 0.000006>] docker0: port 1(veth63e4340) entered forwarding state
時刻フォーマットの一覧
--time-formatに指定できる値は以下の5種類である。
| 値 | 表示 | 同じ意味のオプション |
|---|---|---|
| raw | 起動からの経過秒(デフォルト) | - |
| ctime | 秒単位の日時 | -T |
| iso | マイクロ秒とタイムゾーン付きの日時 | - |
| reltime | 前のメッセージからの経過時間と日時 | -e |
| delta | 前のメッセージからの経過時間のみ | - |
-Hを付けるとreltime表示に色付けとページャが加わる。
ページャを挟まず出力したい場合は--nopagerを併用する。
$ dmesg -H --nopager | tail -4
期間を指定して絞り込む(–since、–until)
--since、--untilで期間を絞り込める。
-Tと組み合わせると、絞り込んだ範囲を日時付きで確認できる。
$ dmesg -T --since "2026-08-11 14:40" --until "2026-08-11 14:50" | head -3
[Tue Aug 11 14:43:02 2026] docker0: port 1(veth7ede1bb) entered blocking state
[Tue Aug 11 14:43:02 2026] docker0: port 1(veth7ede1bb) entered disabled state
[Tue Aug 11 14:43:02 2026] veth7ede1bb: entered allmulticast mode
-30minのような相対指定もできる。
$ dmesg -T --since "-30min" | tail -3
ログレベルで絞り込む(-l)
エラーや警告だけに絞りたい場合は-lでログレベルを指定する。
$ dmesg -T -l err,warn | tail -2
[Sat Jul 25 05:51:26 2026] FAT-fs (vda15): Volume was not properly unmounted. Some data may be corrupt. Please run fsck.
[Sun Jul 26 16:19:56 2026] hrtimer: interrupt took 16296216 ns
リアルタイム表示と組み合わせる(-w)
-wは新しいメッセージを待ち受けて表示し続ける。
-Tと組み合わせるとtail -fのように日時付きで追える。
$ dmesg -wT
-Tの時刻がずれる場合
-Tが表示する日時は、起動時刻と経過秒から計算した値である。
カーネルのタイムスタンプはサスペンド中に進まないモノトニッククロックを使うため、サスペンドとレジュームを挟むと表示される日時が実際の発生時刻からずれる。
起動後にNTPで時刻が大きく補正された場合も同様にずれる。
manページにも「timestamp could be inaccurate」と明記されている。
ノートPCのようにサスペンドを繰り返す環境で正確な時刻が必要な場合は、systemdのジャーナルからカーネルメッセージを読む。
$ journalctl -k --since "2026-08-11 14:40"
journalctlは受信時のウォールクロックを記録するため、サスペンドの影響を受けない。
実行にはroot権限が必要な場合がある
多くのディストリビューションはkernel.dmesg_restrictを有効にしており、一般ユーザーはdmesgを実行できない。
$ sysctl kernel.dmesg_restrict
kernel.dmesg_restrict = 1
$ dmesg -T
dmesg: read kernel buffer failed: Operation not permitted
sudo dmesg -Tのようにroot権限で実行する。
