@ledsun blog

Hのキーがhellで、Sのキーがslaveだ、と彼は思った。そしてYのキーがyouだ。

WSL2にDistrodをインストールした

WSLでRailsアプリケーションを起動する際に毎回

sudo service postgresql start

していました。3回目ぐらいになっていい加減めんどくさくなってきました。

背景

現代のLinuxは常駐アプリケーションの起動にsystemdというプログラムを使っています。 systemd はPIDが1でないと動かないという制約があります。 WSL2ではこの制約が満たせないので、systemd が使えず、WSL2の起動時に自動でPostgreSQLを起動出来ません。

これを解決する方法がいくつかあります。

  1. GitHub - arkane-systems/genie: A quick way into a systemd "bottle" for WSL
  2. GitHub - sorah/subsystemctl: Utility to run systemd in WSL2 with a Linux namespace
  3. GitHub - nullpo-head/wsl-distrod: Distrod is a meta-distro for WSL 2 which installs Ubuntu, Arch, Debian, Gentoo, etc. with systemd in a minute for you. Distrod also has built-in auto-start feature on Windows startup and port forwarding ability.

どれもコンテナ内でsystemdを起動することで、systemd の PIDを1にする手法を採っています。 このうち3番目のDistrodをインストールしました。

なぜ Distrod ?

3つのなかで一番インストールが簡単そうでした。 bash.rcの設定が必要だと、fish-shellへの読み替えが面倒でした。

僕はまだWSL環境を再構築したことがありません。 新しく作り直すのはどれぐらい時間が掛かるのか読めないのでちょっと怖いです。 すでに動いているWSL上のディストリビューションにインストール方法が明示されている点も良かったです。

ほか2つもgenieがC#で作られていて、subsystemctlがrustで作られていてなかなか興味深いです。

手順の記録

REDAMEの通りにインストールしました。

curl -L -O "https://raw.githubusercontent.com/nullpo-head/wsl-distrod/main/install.sh"
chmod +x install.sh
sudo ./install.sh install

初期化コマンドは上手く行かなかったです。

/opt/distrod/bin/distrod enable --start-on-windows-boot

f:id:ledsun:20220216071709p:plain
sudoが必要でした。

この後UACがでて承認すると、コマンドプロンプトが立ち上がります。

f:id:ledsun:20220216071747p:plain
パスワードを要求されます。

ここで入れるパスワードがわかりませんでした。Windowsに設定したPINではないようです。 schtasksWindowsの起動時にWSLを起動するために使っているようです。 今回は不要でした。 オプションを外した次のコマンドで初期化できました。

sudo /opt/distrod/bin/distrod enable

この辺でWSLを再起動して、そしたらsystemctlコマンドが使えます。

ledsun@MSI:~[4]►systemctl status postgresql                                                                        07:23
● postgresql.service - PostgreSQL RDBMS
     Loaded: loaded (/lib/systemd/system/postgresql.service; enabled; vendor preset: enabled)
     Active: active (exited) since Tue 2022-02-15 14:40:35 JST; 16h ago
   Main PID: 610 (code=exited, status=0/SUCCESS)
      Tasks: 0 (limit: 30501)
     Memory: 0B
     CGroup: /system.slice/postgresql.service

Feb 15 14:40:35 MSI systemd[1]: Starting PostgreSQL RDBMS...
Feb 15 14:40:35 MSI systemd[1]: Finished PostgreSQL RDBMS.

起動と自動起動の有効かにはsudoが必要です。

sudo systemctl start postgresql
sudo systemctl enable postgresql

その他

インストールスクリプトがやっているのは、最新ビルドを取ってきて/opt/distrodに展開するだけのようです。

https://github.com/nullpo-head/wsl-distrod/blob/e4aa1ea1a149d4027c7ca6a7fc4454455ebb7504/install.sh#L24-L26

cd /opt/distrod || error "Could not change directory to /opt/distrod"
get_release_file
tar xvf opt_distrod.tar.gz

distrod enableでやっているのは wsl-distrod/main.rs at e4aa1ea1a149d4027c7ca6a7fc4454455ebb7504 · nullpo-head/wsl-distrod · GitHubshell_hook::enable_default_shell_hook()みたいです。 これが何かはわかりません。

参考