Windows 10(WSL2)のUbuntuでsystemctlを利用できるようにする

2022年8月現在、WSL2でUbuntuをインストールすると、デフォルトではinitが使われておりsystemctlが利用できませんでした。その問題を解決する方法をまとめました。

状況

環境

OSWindows 10 21H1(19043.1889) 64bit
WSL2
LinuxディストリビューションUbuntu 20.04

エラー内容

systemctlコマンドを実行すると、下記エラーが発生します。

>systemctl poweroff

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

対応手順

GitHubで公開されているgenieを利用して解決します。

rootでログイン

sudoコマンドを多用するのでrootでログインして作業します。

# パスワードを設定していない場合は先に設定する
sudo passwd root

#rootでログイン
su

REQUIREMENTSを確認

まずは『REQUIREMENTS』を読んで先に確認しておくべきことをやっておきます。

systemd-detect-virt

====================
microsoft

wsl-translinuxリポジトリを追加

apt install lsb-release
wget -O /etc/apt/trusted.gpg.d/wsl-transdebian.gpg https://arkane-systems.github.io/wsl-transdebian/apt/wsl-transdebian.gpg
chmod a+r /etc/apt/trusted.gpg.d/wsl-transdebian.gpg
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

apt update

genieをインストール

apt install -y systemd-genie

genieを実行

genie -s

この時点では必ず下記のようなエラーになるため、それを解消します。

genie: a list of failed units follows:

  UNIT                       LOAD   ACTIVE SUB    DESCRIPTION
● multipathd.service         loaded failed failed Device-Mapper Multipath Device Controller
● ssh.service                loaded failed failed OpenBSD Secure Shell server
● systemd-remount-fs.service loaded failed failed Remount Root and Kernel File Systems
● multipathd.socket          loaded failed failed multipathd control socket

エラーを解消

おそらくここに主要なエラー原因などがまとめられています。

multipathd.service

systemctl disable multipathd.socket
systemctl disable multipathd.service

ssh.service

ssh-keygen -A

systemd-remount-fs.service

# ルートパーティションを確認
df
==============================
Filesystem      1K-blocks       Used  Available Use% Mounted on
/dev/sdb        263174212    1591044  248145012   1% /
==============================

# ラベルが「cloudimg-rootfs」でないことを確認
e2label /dev/sdb
==============================
(空白)
==============================

# ラベルに「cloudimg-rootfs」を設定
e2label /dev/sdb cloudimg-rootfs

bash起動時に自動でgenieを実行

.bashrcファイルの最終行に下記を書き込んでおきます。

vim ~/.bashrc

========================================
if [[ -v SSH_CLIENT ]]; then
  export $(systemctl show-environment)
fi

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

PowerShellからLinuxディストリビューションを再起動し、systemctlが起動しているか確認します。

# PowerShellで実行
wsl --shutdown

# WSL2(Ubuntu)で実行
ps aux
=========================
USER         PID %CPU %MEM    VSZ   RSS TTY      STAT START   TIME COMMAND
root           1  1.7  0.0 172048 11692 ?        Ss   11:53   0:00 systemd