La hora de dmesg frente a la hora del sistema no es correcta


13

Espero que haya alguien que pueda ayudarme con este extraño problema.

Creo que sé por qué está sucediendo, pero no sé cómo resolverlo. Tal vez sea porque el tiempo del BIOS no está configurado correctamente o algo así. Pero no quiero cambiar el tiempo de BIOS de aproximadamente más de 400 servidores. (O cambie la batería del 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

El servidor ejecuta ntp para sincronización horaria.

¿Alguien aquí que sepa cómo solucionar este problema en el sistema operativo?

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

¿Por qué, al hacer eco /dev/kmsg, la fecha / hora de mi mensaje dmesgno está sincronizada con la fecha / hora del sistema?


¿Estás seguro de que tu archivo localtime /etc/localtimees correcto? El syslogtiempo se obtiene de localtime.
VictorLee

journalctl -kTiendo a usar ahora (en sistemas con journald) precisamente por esto. Esto incluye la hora correcta, en mi zona horaria.
neingeist

Respuestas:


5

Para verificar su teoría (que, por cierto, es sólida), ejecute lo siguiente como root:

hwclock --show

Esto le mostrará su reloj de hardware en el servidor donde está ejecutando el comando.

Para sincronizar su reloj de hardware con su hora del sistema (que es administrado por ntp), ejecute el siguiente comando:

hwclock --systohc --utc

El último argumento (--utc) le dice a hwclock que almacene la hora en el reloj de hardware en hora universal coordinada.

Además, tenga en cuenta que la página de manual de dmesg (1) dice lo siguiente, para que el comportamiento que está experimentando esté documentado y sea válido:

   -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
Gracias por tu respuesta. Pero desafortunadamente no funcionó ... Lo que hice es lo siguiente: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

Bueno, dmesg -T no garantiza la exactitud de la marca de tiempo (de acuerdo con la documentación), así que use un demonio de registro adecuado (por ejemplo, klogd) y obtendrá las marcas de tiempo correctas para los mensajes del núcleo.
galaxia

1
Entonces, ¿no hay una solución para las marcas de tiempo incorrectas en dmesg?
g00gle

AFAIK, no, no lo hay. Además, esta opción -T para dmesg es una adición bastante reciente (¿por Debian?) Y la mayoría de las distribuciones de Linux no conocen esa opción. ¿Por qué es un factor decisivo para ti? He proporcionado una solución re: cómo obtener las marcas de tiempo adecuadas para los mensajes del núcleo (es decir, klogd).
galaxia

1
Tengo el mismo problema en mi servidor y definitivamente puedo descartar que la máquina se haya suspendido / reanudado. ¿Hay alguna otra razón por la cual la marca de tiempo puede estar desactivada? (ntp y el tiempo de hardware son correctos y siempre lo han sido)
Daywalker

11

dmesg solo imprime el kernel ringbuffer que registra los mensajes con tiempo de actividad en segundos desde que se inicia como marca de tiempo.

Entonces, si usa la opción -T, todos estos valores de tiempo de actividad se agregan a la fecha en que se inició su sistema. Si ha tenido momentos de suspensión o suspensión, se pierden, por lo que en este caso, la opción -T no es útil, ya que los valores de fecha / hora no son correctos en ese momento.


3

Para obtener tiempos precisos para las entradas "recientes" dmesg, puede convertir las marcas de tiempo dmesg a tiempo real con algún hackeo de la salida.

Por "reciente", me refiero a los tiempos posteriores a la última suspensión / reanudación, ya que (como ya señalaron otros) los tiempos de suspensión no se cuentan en la marca de tiempo dmesg.

Pero si lo necesita con frecuencia, como en un cuaderno, puede poner algo como lo siguiente en funciones o alias:

# 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

Salida de muestra:

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

En comparación con la dmesgsalida original (que está apagada por 3 días):

$ 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

¡Brillante, y exactamente lo que necesito para mi computadora portátil! :-) ¿Hay alguna manera de permitir que esto funcione con la opción --color = always para dmesg, al tiempo que permite la sustitución de perl (es decir, permite los códigos de color)?
AstroFloyd el

1
@ AstroFloyd: sí. Ver dmesglínea alternativa con expresiones regulares actualizadas.
mivk

volvería a votar de nuevo si pudiera, ¡muchas gracias! :-)
AstroFloyd
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.