Windows 10 or 11 Home(WSL2)のUbuntuでsystemctlを利用する方法(systemdをPID1で動作させる方法)

2020年8月9日Windows

 

WSL2にUbuntuをインストールし systemctl コマンドを実行すると以下のようなエラーが発生し実行することができません。

$ systemctl
System has not been booted with systemd as init system (PID 1). Can't operate.
Failed to connect to bus: Host is down

そのため、以下のようなことができずに起動後に service コマンドを実行するシェルなどを実行して我慢していました。

  • サービスの自動起動などを設定することができない
  • 内部的にsystemctlを利用しているシステムを実行できない(minikubeなど)

今回この問題を解決する方法を解説されているサイトを元に手順をまとめてみましたので、同じ現象で困っている方は試してみてください。

 

[2021/8/7]Update

OSをWindows11をアップグレードするために、クリーンインストールすることになり、WSL2の環境を再構築すると、これまでに方法ではsystemdをPID1で動作させることができなくなっていたため、手順を更新しました。

大きくは変わっていませんが、dotnetのバージョンなど依存プログラムが変わっているのでそのあたりに気をついて設定すれば問題なく利用できました。

Windows11でも問題なしです。

systemctlでエラーが発生する原因

答えは先ほどの systemctl コマンドのエラーメッセージにもありますが、 systemd PID1 で動作していないためです。

エラーメッセージ

System has not been booted with systemd as init system (PID 1).

実際に ps aux コマンドでプロセスの状態を確認すると確かに PID1 init プロセスとなっていることがわかります。

$ ps aux
USER       PID %CPU %MEM    VSZ   RSS TTY      STAT START   TIME COMMAND
root         1  0.0  0.0    892   552 ?        Sl   15:30   0:00 /init
root        49  0.0  0.0    892    80 ?        Ss   15:30   0:00 /init
root        50  0.0  0.0    892    80 ?        S    15:30   0:00 /init
snow        51  0.0  0.0  10040  4992 pts/0    Ss   15:30   0:00 -bash
snow       130  0.0  0.0  10604  3316 pts/0    R+   16:11   0:00 ps aux

原因がわかったので、対策としては systemd PID1 で動作させる方法がわかれば、なんとかなりそうです。

systemdプロセスをPID1で稼働させる方法

以下のGitHubで公開されている genie を利用することで systemd を PID1 で動作させることができます。

https://github.com/arkane-systems/genie

 

では、順番に設定していきましょう。

daemonizeなどの各種依存モジュールをインストール

genie のREADMEにも書かれていますが、debian系の場合は各種モジュールが必要となっています。

READMEの抜粋

Dependent packages on Debian are daemonizedbusdotnet-runtime-5.0gawklibc6libstdc++6policykit-1systemd, and systemd-container. For the most part, these are either already installed or in the distro and able to be installed automatically. You need debhelper and dotnet-sdk-5.0 (and optionally pbuilder) to build the Debian package, but not to simply build genie or install locally.

The chief exception is dotnet-runtime-5.0 , for which you will need to follow the installation instructions here:

記載されている依存モジュールを全部インストールします。

sudo apt install -y daemonize dbus dotnet-runtime-5.0 gawk libc6 libstdc++6 policykit-1 systemd systemd-container

 

dotnet-runtime-5.0をインストール

以下のmicrosoftのページを参考にインストール用のコマンドを作成します。

https://docs.microsoft.com/en-us/dotnet/core/install/linux-ubuntu#2004-

ubuntuのバージョンが20.04の場合は以下のコマンドを実行すればOKです。

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
rm packages-microsoft-prod.deb

sudo apt-get install -y dotnet-runtime-5.0

 

wsl-transdebianのリポジトリ設定

以下のページを参考に wsl-transdebianのリポジトリを設定します。

https://arkane-systems.github.io/wsl-transdebian/

sudo apt install apt-transport-https

sudo wget -O /etc/apt/trusted.gpg.d/wsl-transdebian.gpg https://arkane-systems.github.io/wsl-transdebian/apt/wsl-transdebian.gpg

sudo chmod a+r /etc/apt/trusted.gpg.d/wsl-transdebian.gpg

sudo cat << EOF > /etc/apt/sources.list.d/wsl-transdebian.list
deb https://arkane-systems.github.io/wsl-transdebian/apt/ $(lsb_release -cs) main
deb-src https://arkane-systems.github.io/wsl-transdebian/apt/ $(lsb_release -cs) main
EOF

sudo apt update

genieインストール

genie をインストールします。

sudo apt install -y systemd-genie

 

genieを実行しsystemdをPID1にする

genie がインストールできたら実行してみましょう。

genie -s

 

genieを起動時に実行するようにする

.bashrc ファイルに以下のページを参考に追記しましょう。

https://github.com/arkane-systems/genie/wiki/Automatically-start-genie-on-every-shell-session

# Are we in the bottle?
if [[ ! -v INSIDE_GENIE ]]; then
  echo "Starting genie:"
  exec /usr/bin/genie -s
fi

これで、次回実行時に systemd がPID1でない場合 genie -s が実行されます。

 

systemdがPID1で稼働しているか確認する

$ ps aux
USER         PID %CPU %MEM    VSZ   RSS TTY      STAT START   TIME COMMAND
root           1  0.2  0.2 173092 13104 ?        Ss   18:43   0:00 /bin/systemd
root          44  0.1  0.2  53484 15464 ?        S<s  18:43   0:00 /lib/systemd/systemd-journald
root          65  0.0  0.0  18284  4944 ?        Ss   18:43   0:00 /lib/systemd/systemd-udevd
systemd+      70  0.0  0.1  18680  7860 ?        Ss   18:43   0:00 /lib/systemd/systemd-networkd

無事 systemd がPID1で動作しています。

 

systemctlが実行できるか確認する

sshd のステータスを systemctl で確認すると無事結果が表示されました

$ systemctl status sshd
● ssh.service - OpenBSD Secure Shell server
     Loaded: loaded (/lib/systemd/system/ssh.service; enabled; vendor preset: enabled)
     Active: failed (Result: exit-code) since Sun 2020-08-09 18:43:17 JST; 7min ago
       Docs: man:sshd(8)
             man:sshd_config(5)

Windows

Posted by snow