systemdでソートサイクルをデバッグする一般的な方法

systemdでソートサイクルをデバッグする一般的な方法

わかりました次のスレッドという答えなさい。しかし、答えは一般的な答えではありません。これは特定のケースの問題を示していますが、一般的なものではありません。

私の質問は:ソートサイクルをデバッグする方法はありますか?一般的などのように?例:ループを説明し、あるデバイスが別のデバイスに接続される理由を説明するコマンドはありますか?

たとえば、次のようになりますjournalctl -b(日付を無視します。私のシステムには時間を同期させるRTCはありません)。

Jan 01 00:00:07 host0 systemd[1]: Found ordering cycle on sysinit.target/start
Jan 01 00:00:07 host0 systemd[1]: Found dependency on local-fs.target/start
Jan 01 00:00:07 host0 systemd[1]: Found dependency on cvol.service/start
Jan 01 00:00:07 host0 systemd[1]: Found dependency on basic.target/start
Jan 01 00:00:07 host0 systemd[1]: Found dependency on sockets.target/start
Jan 01 00:00:07 host0 systemd[1]: Found dependency on dbus.socket/start
Jan 01 00:00:07 host0 systemd[1]: Found dependency on sysinit.target/start
Jan 01 00:00:07 host0 systemd[1]: Breaking ordering cycle by deleting job local-fs.target/start
Jan 01 00:00:07 host0 systemd[1]: Job local-fs.target/start deleted to break ordering cycle starting with sysinit.target/start

ここで、cvol.service(ループを破るために導入されたサービス)は次のとおりです。

[Unit]
Description=Mount Crypto Volume
After=boot.mount
Before=local-fs.target

[Service]
Type=oneshot
RemainAfterExit=no
ExecStart=/usr/bin/cryptsetup open /dev/*** cvol --key-file /boot/***

[Install]
WantedBy=home.mount
WantedBy=root.mount
WantedBy=usr-local.mount

Journalctlによると、cvol.serviceはbasic.serviceを望んでいますが、少なくとも明らかではありませんが、そうではありません。このリンクのソースを示すコマンドはありますか?一般に、ループを探してループ内の各リンクのソースを表示できるコマンドはありますか?

答え1

コマンドを使用してループを可視化できますsystemd-analyze verifysystemd-analyze dotグラフィックビジュアライゼーション dotツール:

systemd-analyze verify default.target |&
perl -lne 'print $1 if m{Found.*?on\s+([^/]+)}' |
xargs --no-run-if-empty systemd-analyze dot |
dot -Tsvg >cycle.svg

次の内容が表示されます。

ここに画像の説明を入力してください。

ここでこのループを見ることができます。c.service->b.service->a.service->c.service

Color legend: 
    black     = Requires
    dark blue = Requisite
    dark grey = Wants
    red       = Conflicts
    green     = After

リンク:

答え2

このリンクのソースを示すコマンドはありますか?

得られる最も近い結果は、特定のsystemctl show -p Requires,Wants,Requisite,BindsTo,PartOf,Before,After cvol.service単位の結果(有効な)依存関係のリストを表示することです。

ループを探してループ内の各リンクのソースを表示するコマンドはありますか?

私が知る限り、そのような順序はありません。実際、systemdはソートサイクルをデバッグするのに役立つ機能を提供しません(ため息)。

Journalctlによると、cvol.serviceはbasic.serviceを望んでいますが、少なくとも明らかではありませんが、そうではありません。

まず、要件の依存関係(Wants=などRequires=)は依存関係の順序(および)BindsTo=とは無関係です。ここに見えるのはBefore=After=注文するWants=依存性循環、つまり背中とは何の関係もありません。

第二に、特定のタイプのユニット間に多くの「基本依存性」が生成される。彼らは以下によって制御されますDefaultDependencies=このセクションのガイドライン[Unit](例:デフォルトで有効)。

特に、このディレクティブが明示的に無効にされない限り、すべての.service-typeユニットは暗黙的Requires=basic.targetおよびAfter=basic.target依存関係を取得します。これはまさにあなたが見ているのと同じです。この内容は次のように記録されます。システムサービス(5)

答え3

ステップ1:default.targetに対して確認コマンドを実行する

systemd-analyze verify default.target

ステップ2:メッセージに記載されているサービスまたはターゲットを観察する「systemdはジョブを削除して注文サイクルを中止します」完全な依存関係のリストを表示します。

systemctl show -p Requires,Wants,Requisite,BindsTo,PartOf,Before,After <service or target name mentioned in the "breaking cycle" message>

ステップ3:通常、サービスまたはターゲットファイルで定義されている「以降」および「前」グループを確認します。

/lib/systemd/system

連続しているがアウトバウンド順に知られているサービスまたはターゲットを探します。

例:

dbus.service

一般的に表示「後ろに」

multi-user.target

しかし、「これから」

sockets.target

この依存関係は、以下を呼び出すことで簡単に観察できます。

systemctl list-dependencies default.target

しかし、ファイルの場合

/lib/systemd/system/dbus.service

次の行が含まれます。

Before=multi-user.target

または

After=sockets.target

または両方は、dbus.serviceがアウトバウンドとして定義され、systemdが無限ループになることを意味します。

これ治癒法とても簡単です - 言葉を変えてください「後ろに」到着「これから」必要に応じてその逆の場合も同様です。

関連情報