テクノロジー · 実用ガイド

systemd status=200/CHDIR?権限変更の前にサービスのファイルシステムを証明する

有効なユニットと journal の errno を読み、設定ユーザーとしてサービス名前空間内の作業ディレクトリを検査します。User=root や chmod 777 で隠しません。

元のイラスト:有効ユニット、errno、サービスの見える範囲、終了証明。
元のイラスト:権限変更前にサービスが見るパスを証明します。 Watch at Ease

status=200/CHDIR は、systemd がサービスコマンドを実行する前に指定された作業ディレクトリへ移動できなかったことを示します。実行ファイルが存在し、シェルで動いても、サービスはそれ以前の段階で失敗します。

有効なユニット、journal の完全なエラー、設定ユーザー、サービスが見るファイルシステムを保存します。これにより、存在しないパス、親ディレクトリの検索権限、名前空間の不一致を分離できます。

有効なユニットと最初の失敗を固定する

systemctl cat で本体と drop-in を保存し、systemctl show で User、Group、WorkingDirectory、RootDirectory、RootImage を取得します。最初の失敗前後の journalctl も保存します。

まだ権限を変更しません。200/CHDIR は段階を示し、errno が「存在しない」「権限拒否」「ディレクトリではない」などの分岐を示します。

サービスのファイルシステム内で WorkingDirectory を解決する

RootDirectory や RootImage が有効なら WorkingDirectory はその内部で解釈されます。マウント名前空間やユーザー名前空間も見えるパスを変えます。ホスト上の存在だけでは証明になりません。

ENOENT では有効なルートの各要素を追います。先頭のマイナスは欠落を意図的に無視する指定です。管理対象のパスなら RuntimeDirectory や StateDirectory も検討します。

設定されたサービスユーザーで経路を検査する

Linux は各ディレクトリ要素に検索権限を要求します。親、ACL、MAC ポリシーが妨げることがあります。namei -l と、設定ユーザーによる読み取り専用の cd/pwd テストで確認します。

有効な User と Group を使います。root の成功はサービスユーザーの到達性を証明しません。証拠が示す所有者、グループ、ACL、検索ビット、ポリシーだけを修正します。

記録された errno に合う修復を選ぶ

ENOENT はパス修正、正しいルートでの作成やマウント、早すぎる削除の停止で直します。EACCES は特定の親経路や ACL、ENOTDIR はファイルや壊れたリンクを直します。

User=root や chmod 777 を修復にしません。作業ディレクトリが任意なら依存を外すか、文書化されたマイナス動作を明示的に使い、フォールバックを説明します。

サービスを弱めず終了条件を証明する

設定変更時は daemon-reload 後に一度再起動し、status と journal を保存します。意図したユーザーのまま動作し、/proc/$MainPID/cwd などで期待するディレクトリを確認します。

200/CHDIR が消え、権限を弱めず cwd が正しく、二回目の再起動も成功した時だけ完了です。比較用に有効ユニットと errno の記録を残します。

元のイラスト:ENOENT、EACCES、ENOTDIR などを分岐します。
元のイラスト:記録された errno に従い、証明された境界だけを修復します。 Watch at Ease