わかりました次のスレッドという答えなさい。しかし、答えは一般的な答えではありません。これは特定のケースの問題を示していますが、一般的なものではありません。
私の質問は:ソートサイクルをデバッグする方法はありますか?一般的などのように?例:ループを説明し、あるデバイスが別のデバイスに接続される理由を説明するコマンドはありますか?
たとえば、次のようになります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 verify
。systemd-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が無限ループになることを意味します。
これ治癒法とても簡単です - 言葉を変えてください「後ろに」到着「これから」必要に応じてその逆の場合も同様です。