dmesg 시간 대 시스템 시간 시간이 올바르지 않습니다


14

여기이 이상한 문제를 도와 줄 사람이 있기를 바랍니다.

나는 그것이 왜 일어나는지 알고 있지만 그것을 해결하는 방법을 모른다고 생각합니다. BIOS 시간이 올바르게 설정되지 않았기 때문일 수 있습니다. 그러나 대략 400 + 서버의 BIOS 시간을 변경하고 싶지 않습니다. (또는 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

서버가 시간 동기화를 위해 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의 현지에서 얻을 시간.
VictorLee 2016 년

이 때문에 journalctl -k지금 (저널링 된 시스템에서) 정확하게 사용하는 경향 이 있습니다. 이것은 내 시간대의 정확한 시간을 포함합니다.
neingeist 2016 년

답변:


6

그건 그렇고, 당신의 이론을 검증하려면, 루트로 다음을 실행하십시오 :

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

글쎄, dmesg -T는 타임 스탬프의 정확성 (문서에 따라)을 보장하지 않으므로 적절한 로깅 데몬 (예 : klogd)을 사용하면 커널 메시지에 대해 올바른 타임 스탬프를 얻을 수 있습니다.
은하

1
따라서 dmesg의 잘못된 타임 스탬프에 대한 해결책이 없습니까?
g00gle

AFAIK는 없습니다. 또한 dmesg에 대한이 -T 옵션은 최근에 추가 된 것입니다 (Debian?). Linux 배포판의 대부분은 그러한 옵션에 대해 알지 못합니다. 왜 당신을위한 거래 차단기입니까? 커널 메시지 (예 : klogd)에 적절한 타임 스탬프를 얻는 방법에 대한 해결책을 제공했습니다.
은하

1
내 서버에서 동일한 문제가 발생하여 시스템이 일시 중단 / 다시 시작되었음을 확실히 배제 할 수 있습니다. 타임 스탬프가 해제 된 다른 이유가 있습니까? (ntp와 하드웨어 시간은 정확하며 항상
그렇습니다

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 옵션과 함께 작동하면서 펄 대체 (예 : 색상 코드 허용)를 허용하는 방법이 있습니까?
AstroFloyd

1
@AstroFloyd : 예. dmesg정규식이 업데이트 된 대체 줄을 참조하십시오 .
mivk

내가 할 수 있다면 다시 공감할 것입니다-정말 고마워요! :-)
AstroFloyd 오전
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.