systemd + rsyslogホストから `/dev/log`を復元する方法は?

systemd + rsyslogホストから `/dev/log`を復元する方法は?

RHEL7では、バグや2つのデーモン間の衝突によってsystemd-journald一度引き継がれた多くの項目が失われる場合があります。したがって、ソケットを復元する方法など、この呼び出しに依存するプログラムは正しく機能しません。rsyslogd/dev/logsyslog(3)logger/dev/log

答え1

Googleはこの問題についてあまり役に立ちませんので、直接質問して回答することをお勧めします。

通常、を使用すると、rsyslogdモジュールはimuxsockソケット自体を作成し、前のエントリを作成する前に切断します。停止した/dev/log場合rsyslogd(誤った設定と再起動に失敗したため)rsyslogdを削除 /dev/log

ただし、提供されたrsyslogはRHEL7とともに使用されることが予想され、systemdこのモジュールは実際にソケットをimuxsock開いて削除します。/run/systemd/journal/syslog同時にトリガーされた/dev/logシステムサービスファイルによってデバイスが作成されます。systemd-journald.socketjournald

明らかに$imjournal、以下はモジュールを使用するかどうかに関係なく機能します。

要約すると、/dev/log消えた場合:

  1. systemd-journald.socket を再起動します。

    systemctl restart systemd-journald.socket
    
  2. その後、rsyslogd を再起動します。

    systemctl start rsyslogd
    

アップデート:ソケットがすでに実行されている場合は、ソケットをもう一度削除できると思いますsystemctl restart rsyslogdrsyslogd

答え2

このsystemctl restart systemd-journald.socket && systemctl restart rsyslogソリューションはUbuntu 16.04では機能しませんでした。

/dev/log代わりに、次のシンボリックリンクを再作成する必要がありました/run/systemd/journal/dev-log

ln -s /run/systemd/journal/dev-log /dev/log

答え3

私はsystemdとrsyslogが正確にどのように機能するのかよくわかりませんが、しばらくの間、それが触れて消えた/dev/log理由と復元方法を見つけました。

前の回答で述べたように、Rsyslogにimuxsockモジュールを設定すると、/dev/logサービスの起動時にソケットが作成され、/etc/rsyslog.confサービスが停止するとソケットが削除されます。 ~によるとimuxsock ドキュメント、ソケットがsystemdを介して渡されない場合、rsyslogはソケットのみを削除します。この場合、/dev/logソケットはsystemdではなくrsyslogを介して渡されるため、サービスが停止するとソケットは削除されます。

デフォルトでは(私はFedora 36を使用しています)rsyslogはimuxsockモジュールを使用しますが、「SysSock.Use = off」パラメータを使用します。これにより、rsyslogはsyslogソケット(/dev/log)をソケットとして使用しないため、生成されません。 ()/dev/logでこの設定を使用すると、rsyslogには何も書き込まれません。module(load="imuxsock" SysSock.use="off")/etc/rsyslog.conf

しかし、基本的にロードされる別のモジュールがありますが、まさにimjournalモジュールです。これにより、rsyslogにsystemdログへのアクセス権が付与されます。私が理解している限り、rsyslogはソケットを生成しませんが、/dev/logsystemd-journal-dev-log.socketは生成します。ソケット/dev/logはにシンボリックリンクされています/run/systemd/journal/dev-log。使用されていても、  module(load="imuxsock" SysSock.use="off")rsyslogはsystemdログからデータを取得するため、アクティビティを記録し続けます。これで/dev/log -> /run/systemd/journal/dev-log作成されたため、ソケットがsystemdを介して渡されたため、rsyslogはそれを削除しません。

私の試みによれば、/dev/log後で「SysSock.use = off」パラメータが追加されたか、コメントが解除されたために消える可能性があります/etc/rsyslog.conf(imjournalモジュールがロードされた場合でも同様です)。これはrsyslogに/dev/log

間違いなくimjournalモジュールを再度追加してサービスを再起動すると、問題は解決します。しかし、混乱した部分は、これがうまくいかずに/dev/log -> /run/systemd/journal/dev-log見つからないということです。これは、systemd-journald-dev-log.socket サービスがソケットの/dev/log欠落を認識しないためです。したがって、このサービスを再起動するとソケットが失われ、systemd-journald.socketを再起動すると問題が解決します。 systemd-journald-dev-log.socketサービスを再起動しても機能するかどうかはわかりませんが、ソケットが/dev/log再起動されます。

要約すると、ソケットを回復するには、次のようにします/dev/log

  1. 以下があることを確認してください/etc/rsyslog.conf
    • module(load="imuxsock" SysSock.use="off")
    • module(load="imjournal" StateFile="imjournal.state")
  2. rsyslogの再起動
    # systemctl restart rsyslog
    
  3. systemd-journald-dev-log.socketを再起動します(「Job failed。詳細については、「journalctl -xe」を参照してください。」警告が表示されることがありますが、停止してすぐに起動するので大丈夫だと思います)。
    # systemctl restart systemd-journald-dev-log.socket
    
  4. systemd-journald.socketの再起動
    # systemctl restart systemd-journald.socket
    

注1:私が知っている限り、これはRHELシステムにのみ適用されます。 DebianまたはUbuntuベースのシステムにはこの問題がないか、他の回避策がある可能性があります。

注2:長くて混乱した答えについてお詫び申し上げます。初めて行く場所なので、まだ初心者です:D

答え4

私にとって、これはrsyslogで使用されているimuxsockモジュールがsystemdとどのように機能するかについての質問で終わりました。

内部にimuxsock ドキュメントこのモジュールがsystemdでどのように機能するかを説明します。ステップ1で問題を発見しました。

ステップ1:システムソケット名を選択

  1. ユーザーがSysSock.Use = "off"設定を明示的に選択しないと、デフォルトの受信機ソケット(「syslogソケット」または単に「システムソケット」とも呼ばれます)の名前は/ dev / logに設定されます。それ以外の場合、ユーザーがSysSock.Use = "off"を明示的に設定した場合、rsyslogは/ dev / logまたはSysSock.Nameパラメーターで定義されたソケットを受け取りません。このセクションの残りの部分は適用されません。

  2. ユーザーが sysSock.Name="/path/to/custom/socket" を指定して SysSock.Use="off" を明示的に設定しなかった場合、デフォルトのリスナーソケット名は /path/to/custom /socket override になります。 。 。

  3. それ以外の場合、rsyslogがsystemdで実行されていて/run/systemd/journal/syslogが存在する場合(そしてユーザーがSysSock.Use = "off"を明示的に設定していない場合)、デフォルトのリスナーソケット名は/run/systemd/ジャーナル再定義/になります。 syslog。

システムはステップ3に達し、デフォルトのパスを「/run/systemd/journal/syslog」に変更しましたが、まだ「/var/log」を維持します。これは、imuxsockモジュールがsystemd-journald-dev-log.socketによって生成されたシンボリックリンクが必要な/ dev / logにソケットを作成しようとすることを意味します。実際のソケットを作成できない場合でも、シンボリックリンクは削除されます。

本書の結果はこの問題rsyslog githubに報告してください。ディスカッションをスキップして変更内容に直接移動するには、次を参照してください。プロモーション#1そして広報 #2それぞれ。

私の解決策は、/etc/rsyslog.confのsystemdパスを使用するようにimuxsockモジュールを設定することでした。

module(load="imuxsock"
    SysSock.Name="/run/systemd/journal/syslog")

これは私の問題を解決しているようで、シンボリックリンクを手動で作成した後に再び消える理由を説明しているので、良い解決策のように聞こえます。

システムを見て、「/run/systemd/journal/syslog」が存在しない場合は、「syslog.socket」を見て、正常に起動したことを確認してください。これがソケットの作成を担当するものです。

systemctl status syslog.socket

rsyslog.service バージョンがサービスを有効にしようとしたときに、syslog.socket に必要なエイリアスとして syslog.service を定義していない可能性があります。複数のログサービスでsyslog.serviceのエイリアスを試すこともできます。この場合、最後にアクティブになったサービスが優先されます。

関連情報