デバッグロック - systemdが私のログを失う

デバッグロック - systemdが私のログを失う

Arch Linux から systemd に「アップグレード」してから予期しないダウンタイムが発生した場合、ログは失われます。私は戦う同じログ損失の問題1ヶ月前にこの問題が再発生しました。他にも独立確認

状態:

  • Javaおよびネットワーク関連のユーティリティで作業中にKDE(時計)が停止することがわかりました。 CPUファンでノイズが発生し、熱が上昇し続けます。しかし、マウスポインタはまだ動くことができます。
  • 別のコンピュータでSSHを試みました(「ホストへのパスなし」のため失敗しました)。
  • 私は数分間待ちました。おそらく、NMIウォッチャーは問題のあるタスクを終了する可能性があります。サイコロがありません。
  • Ctrl++は+以降も機能AltしませF1ん。SysRqR
  • 上記のステップが機能していないので、SysRqシーケンスREIを発行することにしました。その後、E画面は黒く変わりますが、コンソールもありません。 +以降でもSysRqないK
  • したがって、セッションが失われたように見える唯一のことは、デバッグ情報を収集することだけです。見ているウィキペディアSysRq、+ d(ディスプレイロック)などを押すことにしました。
  • SysRq+を押してからSしばらく待ってSysRqから+で再開しましたB
  • 再起動してコンソールにログインしても、競合の兆候は表示されません。最後に記録された項目はWiresharkを使用したものですが、まだ45分の間隔があります。

(ところで私はLinux v3.8-rc5-218-ga56e160を実行しています)

もしそうなら、ロックによって予期しない再起動が発生した場合にログが保存されるようにするにはどうすればよいですか?

答え1

それで、#systemd IRCチャネルに問い合わせた結果、ジャーナルド(systemdのジャーナルデーモン)が定期的にディスクにログをまったくフラッシュしないことがわかりました。これはあなたのログが常に危険にさらされていることを意味します。

SIGUSR2ログに公開するとjournaldログがディスクに書き込まれますが、それを複数回実行すると多くのファイルが生成されます。 (このオプションは実際に「ログの回転」として説明されています。)

最後に、私は別の提案をすることにしました:専用のsyslogデーモンを使用してカーネルログを収集することです。 rsyslogが提案されているので(そしてすでにそれを使った経験があるので)、そのオプションをもっと詳しく見ました。詳細についてはに書きました。アーチスウィキrsyslog 使用情報。

アイデアはrsyslogを実行し、カーネル施設からのみデータを収集することです。 rsyslogの読み取り/proc/kmsg(単一のリーダーのみを許可)とJournaldの読み取り(複数のリーダーを許可)により、/dev/kmsgデーモンがログを失うことは不可能です(私にとって非常に重要です!)。カーネルメッセージをファイルに書き込むようにrsyslogを設定し、ディスクスペースの消費を防ぐためにファイルを循環させる必要があります。

このソリューションは完璧ではありません。

  • NetworkManagerのログなどの他のログは失われます。この問題は次のように解決できます。SyslogからJournaldにさらにログを渡す(これは重複を意味します!)
  • ログが重複しています。カーネルメッセージは2つのファイルに書き込まれます。これは問題ではありません。通常、ログ数が少ないため、ログコピーがないよりも多くのログコピーがあることをお勧めします。grepシングルログファイルなどの高速ツールや遅いですが、高度なツールを使用することもできますjournalctl

一つあるやることリストログをより頻繁にフラッシュするために使用されますが、まだ十分に信頼できません。

ログ:時々マーカーメッセージを送信し、すぐにfdatasync()と同期して毎時同期を保証します。

systemd / journaldにはディスクにログを書き込むオプションがありますが、その間に目標を達成するためにツールを組み合わせることができます。

答え2

2つのアップデートがあります。

  1. systemd / journaldにはディスクにログを書き込むオプションがありますが、その間に目標を達成するためにツールを組み合わせることができます。

オプションがあります--sync:

記録されていないすべてのログデータをバックアップファイルシステムに書き込み、すべてのログを同期するようにログデーモンに要求します。この呼び出しは、同期操作が完了するまで返されません。このコマンドは、呼び出し前に作成されたすべてのログメッセージが返されたときにディスクに安全に保存されることを保証します。

--syncで利用可能v228:

Journalctlは、ログデーモンがこれまでに記録されていなかったすべてのログメッセージをディスクに書き込み、返す前にファイルを同期するように要求する新しい「--sync」スイッチを取得しました。

  1. Journald(systemdのジャーナルデーモン)は、定期的にログをディスクにフラッシュしないことがわかりました。これはあなたのログが常に危険にさらされていることを意味します。

man journald.conf(5)説明する:

同期間隔(秒)=

ログファイルをディスクに同期する前のタイムアウトです。同期後、ログファイルはOFFLINE状態になります。優先順位がCRIT、ALERT、EMERGであるログメッセージをログに記録した後、無条件にすぐに同期が完了することに注意してください。したがって、この設定はERR、WARNING、NOTICE、INFO、およびDEBUGレベルのメッセージにのみ適用されます。デフォルトのタイムアウトは5分です。

SyncIntervalSec=で利用可能v199:

Journaldは、各書き込み後5分以内にログファイルを明示的にディスクにフラッシュします。その後、ファイルは次に書き込むまでオフラインで表示されます。これにより、衝突が発生したときの安定性が向上します。同期遅延は、Journald.confのSyncIntervalSec =で設定できます。

また見なさい:

Journald:低い優先順位でSIGTERM / SIGINTを送信する

終了時に待機しているすべてのログデータが処理され、終了時に不要なメッセージが失われないようにしましょう。

関連情報