これは何?
WSL 上で稼動する Systemd が PID 1 で動いていない問題に対する覚え書き
重要:バージョン 0.67.6 以降の WSL は標準で systemd が利用可能です。
詳しくはこちらを参照。
前提条件
以下の環境で動作を確認するものとする。
ドキュメント作成日 | 2020-11-27 |
---|---|
Windows バージョン | 10 Version 20H2 |
WSL バージョン | 2 |
実行する OS イメージ | Ubuntu 20.04 LTS |
作業概要
問題
無知で愚かなディストリビューションを WSL 環境下で利用しようとすると、systemctl など一部の管理コマンドが実行できない状態でインストールされてしまう。つらい
$ sudo systemctl
System has not been booted with systemd as init system (PID 1). Can't operate. Failed to connect to bus: Host is down
原因
無知で愚かなディストリビューションとしては Systemd が PID 1 で動いていることを前提として構築されているが、WSL で動作させる都合 Windows システムと PID を共有して管理している。Windows 側としては当然 PID 1 を渡す気がないので問題になっている。
対応
Ubuntu では genie というコマンドが提供されているので、そいつを利用する。genie の正体は systemd を PID 1 にした簡易コンテナを作成するコマンドとその中に入る手続きのラッパーコマンドに過ぎないと聞いた。詳細は unshare と nsenter でビングると幸せになれるかもしれない。
wget https://packages.microsoft.com/config/ubuntu/20.04/packages-microsoft-prod.deb -O packages-microsoft-prod.deb sudo dpkg -i packages-microsoft-prod.deb sudo add-apt-repository universe sudo apt-get update sudo apt-get install apt-transport-https sudo apt-get update sudo apt-get install dotnet-runtime-3.1 echo "deb [trusted=yes] https://wsl-translinux.arkane-systems.net/apt/ /" | sudo tee -a /etc/apt/sources.list.d/wsl-translinux.list sudo apt update sudo apt install systemd-genie
実行
コマンド genie はシェル形式として以下の書式で実行している。
genie -s
この方法が一番簡単で気に入っているのだが、この方法では効果が永続しない。ログインするたび実行する必要があるので .profile に記載してしまうのがいいだろう。
# .profile に追記(起動していない場合は genie を起動させる) if [ "`ps -eo pid,cmd | grep systemd | grep -v grep | sort -n -k 1 | awk 'NR==1 { print $1 }'`" != "1" ]; then genie -s fi