昨日はWSLでapache2サーバーを再起動する必要がありましたが、驚いたことにsystemctl
Ubuntuのように使用できませんでした。代わりにsudo /etc/init.d/apache2 restart
。
しかし、私の考えでは、Lennart PoetteringはMicrosoftに関連しているようです。ここで何が起こっているのでしょうか?
答え1
タイトルと質問の間に解決すべきいくつかの質問と説明があります。
マイクロソフトがsystemdを強く押し込んだ場合
Lennart PoetteringがMicrosoftに接続されていると思いました。
コメントで指摘したように、MicrosoftとPoettering、MicrosoftとSystemdの間には何の関係もありません。
Ubuntuのように使用できないことに驚きました
systemctl
。代わりに sudo /etc/init.d/apache2 restart に戻す必要があります。
これはWSLで予想されます。 WSLの「欠けている部分」の1つは、代替PID1ハイパーバイザー(別名Systemd、公平に言えば他のいくつかの機能もあります)のサポートとして残ります。
WSL githubリポジトリでこれに関連する多くの質問を見つけることができますが、2つの主な質問は次のとおりです。
問題の鍵は、WSLが独自の/init
プロセスを使用して、WindowsとLinux / WSLの間の相互運用性の大部分をブートストラップすることです。部分リストを作成しました。Ubuntuの回答に尋ねる。
Systemdの全体設計(少なくともこれに関して)では、PID1が必要です。どのすべての機能がうまく動作します。
それ可能WSL2を使用して新しいPID名前空間を起動し、SystemdをPID1として使用し、名前空間を入力して関数を使用しsystemctl
ます。ただし、多くの警告も付属しています。
ただし、これを実際に表示するには(「一般的な使用」ではありません)、次の手順を実行します。
sudo -b unshare --pid --fork --mount-proc /lib/systemd/systemd --system-unit=basic.target
# Wait 10-20 seconds for things to start up
sudo -E nsenter --all -t $(pgrep -xo systemd) runuser -P -l $USER -c "exec $SHELL"
でApacheを起動できるはずですsystemctl
。
これはいくつかの結果をもたらします。その他しかし、問題は次のとおりです。
- SystemdがWSLハンドラを削除したため、Windowsの実行可能ファイルを実行できません
binfmt_misc
。 - WindowsパスはWSL2 / Linuxパスに追加されません。
systemd-tmpfiles
ソケットが削除され、Windows 11でWSLgが機能しない- 他の人
WSL2とSystemdが連携するように設計されたいくつかのサードパーティのスクリプト(Genie、WSL2Hacksなど)がありますが、本物ほとんどの場合は必要ありません。
ご覧のとおり、ほとんどのタスクでは単にinit.d
スクリプトを使用できます(配布版に記載されている場合)。また、PID1 を必要としない Supervisord などの代替プロセス マネージャを使用することも検討できます。 Windows 11で自動的に実行され、必要な起動タスクを実行するように設定することもできます。
個人的には、WSLでSystemdではなくディストリビューションを使用してきました。dinit
これまで、プロセスマネージャを含むArtix(Archベースのディストリビューション)が非常に有望に見えます。