Genieを用いた方法
(古いため、下記にある公式対応のSystemdの話へどうぞ)
筆者環境: WSL2上のUbuntu-20.04 LTS (Windows 10 Home)
WSLを利用していたら、たまに見かけるこのエラー
System has not been booted with systemd as init system (PID 1)
どうも、原因はWSLでsystemdが使えないからみたいですね。
じゃあ、使えるようにしましょう。
先人の知恵は素晴らしいもので、Genieというリポジトリでsystemdを使えるようにできます。
https://github.com/arkane-systems/genie
コマンドの流れです
$ sudo apt install daemonize
$ sudo apt-get install -y gpg
$ wget -O - https://packages.microsoft.com/keys/microsoft.asc | gpg --dearmor -o microsoft.asc.gpg
$ sudo mv microsoft.asc.gpg /etc/apt/trusted.gpg.d/
$ wget https://packages.microsoft.com/config/ubuntu/20.04/prod.list
$ sudo mv prod.list /etc/apt/sources.list.d/microsoft-prod.list
$ sudo chown root:root /etc/apt/trusted.gpg.d/microsoft.asc.gpg
$ sudo chown root:root /etc/apt/sources.list.d/microsoft-prod.list
$ sudo apt-get update; \
> sudo apt-get install -y apt-transport-https && \
> sudo apt-get update && \
> sudo apt-get install -y dotnet-sdk-3.1
genieをセットアップするために必要なdotnetのSDKをインストールしました。
次に、genie本体をインストールします。
$ curl -s https://packagecloud.io/install/repositories/arkane-systems/wsl-translinux/script.deb.sh | sudo bash
$ mkdir /etc/apt/sources.list.d
$ touch /etc/apt/sources.list.d/wsl-translinux.list
$ sudo vim /etc/apt/sources.list.d/wsl-translinux.list
vimでdeb [trusted=yes] https://wsl-translinux.arkane-systems.net/apt/ /
を追記しておきましょう。
追記を忘れるとアップデート時に429 Too Many Requests
が発生します。
$ sudo apt install -y systemd-genie
インストールが無事に終わったら
$ genie -s
で実行しましょう。
アップデート時にエラーが出るのが気持ち悪いという方はsudo rm -rf /etc/apt/sources.list.d/wsl-translinux.list
で解決できます。
最後に.bashrcか.bash_profileに
if [ "`ps -eo pid,cmd | grep systemd | grep -v grep | sort -n -k 1 | awk 'NR==1 { print $1 }'`" != "1" ]; then
genie -s
fi
を書き込んでおけば、シェル起動時にgenieも起動してくれます。
ps aux
でsystemd+
のプロセスが動いていれば大丈夫です。
お疲れ様でした。
WSL公式がSystemdをサポートしました (2021年9月更新)
記事を書いて2年ほど経ったある日、こんな記事が出てきました。
...自分がやった方法必要なくなったのでは?ということで、更新をかけておきます。
公式対応のSystemdを用いるためには、まずバージョン確認が必要です。
wsl --version
バージョンが 0.67.6 以上であれば、利用可能になっています。
Windows Insiderの対象ならすぐに使えますが、しばらく待てば全ての人が使えるようになるはずです...
バージョンに問題がなさそうであれば、wsl.confファイルに設定を追加します
# 公式ドキュメントでは nano を使っていますが、nanoは宗教上ちょっと...
sudo vim /etc/wsl.conf
追加する内容は下記の通りです。
[boot]
systemd=true
設定を追加した後はPowerShell等で wsl.exe --shutdown
を実行し、WSLを再起動します。
その後、WSLでsystemctl list-unit-files --type=service
を実行し、Systemd が動いているのが確認できれば終了です。
お疲れさまでした。