Arch Linux on WSL2 で systemd を動かす
2022/02/01 追記
genie をやめ、 Distrod へ移行しました。
Distrod は以下が良いです
- 既存ディストロへのインストールが簡単 (シェルスクリプト実行するだけ)
- 新規ディストロのインストールが簡単 (コマンド実行するだけで systemd 対応のディストリを WSL へ登録できる)
- genie 等のコマンドを経由しないWSLコマンド実行 (VSCode の Remote 拡張のシェルセッションなど) も systemd 管理下プロセスとして起動される
- (genieと比較して) .NET ランタイムや libc への依存がなく、ディストロのパッケージ更新で壊れる可能性が低い (Distrod の依存ライブラリが同梱されており、システム側ライブラリに依存しない)
昨日のエントリは systemd はいらないなどと言っていましたが、 podman コンテナ上で systemd を動かすためにはホスト側でも systemd が動いていないといけないようだったので、観念して systemd をセットアップしました。
tl;dr
- GitHub - arkane-systems/genie: A quick way into a systemd "bottle" for WSL
- genie をインストール
- How To Run A Script or Command At Logoff in Windows 7 & 8 - NEXTOFWINDOWS.COM
- Windows ログオフ時に systemd を終了させるようグループポリシーを設定
- WindowsTerminal で genie 経由で systemd セッションを立ち上げるよう変更
genie のインストール
上記リポジトリに含まれている PKGBUILD は古いバージョン用のものだったので、自分で新たに PKGBUILD を作成しました。
2021/1/18 追記: genie 1.31 へアップデートしました。 2021/1/18 追記2: GitHub へ移動しました。
Arch パッケージガイドライン - ArchWiki によると /usr/libexec
は避けろとのことだったので、 /usr/lib/genie
にファイルを配置しても動くよう、ソースコードを編集するような PKGBUILD になっています。
手元環境で試した限りでは問題なく動作しています。
depends
と makedepends
が AUR にあり makepkg -s
が使えないため、以下のようにインストール。また、 community リポジトリの dotnet はバージョンが古いため、 AUR の dotnet-sdk-bin
をインストールします。
$ paru -S --needed --asdeps daemonize inetutils dotnet-sdk-bin $ makepkg -si
グループポリシーの設定
以下のスクリプトを適当なパス (今回は %userprofile%\scripts\logoff.bat
) に配置します。
wsl -d Arch -- genie -u wsl -t Arch
wsl -t Arch
を実行しているのは、 genie -u
実行後、WSL を再起動することなく再度 genie -i
などを実行すると何かおかしなことになるためです。
(ログオフ時には WSL も終了されると思うので明示的に行う必要はないと思いますが、念のため。)
以下記事に従い設定します。
以下方法で動作確認しました。
- 上記を設定
genie -i
を実行し systemd を立ち上げる- Windows をログアウト & 再ログイン
genie -s
でシェル立ち上げ後、journalctl
でログを確認するsystemd-shutdown
等のログが出ていればOK (たぶん)
Windows Terminal の設定
自分は Windows Terminal を利用しているため、設定変更し端末を開いた時点で systemd 管理下にログインするよう設定しました。
{ "guid": "{a5a97cb8-8961-5535-816d-772efe0c6a3f}", "hidden": false, "name": "Arch", "source": "Windows.Terminal.Wsl", "startingDirectory": "//wsl$/Arch/home/nksm", "icon": "ms-appdata:///Local/archlinux.png", "commandline": "wsl -d Arch -- genie -s" },
重要なのは commandline
です。
以上で systemd の設定が完了します。 また、無事 podman コンテナ内で systemd を立ち上げることもできるようになりました。
追記
ログイン時にも wsl -d Arch -- genie -i
を実行する方が良いかもしれません。
初回のWindows Terminal 起動時に wsl -d Arch -- genie -s
を実行すると、 systemd の起動が間に合わないからか failed to connect bus
といったエラーが出ることがあるためです。
2021/1/18 追記: 上記 issue は genie 1.31 で修正されました。
追記2
systemd インストール後、全パッケージを再インストールした方が良いかもしれません。 非 systemd 環境ではパッケージインストール時に dbus 関連でエラーが出るパッケージがあり、正しく設定されていないかもしれないためです。
$ pacman -Qqn | sudo pacman -S -
追記3
PKGBUILD に間違いがあった (10-genie-envvar.sh のインストール先がおかしかった) ため、修正しました。