1.Genieを利用することでsystemdをPID1で動作させる

WSL2+Ubuntu22.04にsystemdは、標準で入っています。

1-1. sytemctl は、PID 1 として全てのプロセスの確認
ps -aux | head -n 2
> USER       PID %CPU %MEM    VSZ   RSS TTY      STAT START   TIME COMMAND
> root         1  0.0  0.0   1744  1084 ?        Sl   11:23   0:00 /init
1-2. 実行環境
  • Windows
  1. OS: Windows 11 Home
  2. バージョン:22H2
  3. インストール日:2022/11/23
  4. OSビルド22621.963
  • Linux on WSL
NAME="Ubuntu"
VERSION="20.04.5 LTS (Focal Fossa)"
ID=ubuntu
ID_LIKE=debian
PRETTY_NAME="Ubuntu 20.04.5 LTS"

2. 設定

2-1. 事前にパッケージをアップデートしておきます。
sudo apt -y update
sudo apt -y dist-upgrade
2-2. 依存パッケージのインストール
sudo apt install -y daemonize dbus gawk libc6 policykit-1 python3 python3-pip python3-psutil systemd systemd-container
 # パッケージの最新版取得、更新
sudo apt update
sudo apt dist-upgrade
2-3. wsl-transdebian のリポジトリ設定
sudo su # superuserになる
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 # リポジトリ情報を更新
exit # userに戻る
2-4. system-genie をインストール
sudo apt install -y systemd-genie
2-5. Genie の設定を行う
sudo cp /etc/genie.ini /etc/genie.ini.bak  # 設定ファイルをバックアップ
sudo sed -i 's/systemd-timeout=240/systemd-timeout=30/g' /etc/genie.ini  # タイムアウトを30秒に設定
sudo sed -i 's/update-hostname=true/update-hostname=false/g' /etc/genie.ini   
 # ホスト表示に-wslが追加されないように設定
sudo ssh-keygen -A # sshdエラー回避の設定 
2-6. PID 1 を systemd にする
root@PCName:~$ genie -s
genie: WARNING: systemd default target is default.target; targets other than multi-user.target may not work
genie: WARNING: if you wish to use a different target, this warning can be disabled in the config file
genie: WARNING: if you experience problems, please change the target to multi-user.target
Waiting for systemd....!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
genie: systemd did not enter running state (degraded) after 30 seconds
genie: this may be due to a problem with your systemd configuration
genie: information on problematic units is available at https://github.com/arkane-systems/genie/wiki/Systemd-units-known-to-be-problematic-under-WSL
genie: a list of failed units follows:

  UNIT                       LOAD   ACTIVE SUB    DESCRIPTION
● systemd-remount-fs.service loaded failed failed Remount Root and Kernel File Systems
● multipathd.socket          loaded failed failed multipathd control socket

LOAD   = Reflects whether the unit definition was properly loaded.
ACTIVE = The high-level unit activation state, i.e. generalization of SUB.
SUB    = The low-level unit activation state, values depend on unit type.

2 loaded units listed.
genie: WARNING: systemd is in degraded state, issues may occur!
2-7. PID 1 が systemd になっているか確認します。
$ ps -aux | head -n 2
> USER         PID %CPU %MEM    VSZ   RSS TTY      STAT START   TIME COMMAND
> root           1  1.3  0.3 175776 13204 ?        Ss   11:37   0:01 systemd
2-8. sytemd のdefault.target を変更
systemctl get-default
> graphical.target
sudo systemctl set-default multi-user.target
> Created symlink /etc/systemd/system/default.target → /lib/systemd/system/multi-user.target.
sudo systemctl list-dependencies
2-9. systemd-remount-fs.serviceのエラーを解消する

参考URL

cat /etc/fstab
> LABEL=cloudimg-rootfs   /        ext4   defaults        0 0
2-10. ルートパーティションのデバイスを確認します。
df
> Filesystem     1K-blocks      Used Available Use% Mounted on
> /dev/sdc       263174212   1789084 247946972   1% /

Mounted on が / になっている項目がルートパーティションです。

2-11. ルートパーティションにラベルを付与します。
sudo e2label /dev/sdc cloudimg-rootfs
2-12. その他対応していないサービスを無効化する
sudo systemctl disable getty@tty1
> Removed /etc/systemd/system/getty.target.wants/getty@tty1.service.
sudo systemctl disable multipathd.socket # WSL自体が非対応
> Removed /etc/systemd/system/sockets.target.wants/multipathd.socket.
2-13. systemctl が実行できるか確認
systemctl status sshd
> ● ssh.service - OpenBSD Secure Shell server
>      Loaded: loaded (/lib/systemd/system/ssh.service; enabled; vendor preset: enabled)
>      Active: active (running) since Mon 2022-07-25 11:59:40 JST; 10s ago
2-14. WSL 起動時に Genie を実行するようにする
(.bashrc の確認)
ls -la ~/
> -rw-r--r-- 1 fehde fehde 3771 Jul 25 11:23 .bashrc
2-15. .bashrc を編集
cat << _EOF_ >> ~/.bashrc
> 
> # Are we in the bottle?
> if [[ ! -v INSIDE_GENIE ]]; then
>   read -t 3 -p "yn? * Preparing to enter genie bottle (in 3s); abort? " yn
>   echo
> 
>   if [[ \$yn != "y" ]]; then
>     echo "Starting genie:"
>     exec /usr/bin/genie -s
>   fi
> fi
> _EOF_

3. WSL2+Ubuntu22.04に標準で入ったsystemd

3-1. /etc/wsl.confの設定
(/etc/wsl.conf)
[user]
default=matsu

# wsl.conf内にブート時に実行するコマンドを追加する。
[boot]
command = /usr/libexec/wsl-systemd
systemd = true

これでMicrosoft initではなくsystemdが起動するようになります。Microsoftの/initはPID2で起動し、ログインプロセス?(WSL.exeから起動するコンソールアクセス)については /init の子孫として起動します。nslogin等も不要です。

3-2. systemdを起動する
nsloginを実行
$  /usr/libexec/nslogin
$ sudo /usr/libexec/wsl-systemd
$ ps ax
3-3. 確認
sudo systemctl status docker
Failed to dump process list for 'docker.service', ignoring: Input/output error
● docker.service - Docker Application Container Engine
     Loaded: loaded (/lib/systemd/system/docker.service; enabled; vendor preset: enabled)
     Active: active (running) since Thu 2022-12-29 11:37:18 JST; 7h ago
TriggeredBy: ● docker.socket
       Docs: https://docs.docker.com
   Main PID: 391 (dockerd)
      Tasks: 76
     Memory: 236.5M
     CGroup: /system.slice/docker.service
以上