Distrodを使ってWSL2でsystemdを動かす

2022/01/11に公開

Distrod become a systemd

関連記事:
WSL2(Ubuntu 20.04)上でSnapdを動かす
WSLにDocker代替のPodmanを入れてみる

------------------- ↓ 前書はここから ↓-------------------

前回Podmanをインストールした。
記事にはしなかったがsystemdがないことで躓いた点がいくつもあった。
なので、今回はsystemdを入れる方法をちょっと調べたのだが、
Distrod がいい感じっぽいので使ってみることにする。
(他にもarkane-systems/genieを使う手があるっぽいが面倒そうなのでやめた)
以前のsnapd問題も解決するかもな。

起動しなくなった時の対応法

まずは動かなくなった時のことを考えて、
復旧の仕方から記載する
Distrodを既存のWSLに導入することは可能なのだが、
以下のようなエラーが出てwslが起動なくなることがあるようだ。

wsl
 [Distrod][ERROR] Failed to spawn the command.

 Caused by:
    No such file or directory (os error 2)

userをrootにして、
強引にbashを起動して無効化処理を加える
コマンド後に出るエラーは無視でいい

wsl --user root -e /bin/bash
sudo /opt/distrod/bin/distrod disable
 [Distrod] Distrod has been disabled. Now systemd will not start automatically.
 [Distrod][WARN] whoami.exe had an error: <3>init: (18) ERROR: UtilConnectUnix:501: connect failed 111
 <3>init: (19) ERROR: UtilConnectUnix:501: connect failed 111
 [Distrod][WARN] Failed to disable the autostart on Windows boot.: Powershell failed. exit status: 255 

コマンド実行後再度WSLを起動してみるとログインできている・・・はず。
実環境でmanjaroを使っているのだが、
導入したら上記のエラーでこけてかなり焦った。

閑話休題

さて、気を取り直してインストールしていこう。
既存のWSLよりも新規の方がいいかもしれない。
(やり直しが効くし)

ヾ(・ω<)ノ" 三三三● ⅱⅲ コロコロ♪

------------------- ↓ 本題はここから ↓-------------------

Distrodを使ってUbuntuを新規にインストール

といってもウィザードがしっかりしていて、
コマンドを選択するだけでインストールは終わる。

WSLゲストOSのインストール

以下より最新版をダウンロードする

https://github.com/nullpo-head/wsl-distrod

直リンクも貼っておく
distrod_wsl_launcher-x86_64.zip

zipファイルを展開して適当な場所へ。
powershell上で実行する

distrod_wsl_launcher.exe

(・∀・)カッケー

奥に文字が進んでいきそうな感じがある。
linuxcontainers.orgよりOSを選択。
好みのものでいいがとりあえずデフォルトのubuntuを選択

バージョンを選択。

('◇')コードネームはわかりにくい

Focal=20.04 LTSを選択

ちなみにインストール先は %LocalAppData%\Distrod

あと、ユーザーとパスワードを設定して完了。
systemdが起動しているか確認してみる。

pgrep systemd -a
 1 /sbin/init systemd.setenv=WSLENV=WT_SESSION::WT_PROFILE_ID systemd.setenv=WSL_INTEROP=/run/WSL/27_interop systemd.setenv=WSL_DISTRO_NAME=Distrod --unit=multi-user.target
 36 /lib/systemd/systemd-journald
 53 /lib/systemd/systemd-udevd
 82 /lib/systemd/systemd-logind 

(・∀・) やったか!

pid1でsystemdが起動したようだ。
WSLを再起動してもちゃんとsystemdが起動している。
ただ、永続的な設定にはなっていないようで、
別途以下のコマンドで永続実行するようにしておく。

sudo /opt/distrod/bin/distrod enable

既存のUbuntuにDistrodをインストール

続いて現状稼働しているOSがあるとして、
systemdを稼働させる

既存OSを用意

powershell上でwslのゲストOSをインストールする。
今回はubuntuを選択。

wsl --install ubuntu

ユーザーやパスワードを設定。
aptを最新にしておく。

sudo apt update && sudo apt upgrade -y

systemdを起動

続いてゲストOS内にDistrodを追加する。
インストールシェルがあるので、
root権限で実行する。

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

/opt/distrod配下に各種コマンドがインストールされるので
コマンドを使ってsystemdを有効化する

sudo /opt/distrod/bin/distrod enable

一端wslを再起動する

exit
wsl -t ubuntu
wsl -d ubuntu
pgrep system -a
 1 /sbin/init systemd.setenv=WSL_DISTRO_NAME=Ubuntu systemd.setenv=WSL_INTEROP=/run/WSL/8_interop systemd.setenv=WSLENV=WT_SESSION::WT_PROFILE_ID --unit=multi-user.target
 61 /lib/systemd/systemd-journald
 79 /lib/systemd/systemd-udevd
 131 /lib/systemd/systemd-logind

(^_-)-☆ 動いたからヨシ!

------------------- ↓ 後書はここから ↓-------------------

ってかlinuxcontainers.orgからWSLにOSをぶち込めるの便利だなぁ
ここだけコマンド切り出してくれないかしら。

ディストリビューション名称を指定する

WSLのOSインストールでdistrod_wsL_launcherコマンドを使ったが、
デフォルトではインストールのディストリビューション名はDistrodとなってしまう。
これは不便なので以下のように名称を指定するほうがいい。

distrod_wsl_launcher.exe -d Arch

snapdを動かす

zennに移行してからすぐぐらいにsnapdを無理やり動かす方法を記事にした。
ただ、手法が強引だったので実運用は微妙だなと思っていた。
今回はsystemdが動くのでsnapdも動くはずだ。
ということでsnapでインストールしてみる。

sudo apt install -y snapd
sudo snap install chromium
 2021-12-28T22:21:49+09:00 INFO Waiting for automatic snapd restart...
 chromium 96.0.4664.110 from Canonical✓ installed
sudo snap install microk8s --classic
 microk8s (1.22/stable) v1.22.4 from Canonical✓ installed

(* ̄0 ̄) オー!!

snapd動いてるな。

--start-on-windows-bootをつけてない理由

さて、マニュアルをご覧になった方は疑問に思ったかもしれない。
マニュアル記載の起動コマンドは、

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

windows起動と同時にsystemdを動かすオプションのようだが、
個人的には余計なのでつけていない。
(まぁwindows11はサポートしてないみたいだけど)

WSLの利用ではLinux起動もdocker起動も全部手動にしている。
限られたリソースでやりくりしてるからだ。
(そこまで大げさではないけど)

ゲームしてるときは別にwslもdockerもいらないけど、
上記をつけると裏で動いていることになる。

まぁ、お好みで。

Discussion