dmesg时间与系统时间的比较不正确


14

我希望有人可以帮助我解决这个奇怪的问题。

我认为我知道为什么会这样,但我不知道如何解决。可能是因为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与系统日期/时间不同步?


您确定您的本地时间文件/etc/localtime正确吗?该syslog得到的时间从本地时间。
VictorLee18年

journalctl -k正因为如此,我现在倾向于使用(在带有日志的系统上)。这包括我所在时区中的正确时间。
neingeist,

Answers:


6

要验证您的理论(顺便说一句是合理的),请以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.

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 2014年

好的,dmesg -T不能保证时间戳的正确性(根据文档),因此使用适当的日志记录守护程序(例如klogd),您将获得内核消息的正确时间戳。
星系

1
那么,对于dmesg中错误的时间戳,没有解决方案吗?
g00gle 2014年

AFAIK,不,没有。而且,dmesg的-T选项是最近才添加的(由Debian?),大多数Linux发行版都不知道这样的选项。为什么对您来说这是一个破坏交易的因素?我提供了一个解决方案:如何为内核消息(如klogd)获取正确的时间戳。
星系

1
我的服务器上存在相同的问题,可以肯定地排除该计算机曾经被挂起/恢复的情况。还有其他原因可能导致时间戳不正确吗?(ntp和硬件时间正确并且一直如此)
Daywalker

12

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
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.