dmesg time vs system time time ist nicht korrekt

13

Ich hoffe, dass hier jemand ist, der mir bei diesem seltsamen Problem helfen kann.

Ich denke, dass ich weiß, warum es passiert, aber ich weiß nicht, wie ich es lösen soll. Vielleicht liegt es daran, dass die BIOS-Zeit nicht richtig eingestellt ist oder so ähnlich. Aber ich möchte die BIOS-Zeit von ungefähr 400+ Servern nicht ändern. (Oder ändern Sie das 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

Der Server führt ntp für die Zeitsynchronisation aus.

Weiß jemand hier, wie man dieses Problem im Betriebssystem behebt?

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

Warum werden /dev/kmsgDatum und Uhrzeit meiner eingehenden Nachricht dmesgnicht mit Datum und Uhrzeit des Systems synchronisiert?

g00gle
quelle
Sind Sie sicher, dass Ihre Ortszeitdatei /etc/localtimerichtig ist? Die syslogZeit von der Ortszeit bekommen.
VictorLee
Ich neige dazu, journalctl -kjetzt (auf Systemen mit Journald) genau deswegen zu verwenden. Dies schließt die korrekte Zeit in meiner Zeitzone ein.
Neingeist

Antworten:

5

Um Ihre Theorie zu verifizieren (die übrigens vernünftig ist), führen Sie Folgendes als root aus:

hwclock --show

Dies zeigt Ihnen Ihre Hardware-Uhr auf dem Server, auf dem Sie den Befehl ausführen.

Führen Sie den folgenden Befehl aus, um Ihre Hardwareuhr mit Ihrer Systemzeit (die von ntp verwaltet wird) zu synchronisieren:

hwclock --systohc --utc

Das letzte Argument (--utc) weist hwclock an, die Uhrzeit in der Hardware-Uhr in der koordinierten Weltzeit zu speichern.

Beachten Sie außerdem, dass in der Manpage für dmesg (1) Folgendes steht, damit das aufgetretene Verhalten dokumentiert und gültig ist:

   -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.
Galaxis
quelle
1
Danke für deine Antwort. Aber hat leider nicht funktioniert ... Was ich getan habe, ist das Folgende: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
Nun, dmesg -T garantiert nicht die Richtigkeit des Zeitstempels (gemäß Dokumentation). Verwenden Sie daher einen geeigneten Protokollierungs-Daemon (z. B. klogd) und Sie erhalten korrekte Zeitstempel für Kernel-Nachrichten.
Galaxy
1
Es gibt also keine Lösung für die falschen Zeitstempel in Dmesg?
g00gle
AFAIK, nein, gibt es nicht. Darüber hinaus ist diese -T-Option für dmesg eine relativ neue Erweiterung (von Debian?), Und die Mehrheit der Linux-Distributionen kennt eine solche Option nicht. Warum ist es ein Deal Breaker für Sie? Ich habe eine Lösung bezüglich: Wie bekomme ich die richtigen Zeitstempel für Kernel-Nachrichten (zB klogd)?
Galaxy
1
Ich habe das gleiche Problem auf meinem Server und kann definitiv ausschließen, dass der Computer jemals angehalten / fortgesetzt wurde. Gibt es einen anderen Grund, warum der Zeitstempel möglicherweise nicht funktioniert? (NTP und Hardware-Zeit sind korrekt und waren es immer)
Daywalker
11

dmesg druckt nur den Kernel-Ringpuffer, der Nachrichten mit einer Betriebszeit von Sekunden nach dem Start als Zeitstempel protokolliert.

Wenn Sie also die Option -T verwenden, werden alle diese Werte für die Betriebszeit nur zu dem Datum hinzugefügt, an dem Ihr System gestartet wurde. Wenn Sie Zeiten hatten, in denen Sie im Suspend- oder Resume-Modus geschlafen haben, gehen diese verloren. In diesem Fall ist die Option -T nicht sinnvoll, da Datums- / Zeitwerte nicht in der Vergangenheit liegen.

JxO
quelle
3

Um genaue Zeiten für "aktuelle" Einträge in zu erhalten dmesg, können Sie die dmesg-Zeitstempel mit einigem Hacking der Ausgabe in Echtzeit konvertieren.

Mit "kürzlich" meine ich Zeiten nach der letzten Unterbrechung / Wiederaufnahme, da (wie andere bereits darauf hingewiesen haben) Unterbrechungszeiten nicht im dmesg-Zeitstempel gezählt werden.

Wenn Sie es jedoch häufig benötigen, wie auf einem Notebook, können Sie Funktionen oder Aliasnamen wie die folgenden hinzufügen:

# 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

Beispielausgabe:

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

Im Vergleich zur Originalausgabe dmesg(die um 3 Tage abweicht):

$ 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
quelle
Genial und genau das, was ich für meinen Laptop brauche! :-) Gibt es eine Möglichkeit, dies mit der Option --color = always für dmesg zuzulassen, während die Perl-Ersetzung (dh die Berücksichtigung der Farbcodes) weiterhin zulässig ist?
AstroFloyd
1
@AstroFloyd: ja. Siehe alternative dmesgZeile mit aktualisiertem regulären Ausdruck.
Mivk
Ich würde wieder abstimmen, wenn ich könnte - vielen Dank! :-)
AstroFloyd