WSL2 で systemctl を使えるようにする


WSL2 で Rocky Linux を構築したのですが、systemctl コマンドを実行しようとすると以下のエラーが表示されます。

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

WSL2 上で systemd を起動するための genie というツールを使います。
これを使用すると、WSL2 内で systemd の PID が 1 の状態で起動してくれます。

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

環境

  • Rocky Linux が WSL2 上で起動できる

手順

EPEL を有効にする

genie をインストールするときに EPEL を有効にする必要があります。

dnf install epel-release

genie をインストールする

  1. rpm を取得します。

    wget https://github.com/arkane-systems/genie/releases/download/v2.3/genie-2.3-1.fc34.x86_64.rpm
    
  2. genie をインストールする。

    dnf install genie-2.3-1.fc34.x86_64.rpm
    

python3.6 を python3.9 にアップデートする。

このまま genie を起動すると、エラーが起きてしまいます。

# genie -s
Traceback (most recent call last):
  File "/usr/lib64/python3.6/runpy.py", line 193, in _run_module_as_main
    "__main__", mod_spec)
  File "/usr/lib64/python3.6/runpy.py", line 85, in _run_code
    exec(code, run_globals)
  File "/usr/lib/genie/genie/__main__.py", line 904, in <module>
  File "/usr/lib/genie/genie/__main__.py", line 889, in entrypoint
  File "/usr/lib/genie/genie/__main__.py", line 692, in do_shell
  File "/usr/lib/genie/genie/__main__.py", line 399, in pre_systemd_action_checks
  File "/usr/lib/genie/genie/__main__.py", line 196, in get_systemd_state
  File "/usr/lib64/python3.6/subprocess.py", line 423, in run
    with Popen(*popenargs, **kwargs) as process:
TypeError: __init__() got an unexpected keyword argument 'capture_output'

genie をインストールすると、python もインストールするのですが、そのバージョンが 3.6 になっているのでエラーが起きてしまいます。

# python3 --version
Python 3.6.8

エラーを解消するには、python を 3.7 以上にアップグレードする必要があります。

  1. Python3.9 をインストールします。

    dnf install python39
    
  2. シンボリックリンクを変更します。

    rm -rf /usr/bin/python3
    ln -s /usr/bin/python3.9 /usr/bin/python3
    rm -rf /usr/bin/pip3
    ln -s /usr/bin/pip3.9 /usr/bin/pip3
    rm -rf /usr/bin/pip-3
    ln -s /usr/bin/pip-3.9 /usr/bin/pip-3
    

psutil をインストールする

Python をアップグレードして、実行してもまだエラーが起きます。

# genie -s
Traceback (most recent call last):
  File "/usr/lib64/python3.9/runpy.py", line 197, in _run_module_as_main
    return _run_code(code, main_globals, None,
  File "/usr/lib64/python3.9/runpy.py", line 87, in _run_code
    exec(code, run_globals)
  File "/usr/lib/genie/genie/__main__.py", line 14, in <module>
ModuleNotFoundError: No module named 'psutil'

エラーメッセージに従って、psutil をインストールします。

  1. psutil をインストールします。

    python3 -m pip install psutil
    

genie を起動する

これで準備が完了したので、genie を起動します。

genie -s

起動できたら、systemctl を実行してみると実行できていることがわかります。

# systemctl status
● DESKTOP-ODH2FE5-wsl
    State: running
     Jobs: 0 queued
   Failed: 0 units
    Since: Tue 2022-04-05 17:17:26 JST; 5s ago
   CGroup: /
           ├─init.scope
           │ └─1 systemd
           └─system.slice
             ├─systemd-journald.service
             │ └─22 /usr/lib/systemd/systemd-journald
             ├─systemd-machined.service
             │ └─33 /usr/lib/systemd/systemd-machined
             ├─system-container\x2dshell.slice
             │ └─[email protected]
             │   ├─34 /bin/bash -l
             │   ├─35 (sd-pam)
             │   ├─51 systemctl status
             │   └─52 (pager)
             └─dbus.service
               └─27 /usr/bin/dbus-daemon --system --address=systemd: --nofork --nopidfile --systemd-activation --syslog-only

まとめ

これで使えるようになりました。
また、起動時に毎回 genie -s を実行してほしいので、以下のサイトを参考にしたりして試したのですができませんでいた。
OS の違いなのかなーと思うんですけど、いまだ解決できずです。
そのため、毎回実行する必要があります。

https://qiita.com/amenoyoya/items/41a2334cbc1facb87864