Windows 10 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など)

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

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系の場合は deamonize が必要となっています。

今回はubuntuを利用していますので deamonize インストールします。

sudo apt install daemonize

 

dotnet-sdk-3.1インストール

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

https://docs.microsoft.com/ja-jp/dotnet/core/install/linux-ubuntu#apt-troubleshooting

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

また、 genie のREADMEには dotnet-runtime-3.1 とありますが、なぜか私の環境ではこの後 genie のコンパイルでsdkが必要というエラーがでるため dotnet-sdk-3.1 をインストールします

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インストール

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

curl -s https://packagecloud.io/install/repositories/arkane-systems/wsl-translinux/script.deb.sh | sudo bash

sudo apt install -y systemd-genie

ポイント

2020年1月頃に利用させてもらった際はmakeでコンパイルする必要がありましたが、aptでインストールできるようになってより便利になりました。

 

genieを実行しsystemdをPID1にする

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

genie -s

 

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

.bashrc ファイルに以下を追記しましょう。

if [ "`ps -eo pid,cmd | grep systemd | grep -v grep | sort -n -k 1 | awk 'NR==1 { print $1 }'`" != "1" ]; then
  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