Czas dmesg vs. czas systemowy jest nieprawidłowy

14

Mam nadzieję, że jest ktoś, kto może mi pomóc z tym dziwnym problemem.

Myślę, że wiem, dlaczego tak się dzieje, ale nie wiem, jak to rozwiązać. Być może dzieje się tak, ponieważ czas BIOS nie jest ustawiony poprawnie lub coś w tym stylu. Ale nie chcę zmieniać czasu BIOS-u około 400+ serwerów. (Lub zmień bit 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

Serwer uruchamia NTTP do synchronizacji czasu.

Czy ktoś tu wie, jak rozwiązać ten problem w systemie operacyjnym?

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

Dlaczego podczas echa /dev/kmsgdata / godzina mojej wiadomości dmesgnie są synchronizowane z datą / godziną systemową?

g00gle
źródło
Czy jesteś pewien, że Twój plik czasu lokalnego /etc/localtimejest poprawny ? syslogCzas dostać od localtime.
VictorLee
Z tego powodu zwykle używam journalctl -kteraz (w systemach z dziennikiem). Obejmuje to prawidłowy czas w mojej strefie czasowej.
neingeist

Odpowiedzi:

6

Aby zweryfikować swoją teorię (która, nawiasem mówiąc, jest dźwiękiem), wykonaj następujące czynności jako root:

hwclock --show

Spowoduje to wyświetlenie zegara sprzętowego na serwerze, na którym wykonywane jest polecenie.

Aby zsynchronizować zegar sprzętowy z czasem systemowym (którym zarządza ntp), uruchom następujące polecenie:

hwclock --systohc --utc

Ostatni argument (--utc) nakazuje hwclockowi zapisanie czasu w zegarze sprzętowym w skoordynowanym czasie uniwersalnym.

Dodatkowo pamiętaj, że strona podręcznika użytkownika dla dmesg (1) mówi, co oznacza, że ​​twoje zachowanie jest udokumentowane i prawidłowe:

   -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.
galaktyka
źródło
1
Dzięki za odpowiedź. Ale niestety nie zadziałało ... To, co zrobiłem, jest następujące: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
Cóż, dmesg -T nie gwarantuje poprawności znacznika czasu (zgodnie z dokumentacją), więc użyj odpowiedniego demona rejestrującego (np. Klogd), a otrzymasz poprawne znaczniki czasu dla komunikatów jądra.
galaktyka
1
Więc nie ma rozwiązania dla niewłaściwych znaczników czasu w dmesg?
g00gle
AFAIK, nie, nie ma. Co więcej, ta opcja -T do dmesg jest całkiem nowym dodatkiem (autorstwa Debiana?) I większość dystrybucji Linuksa nie wie o takiej opcji. Dlaczego jest to dla ciebie przełomowe? Podałem rozwiązanie dotyczące: jak uzyskać odpowiednie znaczniki czasu dla komunikatów jądra (tj. Klogd).
galaktyka
1
Mam ten sam problem na moim serwerze i zdecydowanie mogę wykluczyć, że komputer został kiedykolwiek zawieszony / wznowiony. Czy jest jakiś inny powód, dla którego znacznik czasu może być wyłączony? (ntp i czas sprzętowy są poprawne i zawsze były)
Daywalker
12

dmesg po prostu wypisuje bufor pierścieniowy jądra, który rejestruje wiadomości o czasie działania w ciągu kilku sekund od uruchomienia jako znacznik czasu.

Jeśli więc użyjesz opcji -T, wszystkie te wartości czasu działania zostaną dodane do daty uruchomienia systemu. Jeśli zdarzyło Ci się spać w trybie zawieszenia lub wznowienia, są one tracone, więc w tych przypadkach opcja -T nie jest przydatna, ponieważ wartości daty / godziny nie były prawidłowe w przeszłości i przeszłości.

JxO
źródło
3

Aby uzyskać dokładne czasy dla „ostatnich” wpisów dmesg, możesz przekonwertować znaczniki czasu dmesg na czas rzeczywisty z pewnym zhakowaniem danych wyjściowych.

Przez „ostatnie” rozumiem czasy po ostatnim zawieszeniu / wznowieniu, ponieważ (jak już zauważyli inni) czasy zawieszenia nie są liczone w znaczniku czasu dmesg.

Ale jeśli potrzebujesz go często, np. Na notebooku, możesz umieścić w funkcjach lub aliasach coś takiego:

# 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

Przykładowe dane wyjściowe:

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

W porównaniu z oryginalnym dmesgwyjściem (które jest wyłączone o 3 dni):

$ 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
źródło
Genialne i dokładnie to, czego potrzebuję do mojego laptopa! :-) Czy istnieje sposób, aby pozwolić temu na działanie z opcją --color = always dla dmesg, jednocześnie pozwalając na podstawienie perla (tj. Zezwalając na kody kolorów)?
AstroFloyd
1
@AstroFloyd: tak. Zobacz alternatywną dmesglinię ze zaktualizowanym wyrażeniem regularnym.
mivk
zagłosowałbym jeszcze raz, gdybym mógł - wielkie dzięki! :-)
AstroFloyd