dmesg時間とシステム時間の時間が正しくありません


13

この奇妙な問題を解決してくれる人がここにいることを願っています。

私はそれがなぜ起こっているのか知っていると思うが、それを解決する方法がわからない BIOSの時刻が正しく設定されていないなどの理由が考えられます。しかし、約400台以上のサーバーのBIOS時間を変更したくありません。(またはBIOS battを変更します)

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日付/時刻がシステムの日付/時刻と同期しないのはなぜですか?


現地時間のファイル/etc/localtimeは正しいですか?syslog現地時間からの取得時間。
VictorLee

私はjournalctl -kまさにこのために(ジャーナルドを備えたシステムで)今使用する傾向があります。これには、私のタイムゾーンでの正しい時刻が含まれます。
ニーニスト

回答:


5

理論を検証するには(ちなみにそれは健全です)、ルートとして次を実行します。

hwclock --show

これにより、コマンドを実行しているサーバーのハードウェアクロックが表示されます。

ハードウェアクロックをシステム時間(ntpによって管理されている)と同期するには、次のコマンドを実行します。

hwclock --systohc --utc

最後の引数(--utc)は、時間をハードウェアクロックに協定世界時で保存するようにhwclockに指示します。

さらに、dmesg(1)のmanページには次のように記載されているため、発生している動作は文書化されており、有効であることに注意してください。

   -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.

1
ご回答有難うございます。しかし、残念ながら動作しませんでした...私がしたことは次のとおりです。root@spool:~# hwclock --show Mon Feb 17 20:30:14 2014 -0.985068 seconds root@spool:~# hwclock --systohc --utc root@spool:~# echo TEST > /dev/kmsg root@spool:~# dmesg -T | tail -1 [Mon Feb 17 13:50:14 2014] TEST root@spool:~# date Mon Feb 17 20:30:46 CET 2014
g00gle 14

まあ、dmesg -Tはタイムスタンプの正確性(ドキュメントによる)を保証しないので、適切なロギングデーモン(klogdなど)を使用すると、カーネルメッセージの正しいタイムスタンプが取得されます。
銀河14

1
だから、dmesgの間違ったタイムスタンプの解決策はありませんか?
g00gle

知らない、ありません。さらに、dmesgへのこの-Tオプションはごく最近の追加(Debianによる?)であり、Linuxディストリビューションの大部分はそのようなオプションについては知りません。なぜそれがあなたにとって取引ブレーカーなのですか?カーネルメッセージ(klogdなど)の適切なタイムスタンプを取得する方法に関するソリューションを提供しました。
銀河14

1
サーバーにも同じ問題がありますが、マシンが一時停止/再開されたことは間違いなく除外できます。タイムスタンプがオフになる他の理由はありますか?(ntpとハードウェアの時刻は正しく、常に正しいです)
-Daywalker

11

dmesgは、タイムスタンプとして開始されてからの秒単位のアップタイムでメッセージを記録するカーネルリングバッファを出力するだけです。

したがって、-Tオプションを使用すると、このアップタイム値はすべて、システムがブートされた日付に追加されるだけです。サスペンドまたはレジュームでスリープしている時間があった場合、それらは失われます。そのため、この場合-Tオプションは役に立たなくなります。これは、日付/時刻の値がその時点で過去および過去にないためです。


3

の「最近の」エントリの正確な時間を取得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

素晴らしい、そしてまさにラップトップに必要なものです!:-) dmesgの--color = alwaysオプションを使用して、perlの置換を許可する(つまり、色コードを許可する)ことを許可する方法はありますか?
AstroFloyd

1
@AstroFloyd:はい。dmesg更新された正規表現の代替行を参照してください。
mivk

できればまた賛成票を投じる-どうもありがとう!:-)
AstroFloyd
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.