ここにこの奇妙な問題で私を助けることができる誰かがいることを願っています。
私はそれがなぜ起こっているのか知っていますが、それを解決する方法がわかりません。 BIOSの時刻が正しく設定されていないか、そのように設定されていない可能性があります。しかし、約400台以上のサーバーのBIOS時間を変更したくありません。 (またはBIOSバットを変更)
root@spool:~# echo TEST > /dev/kmsg
root@spool:~# dmesg -T | tail -1
[Mon Feb 17 04:57:03 2014] TEST
root@spool:~# date
Mon Feb 17 11:45:17 CET 2014
サーバーは時刻同期のためにntpを実行しています。
OSでこの問題を修正する方法を知っている人はいますか?
Linux spool 3.2.0-4-AMD64 #1 SMP Debian 3.2.46-1+deb7u1 x86_64 GNU/Linux
なぜ、/dev/kmsg
、dmesg
のメッセージの日付/時刻がシステムの日付/時刻と同期していませんか?
理論を検証するには(ところで、これは健全です)、rootとして次のコマンドを実行します。
hwclock --show
これにより、コマンドを実行しているサーバーのハードウェアクロックが表示されます。
ハードウェアクロックをシステム時刻(ntpによって管理される)と同期するには、次のコマンドを実行します。
hwclock --systohc --utc
最後の引数(--utc)は、ハードウェアクロックに時刻を協定世界時で格納するようにhwclockに指示します。
さらに、dmesg(1)のマニュアルページには次のように記載されているため、発生している動作は文書化されており、有効であることを覚えておいてください。
-T, --ctime
Print human-readable timestamps.
Be aware that the timestamp could be inaccurate! The time
source used for the logs is not updated after system
SUSPEND/RESUME.
dmesgは、開始されてからの秒単位の稼働時間をタイムスタンプとして記録するカーネルリングバッファを出力するだけです。
したがって、-Tオプションを使用すると、このすべての稼働時間の値は、システムがブートされた日付に追加されるだけです。サスペンドまたはレジュームでスリープしていた時間は失われます。そのため、この場合は-Tオプションは役に立ちません。日付/時刻の値が正しくないため、過去に戻っているからです。
dmesg
の「最近の」エントリの正確な時間を取得するには、出力をハッキングして、dmesgタイムスタンプをリアルタイムに変換します。
「最近」とは、(他の人がすでに指摘したように)一時停止時間がdmesgタイムスタンプにカウントされないため、最後の一時停止/再開後の時間を意味します。
しかし、ノートブックなどで頻繁に必要になる場合は、関数またはエイリアスに次のようなものを入れることができます。
# write current time to kernel ring buffer
echo "timecheck: $(date +%s) = $(date +%F_%T)" | Sudo tee /dev/kmsg
# use our "timecheck" entry to get the difference
# between the dmesg timestamp and real time
offset=$(dmesg | grep timecheck | tail -1 \
| Perl -nle '($t1,$t2)=/^.(\d+)\S+ timecheck: (\d+)/; print $t2-$t1')
# pipe dmesg output through a Perl snippet to
# convert it's timestamp to correct readable times
dmesg | tail \
| Perl -pe 'BEGIN{$offset=shift} s/^\[(\d+)\S+/localtime($1+$offset)/e' $offset
# or use this instead to keep dmesg colors
dmesg --color=always | tail \
| Perl -pe 'BEGIN{$offset=shift} s/^(\x1b\[.*?m)?\[(\d+)\S+/$1.localtime($2+$offset)/e' $offset
出力例:
...
Sat Jun 29 11:12:28 2019 wlp3s0: Limiting TX power to 30 (30 - 0) dBm as advertised by 10:5a:f7:53:1d:0f
Sat Jun 29 11:12:28 2019 IPv6: ADDRCONF(NETDEV_CHANGE): wlp3s0: link becomes ready
Sat Jun 29 11:34:16 2019 timecheck: 1561800856 = 2019-06-29_11:34:16
Sat Jun 29 12:10:11 2019 wlp3s0: cannot understand ECSA IE operating class, 5, ignoring
元のdmesg
の出力と比較(3日間はオフ):
$ dmesg | tail -4
[249424.746958] wlp3s0: Limiting TX power to 30 (30 - 0) dBm as advertised by 10:5a:f7:53:1d:0f
[249424.749662] IPv6: ADDRCONF(NETDEV_CHANGE): wlp3s0: link becomes ready
[250732.318826] timecheck: 1561800856 = 2019-06-29_11:34:16
[252887.828699] wlp3s0: cannot understand ECSA IE operating class, 5, ignoring
$ dmesg -T | tail -4
[Wed Jun 26 17:59:09 2019] wlp3s0: Limiting TX power to 30 (30 - 0) dBm as advertised by 10:5a:f7:53:1d:0f
[Wed Jun 26 17:59:09 2019] IPv6: ADDRCONF(NETDEV_CHANGE): wlp3s0: link becomes ready
[Wed Jun 26 18:20:57 2019] timecheck: 1561800856 = 2019-06-29_11:34:16
[Wed Jun 26 18:56:52 2019] wlp3s0: cannot understand ECSA IE operating class, 5, ignoring