Gỡ lỗi khóa - systemd mất nhật ký của tôi


8

Kể từ khi tôi "nâng cấp" lên systemd trên Arch Linux, tôi liên tục bị mất nhật ký khi xảy ra khóa bất ngờ. Tôi đã gặp vấn đề mất log tương tự một tháng trước và chỉ gặp lại vấn đề này. Ngoài ra còn có các xác nhận độc lập khác .

Tình hình:

  • Trong khi thực hiện một số nội dung trong Java và với các tiện ích liên quan đến mạng, tôi thấy rằng KDE (đồng hồ) đã bị đóng băng. Quạt CPU trở nên ồn ào và sức nóng đang tăng lên. Con trỏ chuột vẫn có thể được di chuyển mặc dù.
  • Tôi đã cố gắng ssh từ một máy khác (không thành công do "không có tuyến đến máy chủ")
  • Tôi đợi vài phút, có lẽ cơ quan giám sát NMI có thể giết chết nhiệm vụ vi phạm. Không có con xúc xắc.
  • Ctrl+ Alt+ F1cũng không hoạt động, ngay cả sau SysRq+R
  • Vì các bước trên không hoạt động, tôi quyết định phát hành chuỗi REI SysRq. Sau đó E, màn hình trở thành màu đen, nhưng cũng không có giao diện điều khiển. Ngay cả sau SysRq+K
  • Vì vậy, phiên này dường như bị mất, điều duy nhất có thể được thực hiện là thu thập thông tin gỡ lỗi. Nhìn vào Wikipedia , tôi quyết định nhấn SysRq+ d(khóa giữ màn hình) trong số một số khác.
  • Sau khi nhấn SysRq+ STôi đợi một giây rồi khởi động lại bằng SysRq+ B.
  • Sau khi khởi động lại và đăng nhập vào bảng điều khiển, tôi không thấy dấu vết của bất kỳ sự cố nào. Mục nhập gần đây nhất là từ việc sử dụng Wireshark, nhưng vẫn còn khoảng cách 45 phút.

(Tôi đang chạy Linux v3.8-rc5-218-ga56e160 btw)

Vì vậy, làm thế nào tôi có thể chắc chắn rằng các bản ghi của tôi được giữ lại khi khởi động lại bất thường do bị khóa?


Bạn có biết vấn đề này cuối cùng đã được giải quyết systemdhay chưa? Gần đây tôi đang thấy những vấn đề tương tự. Tôi đã đăng chi tiết tại đây -> unix.stackexchange.com/questions/414871/iêu
kaptan

@kaptan systemd vẫn không trực tiếp xóa nhật ký để lưu trữ liên tục. Xem SyncIntervalSectùy chọn (trong số những người khác) ở người đàn ông journald.conf(5).
Lekensteyn

tnx cho câu trả lời của bạn. từ man jounrnald.conf(5): SyncIntervalSec = ... Lưu ý rằng việc đồng bộ hóa được thực hiện vô điều kiện ngay lập tức sau khi thông báo nhật ký ưu tiên CRIT, ALERT hoặc EMERG đã được ghi lại. Do đó, cài đặt này chỉ áp dụng cho các thông báo của các cấp ERR, CẢNH BÁO, THÔNG BÁO, THÔNG TIN, DEBUG. Điều này không có nghĩa đơn giản là nếu một lỗi nghiêm trọng được ghi lại, nó được cho là được đồng bộ hóa "ngay lập tức" mà không cần chờ khoảng thời gian? Vì vậy, có nghĩa là nếu một lỗi nghiêm trọng xảy ra, chúng ta phải thấy nó trong journaldnhật ký. Tui bỏ lỡ điều gì vậy?!
kaptan

@kaptan Rất ít tin nhắn được ghi lại với mức độ nghiêm trọng CRIT. Nếu các ứng dụng thực sự sử dụng các thông báo được thiết lập với thuộc tính này (hầu hết thì không), nó có thể kích hoạt việc xóa. Trong các trường hợp khác (ví dụ ERR), nó sẽ không bị xóa ngay lập tức.
Lekensteyn

Câu trả lời:


4

Vì vậy, tôi đã hỏi trên kênh IRC #systemd và hóa ra journald (trình nền ghi nhật ký của systemd) hoàn toàn không định kỳ ghi nhật ký vào đĩa. Điều này có nghĩa là nhật ký của bạn luôn có nguy cơ bất cứ lúc nào.

Gửi SIGUSR2đến các journaldbản ghi nguyên nhân được ghi vào đĩa, nhưng nếu bạn làm điều này nhiều lần, nhiều tệp sẽ được tạo. (tùy chọn này thực sự được mô tả là "xoay vòng log").

Cuối cùng, tôi quyết định thực hiện một đề nghị khác: sử dụng trình nền syslog chuyên dụng để thu thập nhật ký kernel. Vì rsyslog đã được đề xuất (và tôi đã có kinh nghiệm với nó), tôi đã khám phá tùy chọn đó hơn nữa. Tôi đã viết thêm một số chi tiết trong Arch Wiki về việc sử dụng rsyslog.

Ý tưởng là để chạy rsyslog, chỉ thu thập dữ liệu từ cơ sở kernel. Vì rsyslog đọc từ /proc/kmsg(chỉ cho phép một người đọc) và journald đọc từ /dev/kmsg(nhiều người đọc được phép), không có cách nào mà daemon mất nhật ký (rất quan trọng đối với tôi!). Định cấu hình rsyslog để ghi thông điệp kernel vào một tệp và đảm bảo rằng tệp này được xoay để tránh ăn không gian đĩa của bạn.

Giải pháp này không hoàn hảo:

  • Các nhật ký khác (ví dụ: từ NetworkManager) bị mất. Điều này có thể được giải quyết bằng cách chuyển tiếp nhiều nhật ký từ syslog sang journald (điều này có nghĩa là sao chép!)
  • Sao chép nhật ký. Các thông điệp kernel được ghi vào hai tệp. Đây không phải là vấn đề, nói chung số lượng nhật ký là nhỏ và bạn muốn có nhiều bản sao của nhật ký hơn là không có. Bạn cũng có thể sử dụng các công cụ nhanh như greptrên tệp nhật ký đơn hoặc chậm hơn, nhưng nhanh hơn journalctl.

Có một mục TODO để xóa nhật ký thường xuyên hơn, nhưng điều đó vẫn chưa đủ đáng tin cậy:

Nhật ký: gửi tin nhắn đánh dấu mỗi giờ và sau đó, và ngay lập tức đồng bộ hóa với fdatasync () để có các đồng bộ được bảo đảm hàng giờ.

Bây giờ, hy vọng systemd / journald sẽ có tùy chọn để ghi nhật ký vào đĩa, nhưng trong khi đó chúng ta có thể kết hợp các công cụ để đạt được mục tiêu.


2

Có hai bản cập nhật:

  1. Bây giờ, hy vọng systemd / journald sẽ có tùy chọn để ghi nhật ký vào đĩa, nhưng trong khi đó chúng ta có thể kết hợp các công cụ để đạt được mục tiêu.

Có một lựa chọn --sync:

Yêu cầu daemon tạp chí ghi tất cả dữ liệu nhật ký chưa được ghi vào hệ thống tệp sao lưu và đồng bộ hóa tất cả các tạp chí. Cuộc gọi này không trả về cho đến khi hoàn thành thao tác đồng bộ hóa. Lệnh này đảm bảo rằng bất kỳ thông điệp tường trình nào được viết trước khi gọi nó được lưu trữ an toàn trên đĩa tại thời điểm nó trả về.

--synccó sẵn từ v228:

Tạp chí đã đạt được một công tắc "--sync" mới yêu cầu trình nền nhật ký ghi tất cả các thông điệp nhật ký chưa được ghi vào đĩa và đồng bộ hóa các tệp trước khi quay lại.

  1. Nó chỉ ra rằng journald (daemon ghi nhật ký của systemd) hoàn toàn không định kỳ ghi nhật ký vào đĩa. Điều này có nghĩa là nhật ký của bạn luôn có nguy cơ bất cứ lúc nào.

man journald.conf(5) nói:

SyncIntervalSec =

Thời gian chờ trước khi đồng bộ hóa các tập tin tạp chí vào đĩa. Sau khi đồng bộ hóa, các tệp nhật ký được đặt ở trạng thái OFFLINE. Lưu ý rằng đồng bộ hóa được thực hiện vô điều kiện ngay lập tức sau khi thông báo nhật ký ưu tiên CRIT, ALERT hoặc EMERG đã được ghi lại. Do đó, cài đặt này chỉ áp dụng cho các thông báo của các cấp ERR, CẢNH BÁO, THÔNG BÁO, THÔNG TIN, DEBUG. Thời gian chờ mặc định là 5 phút.

SyncIntervalSec=có sẵn từ v199:

journald bây giờ sẽ xóa các tệp nhật ký vào đĩa một cách rõ ràng sau 5 phút sau mỗi lần ghi. Các tập tin sau đó cũng sẽ được đánh dấu ngoại tuyến cho đến lần ghi tiếp theo. Điều này sẽ tăng độ tin cậy trong trường hợp va chạm. Có thể cấu hình độ trễ đồng bộ hóa thông qua SyncIntervalSec = trong journald.conf.

Xem thêm:

journald: gửi SIGTERM / SIGINT với mức độ ưu tiên thấp

Hãy đảm bảo xử lý tất cả dữ liệu nhật ký được xếp hàng trước khi thoát, để chúng tôi không mất tin nhắn không cần thiết khi tắt.


Thông tin tốt, nhưng "[journald] không định kỳ xóa nhật ký vào đĩa" có mâu thuẫn với tùy chọn SyncIntervalSec không?
Lekensteyn

"[journald] không định kỳ xóa các bản ghi vào đĩa" là một trích dẫn từ câu trả lời ban đầu. "SyncIntervalSec" được cập nhật.
Evgeny Vereshchagin

Ah, tôi đã không nhận thấy rằng bài viết khác của tôi đã được trích dẫn. Định dạng hơi sai lệch
Lekensteyn
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.