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 の状態で起動してくれます。
環境
- Rocky Linux が WSL2 上で起動できる
手順
EPEL を有効にする
genie をインストールするときに EPEL を有効にする必要があります。
dnf install epel-release
genie をインストールする
-
rpm を取得します。
wget https://github.com/arkane-systems/genie/releases/download/v2.3/genie-2.3-1.fc34.x86_64.rpm
-
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 以上にアップグレードする必要があります。
-
Python3.9 をインストールします。
dnf install python39
-
シンボリックリンクを変更します。
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 をインストールします。
-
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 の違いなのかなーと思うんですけど、いまだ解決できずです。
そのため、毎回実行する必要があります。
Author And Source
この問題について(WSL2 で systemctl を使えるようにする), 我々は、より多くの情報をここで見つけました https://zenn.dev/km1992/articles/4dc74aa582be06著者帰属:元の著者の情報は、元のURLに含まれています。著作権は原作者に属する。
Collection and Share based on the CC protocol