Arch Linux on WSL2 で systemd を動かす

2022/02/01 追記

genie をやめ、 Distrod へ移行しました。

github.com

Distrod は以下が良いです

  • 既存ディストロへのインストールが簡単 (シェルスクリプト実行するだけ)
  • 新規ディストロのインストールが簡単 (コマンド実行するだけで systemd 対応のディストリを WSL へ登録できる)
  • genie 等のコマンドを経由しないWSLコマンド実行 (VSCode の Remote 拡張のシェルセッションなど) も systemd 管理下プロセスとして起動される
  • (genieと比較して) .NET ランタイムや libc への依存がなく、ディストロのパッケージ更新で壊れる可能性が低い (Distrod の依存ライブラリが同梱されており、システム側ライブラリに依存しない)

昨日のエントリは systemd はいらないなどと言っていましたが、 podman コンテナ上で systemd を動かすためにはホスト側でも systemd が動いていないといけないようだったので、観念して systemd をセットアップしました。

gifnksm.hatenablog.jp

tl;dr

genie のインストール

github.com

上記リポジトリに含まれている PKGBUILD は古いバージョン用のものだったので、自分で新たに PKGBUILD を作成しました。

2021/1/18 追記: genie 1.31 へアップデートしました。 2021/1/18 追記2: GitHub へ移動しました。

github.com

Arch パッケージガイドライン - ArchWiki によると /usr/libexec は避けろとのことだったので、 /usr/lib/genie にファイルを配置しても動くよう、ソースコードを編集するような PKGBUILD になっています。 手元環境で試した限りでは問題なく動作しています。

dependsmakedepends が 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 も終了されると思うので明示的に行う必要はないと思いますが、念のため。)

以下記事に従い設定します。

www.nextofwindows.com

以下方法で動作確認しました。

  1. 上記を設定
  2. genie -i を実行し systemd を立ち上げる
  3. Windows をログアウト & 再ログイン
  4. genie -s でシェル立ち上げ後、 journalctl でログを確認する
  5. 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 といったエラーが出ることがあるためです。

github.com

2021/1/18 追記: 上記 issue は genie 1.31 で修正されました。

追記2

systemd インストール後、全パッケージを再インストールした方が良いかもしれません。 非 systemd 環境ではパッケージインストール時に dbus 関連でエラーが出るパッケージがあり、正しく設定されていないかもしれないためです。

$ pacman -Qqn | sudo pacman -S -

追記3

PKGBUILD に間違いがあった (10-genie-envvar.sh のインストール先がおかしかった) ため、修正しました。