время dmesg против системного времени не является правильным

14

Я надеюсь, что есть кто-то, кто может помочь мне с этой странной проблемой.

Я думаю, что я знаю, почему это происходит, но я не знаю, как это решить. Может быть, это потому, что время BIOS не установлено правильно или что-то вроде этого. Но я не хочу менять время BIOS около 400+ серверов. (Или сменить Бит Батт)

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 для синхронизации времени.

Кто-нибудь здесь, кто знает, как решить эту проблему в ОС?

Linux spool 3.2.0-4-amd64 #1 SMP Debian 3.2.46-1+deb7u1 x86_64 GNU/Linux

Почему при отражении /dev/kmsgдата / время моего сообщения dmesgне синхронизируется с системной датой / временем?

g00gle
источник
Вы уверены, что ваш локальный файл времени /etc/localtimeправильный? syslogВремя получить от МестноеВремя.
VictorLee
Я склонен использовать journalctl -kсейчас (в системах с journald) именно из-за этого. Это включает в себя правильное время, в моем часовом поясе.
neingeist

Ответы:

6

Чтобы проверить свою теорию (что, кстати, звучит правдоподобно), выполните от имени root следующее:

hwclock --show

Это покажет вам ваши аппаратные часы на сервере, на котором вы выполняете команду.

Чтобы синхронизировать ваши аппаратные часы с системным временем (которое управляется ntp), выполните следующую команду:

hwclock --systohc --utc

Последний аргумент (--utc) указывает hwclock сохранять время в аппаратных часах в согласованном универсальном времени.

Кроме того, имейте в виду, что на странице man для 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
Что ж, dmesg -T не гарантирует правильность отметки времени (согласно документации), поэтому используйте соответствующий демон ведения журнала (например, klogd), и вы получите правильные отметки времени для сообщений ядра.
галактика
1
Таким образом, нет никакого решения для неправильных временных меток в dmesg?
g00gle
AFAIK, нет, нет. Более того, эта опция -T для dmesg является довольно недавним дополнением (от Debian?), И большинство дистрибутивов Linux не знают о такой опции. Почему это нарушает условия сделки для вас? Я предоставил решение: как получить правильные временные метки для сообщений ядра (например, klogd).
галактика
1
У меня та же проблема на моем сервере, и я определенно могу исключить, что машина когда-либо была приостановлена ​​/ возобновлена. Есть ли другая причина, по которой временная метка может быть отключена? (ntp и аппаратное время правильные и всегда были)
Daywalker
12

dmesg просто печатает кольцевой буфер ядра, который регистрирует сообщения с временем безотказной работы в течение нескольких секунд после запуска в качестве метки времени.

Поэтому, если вы используете опцию -T, все эти значения времени безотказной работы просто добавляются к дате загрузки вашей системы. Если вы спали в режиме ожидания или возобновления, они теряются, поэтому в этом случае опция -T не нужна, поскольку значения даты / времени не верны и возвращаются в прошлое.

JxO
источник
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
mivk
источник
Блестящий, и именно то, что мне нужно для моего ноутбука! :-) Есть ли способ разрешить это работать с опцией --color = всегда для dmesg, в то же время позволяя замену perl (то есть, учитывая цветовые коды)?
AstroFloyd
1
@AstroFloyd: да. Смотрите альтернативную dmesgстроку с обновленным регулярным выражением.
MIVK
Я бы снова проголосовал, если бы мог - большое спасибо! :-)
AstroFloyd