WSLでRailsアプリケーションを起動する際に毎回
sudo service postgresql start
していました。3回目ぐらいになっていい加減めんどくさくなってきました。
背景
現代のLinuxは常駐アプリケーションの起動にsystemdというプログラムを使っています。 systemd はPIDが1でないと動かないという制約があります。 WSL2ではこの制約が満たせないので、systemd が使えず、WSL2の起動時に自動でPostgreSQLを起動出来ません。
これを解決する方法がいくつかあります。
- GitHub - arkane-systems/genie: A quick way into a systemd "bottle" for WSL
- GitHub - sorah/subsystemctl: Utility to run systemd in WSL2 with a Linux namespace
- 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
この後UACがでて承認すると、コマンドプロンプトが立ち上がります。
ここで入れるパスワードがわかりませんでした。Windowsに設定したPINではないようです。
schtasks
はWindowsの起動時に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
に展開するだけのようです。
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 · GitHub
のshell_hook::enable_default_shell_hook()
みたいです。
これが何かはわかりません。