Windows11 の WSL2 では、通常は systemd が起動しておらず、Microsoft 独自の init が PID 1 で起動しています。2022年3月に、WSL2 で systemd を使えるように genie や distrod を試して、私は distrod を継続して使用していました。そんな中、WSL2 Ubuntu の標準機能で systemd が使えるようになるとの記事を見つけました。Windows11 22H2 を再 install したタイミングでもあり、WSL2 Ubuntu 標準の systemd を試しに使用してみました。
- はじめに
- WSL2 Ubuntu 22.04.1 LTS install
- WSL2 Ubuntu 22.04.1 LTS の systemd を有効化
- WSL2 Ubuntu 22.04.1 LTS 再起動、systemd が有効か確認
- 正常に起動していない service への対処
- まとめ
はじめに
Windows11 の WSL2 では、install したままの状態では systemd が起動していません。Microsoft 独自の init が PID 1 で起動していて、daemon は一昔前の SystemV とも異なる方法で管理する必要があり、現代的な systemd を使用している distribution とは異なる方法で少々面倒に感じていました。
そこで、genie や distrod のような、Windows11 WSL2 で systemd を使えるようにする software を試してみました。
どちらも PID 1 が systemd となり、systemctl も使え、daemon の起動・停止も通常の Ubuntu と同様に行う事が出来るようになりました。個人的には distrod の方が好みで、先日 Windows11 22H2 を再 install するまでは常用の環境として使用していました。
そのような中、窓の杜で以下の記事を見つけました。
米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
hiro@hiro-PC:~$ cat /etc/os-release | grep -i pretty PRETTY_NAME="Ubuntu 22.04.1 LTS"
WSL2 Ubuntu 22.04.1 LTS の systemd を有効化
こちらの記事によれば、現在は systemd は無効で起動する事、/etc/wsl.conf
に systemd = true
を追記する事で systemd を有効にできる事が書かれていました。中身は空白でしたので追記します。
$ 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 が出ない
との事です。下記の方法で対処しました。
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 です。私が購入した時よりも更に価格が下がっていますので、お買い時かと思います。