hiroの長い冒険日記

主にコンピュータ周辺の興味を持った内容を綴ります

Windows11 WSL2 で Ubuntu 標準の systemd を使ってみた

当日記ではアフィリエイト広告を利用しています

Windows11 の WSL2 では、通常は systemd が起動しておらず、Microsoft 独自の init が PID 1 で起動しています。2022年3月に、WSL2 で systemd を使えるように genie や distrod を試して、私は distrod を継続して使用していました。そんな中、WSL2 Ubuntu の標準機能で systemd が使えるようになるとの記事を見つけました。Windows11 22H2 を再 install したタイミングでもあり、WSL2 Ubuntu 標準の systemd を試しに使用してみました。

はじめに

Windows11 の WSL2 では、install したままの状態では systemd が起動していません。Microsoft 独自の init が PID 1 で起動していて、daemon は一昔前の SystemV とも異なる方法で管理する必要があり、現代的な systemd を使用している distribution とは異なる方法で少々面倒に感じていました。

そこで、genie や distrod のような、Windows11 WSL2 で systemd を使えるようにする software を試してみました。

hiro20180901.hatenablog.com

どちらも PID 1 が systemd となり、systemctl も使え、daemon の起動・停止も通常の Ubuntu と同様に行う事が出来るようになりました。個人的には distrod の方が好みで、先日 Windows11 22H2 を再 install するまでは常用の環境として使用していました。

そのような中、窓の杜で以下の記事を見つけました。

forest.watch.impress.co.jp

Microsoftは9月21日(現地時間)、「Windows Subsystem for Linux」(WSL)ディストリビューションで「systemd」が利用可能になったと発表した。「systemd」に依存するLinuxアプリケーションを「WSL」で利用可能になる。

「WSL」で「systemd」を利用するには、v0.67.6以降の「Microsoft Store」版「WSL」が必要。

Windows11 22H2 を install した時点でも WSL2 の Version は上記のよりも古かったのですが、Microsoft Store で WSL2 の update があり更新した所 v0.70 となっていました。

C:\Users\hiro>wsl --version
WSL バージョン: 0.70.0.0
カーネル バージョン: 5.15.68.1
WSLg バージョン: 1.0.45
MSRDC バージョン: 1.2.3575
Direct3D バージョン: 1.606.4
DXCore バージョン: 10.0.25131.1002-220531-1700.rs-onecore-base2-hyp
Windowsバージョン: 10.0.22621.674

新しく install した Windows11 22H2 の WSL2 の環境設定も途中だった事もあり、Windows11 WSL2 Ubuntu 標準の systemd を試してみる事にしました。

WSL2 Ubuntu 22.04.1 LTS install

wsl コマンドでは選択肢として表示されませんが、Microsoft Store では Ubuntu 22.04.1 LTS が選べるようになっていましたので、こちらを使用する事にしました。

最近の WSL2 Ubuntu では、WSLg が使えるようになった為か、install が GUI で進みます。

ただ、message が日本語化されているものの、WSLg の表示は文字化けしています。恐らく font が install されていない為だと思います。

'English' を選択すれば文字化けは解消できますので、後で日本語回りは入れるとして English で進めます。

Profile setup で Full name、User name、Password x2 を入力します。これまでは CUI で入力していた項目ですね。

Advanced setup で設定する項目は、automount の location と optionの入力、/etc/hosts と /etc/resolv.conf を自動生成するかの選択になります。どちらも標準の状態で OKです。

Setup complete、apt update & upgrade を実施するように記載されていますが、これは後回しにします。

これで終了です。wsl では Ubuntu-22.04 と表示されますが、Windows Terminal の menu や /etc/os-release では Ubuntu 22.04.1 LTS になっています。

Windows Terminal (cmd):

C:\Users\hiro>wsl --list --verbose
  NAME            STATE           VERSION
* Ubuntu-22.04    Running         2
  PlamoLinux      Stopped         2

WSL2 Ubuntu bash :

hiro@hiro-PC:~$ cat /etc/os-release | grep -i pretty
PRETTY_NAME="Ubuntu 22.04.1 LTS"

WSL2 Ubuntu 22.04.1 LTS の systemd を有効化

forest.watch.impress.co.jp

こちらの記事によれば、現在は systemd は無効で起動する事、/etc/wsl.confsystemd = true を追記する事で systemd を有効にできる事が書かれていました。中身は空白でしたので追記します。

WSL2 Ubuntu bash :

$ sudo vim /etc/wsl.conf
[boot]
systemd = true

WSL2 Ubuntu 22.04.1 LTS 再起動、systemd が有効か確認

apt update & upgrade は後回しにして、WSL2 Ubuntu 22.04.1 LTS を再起動して systemd を有効化します。最初の起動に若干時間を要しましたが(10秒程度か?)問題なく起動しました。2回目以降は時間はかかりません。

hiro@hiro-PC:~$ ps aux
USER         PID %CPU %MEM    VSZ   RSS TTY      STAT START   TIME COMMAND
root           1  0.5  0.0 167392 12508 ?        Ss   18:23   0:00 /sbin/init
root           2  0.0  0.0   2440  1432 ?        Sl   18:23   0:00 /init
root          54  0.0  0.0  39604 15176 ?        S<s  18:23   0:00 /lib/systemd/systemd-journald
root          82  0.1  0.0  22476  6248 ?        Ss   18:23   0:00 /lib/systemd/systemd-udevd
root          92  0.2  0.0   4852  1908 ?        Ss   18:23   0:00 snapfuse /var/lib/snapd/snaps/core20_1587.snap /snap/core20/1587 -o ro,nodev,allow_other,suid
root          93  0.0  0.0   4692  1520 ?        Ss   18:23   0:00 snapfuse /var/lib/snapd/snaps/lxd_22923.snap /snap/lxd/22923 -o ro,nodev,allow_other,suid
root          94  3.0  0.0   4712  1852 ?        Ss   18:23   0:02 snapfuse /var/lib/snapd/snaps/snapd_16292.snap /snap/snapd/16292 -o ro,nodev,allow_other,suid
systemd+     114  0.0  0.0  16112  8012 ?        Ss   18:23   0:00 /lib/systemd/systemd-networkd
message+     118  0.0  0.0   8772  4508 ?        Ss   18:23   0:00 @dbus-daemon --system --address=systemd: --nofork --nopidfile --systemd-activation --syslog-only
root         123  0.0  0.0  35236 18924 ?        Ss   18:23   0:00 /usr/bin/python3 /usr/bin/networkd-dispatcher --run-startup-triggers
root         124  0.0  0.0 234480  6540 ?        Ssl  18:23   0:00 /usr/libexec/polkitd --no-debug
syslog       127  0.0  0.0 222396  5168 ?        Ssl  18:23   0:00 /usr/sbin/rsyslogd -n -iNONE
root         131  0.8  0.1 1981992 53336 ?       Ssl  18:23   0:00 /usr/lib/snapd/snapd
root         140  0.0  0.0  15328  7524 ?        Ss   18:23   0:00 /lib/systemd/systemd-logind
root         147  0.0  0.0 392752 12684 ?        Ssl  18:23   0:00 /usr/libexec/udisks2/udisksd
root         183  0.0  0.0 316932 13532 ?        Ssl  18:23   0:00 /usr/sbin/ModemManager
systemd+     271  0.0  0.0  25256 12128 ?        Ss   18:23   0:00 /lib/systemd/systemd-resolved
root         302  0.0  0.0   9488  1276 ?        Ss   18:23   0:00 /usr/sbin/cron -f -P
root         307  0.0  0.0 112340 21524 ?        Ssl  18:23   0:00 /usr/bin/python3 /usr/share/unattended-upgrades/unattended-upgrade-shutdown --wait-for-signal
root         310  0.0  0.0   8392  1056 pts/0    Ss+  18:23   0:00 /sbin/agetty -o -p -- \u --noclear --keep-baud console 115200,38400,9600 vt220
root         314  0.0  0.0   8768  1084 tty1     Ss+  18:23   0:00 /sbin/agetty -o -p -- \u --noclear tty1 linux
root         951  0.0  0.0   2848   412 ?        Ss   18:24   0:00 /init
root         952  0.0  0.0   2848   416 ?        R    18:24   0:00 /init
hiro         955  0.0  0.0  11340  5500 pts/1    Ss   18:24   0:00 -bash
root         956  0.0  0.0   7520  4964 pts/2    Ss   18:24   0:00 /bin/login -f
hiro        1079  0.0  0.0  17064  9512 ?        Ss   18:24   0:00 /lib/systemd/systemd --user
hiro        1080  0.0  0.0 170176  4720 ?        S    18:24   0:00 (sd-pam)
hiro        1088  0.0  0.0  11372  5080 pts/2    S+   18:24   0:00 -bash
hiro        1108  0.0  0.0  12664  1552 pts/1    R+   18:25   0:00 ps aux

PID 1 は Microsoft init のままですが、systemd-journald や systemd-udevd が早い段階で起動している事、systemctl や journalctl が使用できる事から、systemd が有効になっていると思います。

systemctl で起動に失敗している service があるか確認しました。

hiro@hiro-PC:~$ systemctl list-units | grep -i 'failed failed'
● ssh.service                   loaded failed failed    OpenBSD Secure Shell server
● systemd-remount-fs.service    loaded failed failed    Remount Root and Kernel File Systems
● systemd-sysusers.service      loaded failed failed    Create System Users

3つの service が正常に起動していませんでした。

正常に起動していない service への対処

apt udpate & upgrade (解決せず)

まず最初に、apt update & upgrade を実行しました。systemd が起動していない状態で upgrade すると設定が実行されないかもしれない可能性があったので、このタイミングで実行しました。

hiro@hiro-PC:~$ sudo apt update
hiro@hiro-PC:~$ sudo apt upgrade

しかし、これでは解消できませんでした。一つずつ解決します。

ssh.service

ssh server を起動する service です。genie を試した時にも発生していました。host 用の key を作成すれば OK です。

hiro@hiro-PC:~$ sudo ssh-keygen -A
hiro@hiro-PC:~$ systemctl restart ssh.service

hiro@hiro-PC:~$ systemctl list-units ssh.service
  UNIT        LOAD   ACTIVE SUB     DESCRIPTION
  ssh.service loaded active running OpenBSD Secure Shell server

systemd-remount-fs.service

root partition の label が cloudimg-rootfs ではない為に発生しています。genie を試した時にも発生していました。root partition に LABEL を設定すれば解消します。

hiro@hiro-PC:~$ mount | grep '\s/\s'
/dev/sdc on / type ext4 (rw,relatime,discard,errors=remount-ro,data=ordered)
hiro@hiro-PC:~$ sudo e2label /dev/sdc cloudimg-rootfs

hiro@hiro-PC:~$ sudo systemctl restart systemd-remount-fs.service

hiro@hiro-PC:~$ systemctl list-units systemd-remount-fs.service
  UNIT                       LOAD   ACTIVE SUB    DESCRIPTION
  systemd-remount-fs.service loaded active exited Remount Root and Kernel File Systems

systemd-sysusers.service

genie の github に issue が出ていました。
github.com

また、qiita にも記事がありました。(私の過去記事への link がありました)
qiita.com

genie の github issue に書かれていた内容は、

  • kernel module の sg と crypt_user が WSL2 では load されていないのが原因
  • 'LoadCredential=' と対処すれば読み込まないので error が出ない

との事です。下記の方法で対処しました。

zenn.dev

hiro@hiro-PC:~$ sudo systemctl edit systemd-sysusers.service
[Service]
LoadCredential=

hiro@hiro-PC:~$ sudo systemctl restart systemd-sysusers.service
hiro@hiro-PC:~$ systemctl list-units systemd-sysusers.service
  UNIT                     LOAD   ACTIVE SUB    DESCRIPTION
  systemd-sysusers.service loaded active exited Create System Users

/etc/systemd/system/systemd-sysusers.service.d/override.conf に追記されます。

対処完了

これで failed は出なくなり、全ての service が起動できるようになりました。

まとめ

genie や distrod ではなく、Windows11 WSL2 Ubuntu 22.04.1 LTS の標準の systemd を有効にして使ってみました。genie の時と同様に一部の service が起動できない状態となりましたが、同じ対処で正常に起動するようになりました。

apt line の追加等を伴わずに、Ubuntu 22.04.1 LTS のみの機能で systemd を有効にできるのは便利ですし、今後の update に常に追従できる安心感があります。

現在は install 直後は無効ですが、初期状態で有効になれば3つの service が起動できなかった件についても対処されると思いますので、使い勝手は更に向上すると思います。

install の際の WSLg を利用した GUI は便利ですが、日本語環境では文字化けするのが残念な所です。日本語フォントを install しているかどうか、だと思いますので (頻繁に install する訳ではありませんが) 改善される事を期待します。

Amazon 扱いの nVidia Geforce RTX3070、玄人志向 GALAKURO です。私が購入した時よりも更に価格が下がっていますので、お買い時かと思います。