เวลา dmesg เทียบกับเวลาของระบบไม่ถูกต้อง


14

ฉันหวังว่านี่คือคนที่สามารถช่วยฉันด้วยปัญหาที่แปลกประหลาดนี้

ฉันคิดว่าฉันรู้ว่าทำไมมันถึงเกิดขึ้น แต่ฉันไม่รู้วิธีแก้ปัญหา อาจเป็นเพราะเวลา BIOS ไม่ได้ตั้งค่าที่ถูกต้องหรือสิ่งที่ชอบ แต่ฉันไม่ต้องการเปลี่ยนเวลา BIOS ของเซิร์ฟเวอร์ประมาณ 400+ ตัว (หรือเปลี่ยน batt 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

เซิร์ฟเวอร์กำลังเรียกใช้ ntp สำหรับการซิงค์เวลา

ใครที่นี่รู้วิธีแก้ไขปัญหานี้ในระบบปฏิบัติการหรือไม่

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

ทำไมเมื่อสะท้อนไป/dev/kmsgที่วันที่ / เวลาของข้อความของฉันในdmesgไม่ตรงกับวันที่ / เวลาของระบบ?


คุณแน่ใจหรือว่าไฟล์ localtime ของคุณ/etc/localtimeถูกต้อง? syslogเวลาได้รับจาก localtime
VictorLee

ฉันมักจะใช้journalctl -kตอนนี้ (ในระบบที่มี journald) อย่างแม่นยำเพราะเหตุนี้ รวมถึงเวลาที่ถูกต้องในเขตเวลาของฉัน
neingeist

คำตอบ:


6

หากต้องการตรวจสอบทฤษฎีของคุณ (ซึ่งเป็นวิธีใช้เสียง) ให้ดำเนินการดังต่อไปนี้ในฐานะรูท:

hwclock --show

นี่จะแสดงนาฬิกาฮาร์ดแวร์ของคุณบนเซิร์ฟเวอร์ที่คุณกำลังเรียกใช้งานคำสั่ง

ในการซิงโครไนซ์นาฬิกาฮาร์ดแวร์ของคุณกับเวลาระบบของคุณ (ซึ่งจัดการโดย ntp) ให้รันคำสั่งต่อไปนี้:

hwclock --systohc --utc

อาร์กิวเมนต์สุดท้าย (--utc) บอก hwclock เพื่อเก็บเวลาในนาฬิกาฮาร์ดแวร์ในเวลาสากลเชิงพิกัด

นอกจากนี้โปรดทราบว่า man page สำหรับ 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 distros ส่วนใหญ่ไม่ทราบเกี่ยวกับตัวเลือกดังกล่าว ทำไมจึงเป็นการดีลเลอร์ที่ดีสำหรับคุณ ฉันได้ให้วิธีการแก้ปัญหา: วิธีรับการประทับเวลาที่เหมาะสมสำหรับข้อความเคอร์เนล (เช่น klogd)
กาแล็

1
ฉันมีปัญหาเดียวกันบนเซิร์ฟเวอร์ของฉันและสามารถแยกแยะได้อย่างแน่นอนว่าเครื่องนั้นเคยถูกระงับ / ทำงานต่อ มีเหตุผลอื่นอีกหรือไม่ว่าทำไมการประทับเวลาอาจถูกปิด? (เวลา ntp และฮาร์ดแวร์ถูกต้องและเป็นไปได้เสมอ)
Daywalker

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

ยอดเยี่ยมและสิ่งที่ฉันต้องการสำหรับแล็ปท็อปของฉัน! :-) มีวิธีที่จะอนุญาตให้ทำงานกับตัวเลือก --color = เสมอสำหรับ dmesg ในขณะที่ยังคงอนุญาตให้ทดแทน perl (เช่นการอนุญาตสำหรับรหัสสี)?
AstroFloyd

1
@AstroFloyd: ใช่ ดูdmesgบรรทัดอื่นด้วย regex ที่อัปเดต
mivk

จะโหวตอีกครั้งถ้าฉันทำได้ - ขอบคุณมาก! :-)
AstroFloyd
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.