遂にWSLでsystemdをサポート!
以下雑訳。
Windows Subsystem for Linux (WSL) は、WSL ディストロの内部で systemd を実行できるようになり、Windows マシンで Linux ワークフローをより多く実行できるようになりました。
本記事では、その内容をご紹介します。
- systemdとは何か、systemdで何ができるのか?
- WSLではどのようにこの変更が可能なのでしょうか?
- あなたのマシンにsystemdを入れるにはどうしたらいいですか?
その概要は、以下のビデオをご覧ください。
systemdとは何か、systemdで何ができるのか?
Systemd は、Linux システムの基本的なビルディングブロックのスイートです。PID 1として動作し、システムの残りの部分を起動するシステムおよびサービス・マネージャを提供します。
Ubuntu や Debian など、多くの人気のあるディストリビューションはデフォルトで systemd を走らせています。この変更により、WSL はベアメタルマシン上でお気に入りの Linux ディストリビューションを使うのとさらに近くなり、systemd のサポートに依存するソフトウェアを使えるようになることを意味します。
systemd に依存する Linux アプリケーションの例をいくつか挙げます。
- snap
- Ubuntu内部にソフトウェアをインストールし、管理することができる便利なバイナリ
- Try running:
snap install spotify
orsnap install postman
- microk8s
- Kubernetesをお使いのシステム上でローカルに素早く動作させることができます。
- スタートアップチュートリアルを試す
- systemctl
- systemd の一部であり、Linux マシンのサービスと対話するためのツール
systemctl list-units --type=service
を使って、利用可能なサービスとその状態を確認します。
WSLではどのようにこの変更が可能なのでしょうか?
systemd をサポートするためには、WSL のアーキテクチャを変更する必要がありました。systemd は PID 1 を要求するので、Linux ディストリビューション内で起動する WSL init プロセスは systemd の子プロセスになります。WSL initプロセスはLinuxとWindowsのコンポーネント間の通信のためのインフラを提供する責任があるので、この階層を変更することは、WSL initプロセスで作られたいくつかの仮定を考え直す必要がありました。クリーンなシャットダウン(シャットダウンは systemd によって制御されます)と WSLg との互換性を確保するために、追加の修正をしなければなりませんでした。WSL インスタンスは以前と同じ方法で生存し続けますが、これについてはこちらを参照してください。
これが起動時の WSL の動作を変えることを考えると、ユーザーの既存の WSL ディストリビューションにこれを適用することには注意を払いたいと思いました。そのため、現在は特定の WSL ディストリビューションで systemd を有効にするためにオプトインする必要がありますが、私たちはフィードバックを監視して、将来的にこの動作をデフォルトにすることを検討します。
マシンにsystemdを入れるにはどうしたらいいですか?
始めるには、この2つが必要です。WSLが正しいバージョンで動作していることを確認する:バージョン0.67.6以上 – WSLディストロの設定にあるsystemdフラグを設定する
正しいWSLバージョンであることを確認する
この変更は、Microsoft Store 版の WSL バージョン 0.67.6 以降でのみ利用可能です。バージョン番号は、wsl --version
を実行して確認することができます。このコマンドが失敗した場合、Windows版WSLが動作しているため、Store版にアップグレードする必要があります。
このバージョンのWSLは、初期テストのためにWindows InsidersビルドのユーザーにMicrosoft Storeで提供されており、その後、数週間後に品質を確保するためにすべてのユーザーに提供する予定です。wsl --update
を実行することで、WSLの更新を確認することができます。
Windows Insidersに入っていない方で、すぐに使いたい方は、WSLのリリースページから最新版をダウンロードすることができます。
WSLディストロの設定にあるsystemdフラグを設定する
ブート時に systemd が起動するように、wsl.conf ファイルを編集する必要があります。
以下の行を /etc/wsl.conf
に追加します(エディターを sudo 権限で実行する必要があることに注意してください、例: sudo nano /etc/wsl.conf
)。
[boot]
systemd=true
そして、CTRL+Oで保存、CTRL+Xで終了して、nanoエディタを閉じます。
最終ステップ
以上の手順で、WSL ディストロの Windows を終了し、PowerShell から wsl.exe --shutdown
を実行して、WSL インスタンスを再起動します。起動すると、systemd が起動しているはずです。systemctl list-unit-files --type=service
でサービスの状態を確認することができます。
謝辞とご意見をお寄せください
この機能を提供するために協力してくれたCanonicalチームに感謝します! Canonicalのブログポストはこちらです。技術的な問題については、Microsoft/WSLのGithubレポにご報告ください。WSLチームメンバー、または私のTwitterでフォローアップすることができます。最後に、Git、VS Code、Dockerコンテナ、データベース、機械学習のためのGPUアクセラレーションなどの一般的な開発ツールのセットアップ方法など、WSLに関する詳細については、WSLドキュメントをご覧ください。
やってみた
GitHubから最新プリリリースのWSLのパッケージを落としてきて、手動アップデートするとWSL2のUbuntuでsystemdを動かすことが出来ました。手順は上の通り。
2022/09/26 追記 systemdのapt upgradeに失敗する
本機能を活かしておくと、systemdのアップグレードに失敗します。復旧するためには/etc/wsl.conf
でsystemdを以下のようにoffにして、wsl --shutdown
してから、ディストリビューションを起動し直してください。systemdのアップグレード後systemdを活かすことも可能です。
[boot]
systemd=false
コメント