donga-donga 作業記録 1606464907

これは何?

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