การดีบักการล็อก - ระบบจะสูญเสียบันทึกของฉัน


8

นับตั้งแต่ฉันได้ "อัปเกรด" เป็น systemd บน Arch Linux ฉันจะสูญเสียบันทึกเมื่อเกิดการล็อคที่ไม่คาดคิด ฉันประสบปัญหาการสูญเสียบันทึกเดียวกันเมื่อเดือนที่แล้วและเพิ่งตีปัญหาอีกครั้ง มีอื่น ๆ ยังอิสระยืนยัน

สถานการณ์:

  • ขณะทำบางสิ่งใน Java และด้วยยูทิลิตี้ที่เกี่ยวข้องกับเครือข่ายฉันเห็นว่า KDE (นาฬิกา) หยุดนิ่ง แฟน CPU มีเสียงดังและความร้อนก็เพิ่มสูงขึ้น ตัวชี้เมาส์ยังคงสามารถเคลื่อนย้ายได้
  • ฉันพยายาม ssh จากเครื่องอื่น (ล้มเหลวเนื่องจาก "ไม่มีเส้นทางสู่โฮสต์")
  • ฉันรอไม่กี่นาทีบางทีจ้องจับผิด NMI อาจฆ่างานที่ละเมิด ไม่มีลูกเต๋า
  • Ctrl+ Alt+ F1ไม่สามารถใช้งานได้เช่นกันแม้หลังจากSysRq+R
  • เนื่องจากขั้นตอนข้างต้นไม่ได้ผลฉันจึงตัดสินใจออกลำดับ SysRq REI หลังจากนั้นEหน้าจอก็กลายเป็นสีดำ แต่ไม่มีคอนโซลใด ๆ ไม่ใช่แม้หลังจากSysRq+K
  • ดังนั้นเซสชันนี้จะหายไปสิ่งเดียวที่สามารถทำได้คือการรวบรวมข้อมูลการดีบัก เมื่อพิจารณาถึงวิกิพีเดียฉันตัดสินใจที่จะกดSysRq+ d(ล็อคที่จัดแสดง) กับบางกลุ่ม
  • หลังจากกดSysRq+ Sฉันรอที่สองแล้วรีบูตกับ+SysRqB
  • หลังจากรีบูตและเข้าสู่คอนโซลฉันไม่เห็นร่องรอยของความผิดพลาดใด ๆ รายการที่บันทึกล่าสุดคือจากการใช้ Wireshark แต่ก็ยังมีช่องว่าง 45 นาที

(ฉันใช้ Linux v3.8-rc5-218-ga56e160 btw)

ดังนั้นฉันจะแน่ใจได้อย่างไรว่าบันทึกของฉันจะถูกเก็บไว้เมื่อรีบูตอย่างผิดปกติเนื่องจากการล็อค?


คุณรู้หรือไม่ว่าปัญหานี้ได้รับการแก้ไขในที่สุดsystemdหรือไม่? เมื่อเร็ว ๆ นี้ฉันเห็นปัญหาที่คล้ายกัน ฉันโพสต์รายละเอียดที่นี่ -> unix.stackexchange.com/questions/414871//
kaptan

@kaptan systemd ยังไม่ได้ล้างข้อมูลบันทึกโดยตรงไปยังที่จัดเก็บข้อมูลถาวร ดูSyncIntervalSecตัวเลือก (ผู้อื่น) journald.conf(5)ในมนุษย์
Lekensteyn

tnx สำหรับคำตอบของคุณ จากman jounrnald.conf(5): SyncIntervalSec = ... โปรดทราบว่าการซิงค์จะทำโดยไม่มีเงื่อนไขทันทีหลังจากข้อความบันทึกของลำดับความสำคัญ CRIT, ALERT หรือ EMERG ถูกบันทึกไว้ ดังนั้นการตั้งค่านี้จะใช้กับข้อความระดับ ERR, คำเตือน, ประกาศ, INFO, DEBUG เท่านั้น สิ่งนี้ไม่ได้หมายความว่าหากมีการบันทึกข้อผิดพลาดร้ายแรงควรซิงค์ "ทันที" โดยไม่รอช่วงเวลาหรือไม่ ดังนั้นหมายความว่าหากมีข้อผิดพลาดร้ายแรงเกิดขึ้นเราควรจะเห็นมันในjournaldบันทึก ฉันพลาดอะไรไปรึเปล่า?!
kaptan

@kaptan ข้อความน้อยมากถูกบันทึกด้วยความรุนแรงของ CRIT หากแอปพลิเคชันใช้ข้อความที่ตั้งค่าด้วยคุณสมบัตินี้ (ส่วนใหญ่ไม่ได้) ก็อาจก่อให้เกิดการล้าง ในกรณีอื่น ๆ (เช่น ERR) จะไม่ถูกล้างออกทันที
Lekensteyn

คำตอบ:


4

ดังนั้นฉันจึงถามช่อง #systemd IRC และปรากฎว่า journald (การบันทึก daemon ของ systemd) ไม่ได้ทำการล้างบันทึกลงดิสก์เป็นระยะเลย ซึ่งหมายความว่าบันทึกของคุณมีความเสี่ยงอยู่ตลอดเวลา

การส่งSIGUSR2ไปยังjournaldบันทึกสาเหตุจะถูกเขียนไปยังดิสก์ แต่ถ้าคุณทำหลายครั้งไฟล์จำนวนมากจะถูกสร้างขึ้น (ตัวเลือกมีการอธิบายจริง ๆ ว่า "การหมุนของบันทึก")

ในที่สุดฉันตัดสินใจที่จะไปกับข้อเสนอแนะอื่น: การใช้ syslog daemon เฉพาะสำหรับการรวบรวมบันทึกเคอร์เนล ตามที่แนะนำให้ rsyslog (และฉันมีประสบการณ์แล้ว) ฉันสำรวจตัวเลือกนั้นเพิ่มเติม ฉันได้เขียนรายละเอียดเพิ่มเติมในArch Wikiเกี่ยวกับการใช้ rsyslog

แนวคิดคือการเรียกใช้ rsyslog รวบรวมข้อมูลจากเคอร์เนลเท่านั้น เมื่อ rsyslog อ่านจาก/proc/kmsg(ซึ่งอนุญาตให้มีผู้อ่านเพียงคนเดียว) และเจอร์นัลอ่านจาก/dev/kmsg(อนุญาตให้ผู้อ่านหลายคน) ไม่มีทางที่ daemons จะสูญเสียบันทึก (สำคัญมากสำหรับฉัน!) กำหนดค่า rsyslog เพื่อเขียนข้อความเคอร์เนลไปยังไฟล์และตรวจสอบให้แน่ใจว่าไฟล์นี้ถูกหมุนเพื่อป้องกันการกินพื้นที่ดิสก์ของคุณ

วิธีนี้ไม่สมบูรณ์:

  • บันทึกอื่น ๆ (เช่นจาก NetworkManager) จะหายไป สิ่งนี้สามารถแก้ไขได้โดยการส่งต่อล็อกเพิ่มเติมจาก syslog ไปยังเจอร์นัล (หมายถึงการทำซ้ำ!)
  • บันทึกซ้ำ ข้อความเคอร์เนลจะถูกเขียนลงในสองไฟล์ นี่ไม่ใช่ปัญหาโดยทั่วไปจำนวนบันทึกมีขนาดเล็กและคุณต้องการมีสำเนาของบันทึกมากกว่าไม่มี นอกจากนี้คุณยังสามารถใช้เครื่องมือที่รวดเร็วเช่นgrepเดียวกับไฟล์บันทึกเดียวหรือช้ากว่า แต่น่าเล่นjournalctlมากกว่า

มีรายการสิ่งที่ต้องทำเพื่อล้างบันทึกบ่อยขึ้น แต่นั่นก็ยังไม่น่าเชื่อถือเพียงพอ:

เจอร์นัล: ส่งข้อความมาร์กเกอร์ออกมาเป็นระยะ ๆ จากนั้นซิงค์ทันทีด้วย fdatasync () หลังจากนั้นเพื่อให้มีการซิงค์รายชั่วโมง

ตอนนี้หวังว่า systemd / journald จะได้รับตัวเลือกในการเขียนบันทึกลงดิสก์ แต่ในขณะเดียวกันเราก็สามารถรวมเครื่องมือต่าง ๆ เพื่อบรรลุเป้าหมาย


2

มีการอัปเดตสองรายการ:

  1. ตอนนี้หวังว่า systemd / journald จะได้รับตัวเลือกในการเขียนบันทึกลงดิสก์ แต่ในขณะเดียวกันเราก็สามารถรวมเครื่องมือต่าง ๆ เพื่อบรรลุเป้าหมาย

มีตัวเลือก--syncคือ:

ขอให้ journal daemon เขียนข้อมูลเจอร์นัลทั้งหมดที่ยังไม่ได้เขียนไปยังระบบไฟล์สำรองและซิงโครไนซ์วารสารทั้งหมด การโทรนี้จะไม่ส่งคืนจนกว่าการดำเนินการซิงโครไนซ์จะเสร็จสมบูรณ์ คำสั่งนี้รับรองว่าข้อความบันทึกใด ๆ ที่เขียนก่อนการร้องขอจะถูกเก็บไว้อย่างปลอดภัยในดิสก์ในเวลาที่ส่งคืน

--syncมีให้ตั้งแต่v228:

journalctl ได้รับสวิตช์ "--sync" ใหม่ที่ขอให้ journal daemon เขียนข้อความบันทึกที่ไม่ได้เขียนทั้งหมดลงในดิสก์และซิงค์ไฟล์ก่อนที่จะส่งคืน

  1. ปรากฎว่า journald (การบันทึก daemon ของ systemd) ไม่ได้ล้างบันทึกไปยังดิสก์เป็นระยะเลย ซึ่งหมายความว่าบันทึกของคุณมีความเสี่ยงอยู่ตลอดเวลา

man journald.conf(5) พูดว่า:

SyncIntervalSec =

การหมดเวลาก่อนซิงโครไนซ์ไฟล์เจอร์นัลกับดิสก์ หลังจากซิงค์ไฟล์เจอร์นัลจะอยู่ในสถานะออฟไลน์ โปรดทราบว่าการทำข้อมูลให้ตรงกันนั้นไม่มีเงื่อนไขทันทีหลังจากบันทึกข้อความของลำดับความสำคัญ CRIT, ALERT หรือ EMERG ดังนั้นการตั้งค่านี้จะใช้กับข้อความระดับ ERR, คำเตือน, ประกาศ, INFO, DEBUG เท่านั้น การหมดเวลาเริ่มต้นคือ 5 นาที

SyncIntervalSec=มีให้ตั้งแต่v199:

ตอนนี้ journald จะล้างไฟล์เจอร์นัลไปยังดิสก์อย่างชัดเจนใน 5 นาทีล่าสุดหลังจากการเขียนแต่ละครั้ง ไฟล์จะถูกทำเครื่องหมายออฟไลน์จนกว่าจะถึงการเขียนครั้งต่อไป สิ่งนี้จะเพิ่มความน่าเชื่อถือในกรณีที่เกิดความผิดพลาด ความล่าช้าในการประสานสามารถกำหนดค่าผ่าน SyncIntervalSec = ใน journald.conf

ดูสิ่งนี้ด้วย:

journald: ส่ง SIGTERM / SIGINT โดยมีลำดับความสำคัญต่ำ

ตรวจสอบให้แน่ใจว่าได้ประมวลผลข้อมูลบันทึกที่ถูกจัดคิวทั้งหมดก่อนที่จะออกเพื่อให้เราไม่จำเป็นต้องสูญเสียข้อความเมื่อปิดระบบ


ข้อมูลที่ดี แต่ไม่ใช่ "[journald] ไม่ล้างบันทึกไปยังดิสก์เป็นระยะ ๆ " ซึ่งขัดแย้งกับตัวเลือก SyncIntervalSec
Lekensteyn

"[journald] ไม่ล้างบันทึกไปยังดิสก์เป็นระยะ" เป็นคำพูดจากคำตอบดั้งเดิม "SyncIntervalSec" กำลังอัปเดต
Evgeny Vereshchagin

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