![Windows 10(WSL2)のUbuntuでsystemctlを利用できるようにする](https://mitikusa-engineer.com/wp-content/uploads/2022/08/Windows-1024x538.png)
2022年8月現在、WSL2でUbuntuをインストールすると、デフォルトではinitが使われておりsystemctlが利用できませんでした。その問題を解決する方法をまとめました。
状況
環境
OS | Windows 10 21H1(19043.1889) 64bit |
WSL | 2 |
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