KB5020030で始めるsystemd on Windows10

Posted by 雅楽斎 on Sunday, November 20, 2022

TOC

KB5020030というWindows10の追加機能プログラム

Windows10のセキュリティパッチではない追加プログラムとしてKB5020030が公開されました。普段なら「へ~」で終わるところなんですが、このプログラムを当てると、Windows10(Windows10 22H2で確認)でもWindows Store版のWSLを使えるようになります。

現在Windows11で使われるWSLはWindows10のものとは異なっており、以前Windows10でも(Githubで公開されている)WSLをインストールして使えばsystemdが使えるようになるはずじゃないかと思って試した時はこんな結果でした。

インストールできないことしかわからないエラーで終わっていました。

ということで、今までWindows10上のWSLでは昨年Windows11のリリース後に追加されたsystemd対応とWSLg対応が行われていませんでしたが、今回公開されたKB5020030を適用するとWindows10上のWSLでもsystemdとWSLgが使えるWSLになるという大きな変更になります(元々WSLgはWindows11のリリース前にWSLとして発表されていたので、Windows10でできない理由もなかったのですが)

systemd

何はなくともsystemdです。これがなかったこともあり、WSL2で起動時から処理を行うdaemonを実現できていませんでした(無印WSLは最初からWindowsと共存するライブラリのような扱いで、Windowsの動作ありきで動作するものでしたがWSL2はHyper-Vと同じ仕組みで動作しており、Windowsと並行してWSL2が動作し、制御だけをWindows上から行う形になっています)

WSLg

無印WSLでは多少手間がかかるものの比較的容易にWindows上で動作しているXサーバーでWSLのGUIアプリを実行することができました。WSL2ではWSLgという仕組みを使って、Windows上でXサーバーを動作させることなく、スタートメニュー等からWSL2上のGUIアプリを起動することができるようになります。

ダウンロードするもの

Windows10でsystemdとWSLgを使えるようにするためには、2つのプログラムをインストールする必要があります。KB5020030はWindows Updateから、WSLはMicrosoft Storeからダウンロードできるのですが、どちらもファイルサイズが大きいので今回はプログラム単体をインストールしました。

KB5020030(693MB)

https://www.catalog.update.microsoft.com/Search.aspx?q=KB5020030

この中から使っているPCに合うものをダウンロードします。私の場合はx64のWindows10 22H2用なので2022-11x64 ベース システム用 Windows 10 Version 22H2 の累積更新プログラム (KB5020030) をダウンロードしました。直接のリンクはこちら。

https://catalog.s.download.windowsupdate.com/c/msdownload/update/software/updt/2022/11/windows10.0-kb5020030-x64_ec78cc08e60e0b81f0bb520bd328720979d75065.msu

URLが変わる可能性があるので、KB5020030のカタログURLからリンクをたどることをおススメします。

WSL(295MB)

https://github.com/microsoft/WSL/releases

Microsoft Storeと同じものですが、執筆時点で最新のMicrosoft.WSL_1.0.0.0_x64_ARM64.msixbundleをダウンロードしました。

インストールはそれぞれファイルを実行します。時間は結構かかるので、裏でWindows Updateが走る懸念がある場合はインストール中はネットワーク切断してもいいと思います。インストールが終わって、再起動をするとWSL2のLinuxディストロでsystemdとWSLgが使えるようになっています。

動作確認

KB5020030とWSLをインストールしたWindows10 22H2でコマンドプロンプト1でWSLのバージョンを確認します。この--versionはこれまでWindows10上のWSLでは実行できないオプションなので、まともな結果が表示された時点でKB5020030とWSLのインストールが正常に終了しています。

>wsl --version
WSL バージョン: 1.0.0.0
カーネル バージョン: 5.15.74.2
WSLg バージョン: 1.0.47
MSRDC バージョン: 1.2.3575
Direct3D バージョン: 1.606.4
DXCore バージョン: 10.0.25131.1002-220531-1700.rs-onecore-base2-hyp
Windowsバージョン: 10.0.19045.2311

systemd

systemdを有効にする前に、cronが動作しているか確認します。WSL2ディストロはUbuntu 22.04 LTSを使っています。

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

WSL2のディストロ上で以下の内容で/etc/wsl.confを作成します。

[boot]
systemd = true

ログインしているWSL2ディストロから抜けて、コマンドプロンプトからWSLを終了します。

>wsl --shutdown

再度WSL2ディストロのターミナルを開いてもう一度cronが動いているか確認します。

$ systemctl status cron.service
● cron.service - Regular background program processing daemon
     Loaded: loaded (/lib/systemd/system/cron.service; enabled; vendor preset: enabled)
     Active: active (running) since Sat 2022-11-19 15:54:40 JST; 36s ago
       Docs: man:cron(8)
   Main PID: 352 (cron)
      Tasks: 1 (limit: 9451)
     Memory: 436.0K
     CGroup: /system.slice/cron.service
             └─352 /usr/sbin/cron -f -P

Nov 19 15:54:40 DESKTOP-8KGOMCC systemd[1]: Started Regular background program processing daemon.
Nov 19 15:54:40 DESKTOP-8KGOMCC cron[352]: (CRON) INFO (pidfile fd = 3)
Nov 19 15:54:40 DESKTOP-8KGOMCC cron[352]: (CRON) INFO (Running @reboot jobs)

見慣れたsystemdですね。

sshd

systemdが普通に動くようになったので、WSL2ディストロが起動していることで実行が保証されるようになったことを活かしてsshdを動かすことにします。

# apt-get install ssh

パスワード認証を有効にします(公開鍵/秘密鍵の管理が面倒なので…)

# diff -u /etc/ssh/sshd_config{.org,}
@@ -54,7 +54,7 @@
 #IgnoreRhosts yes

 # To disable tunneled clear text passwords, change to no here!
-#PasswordAuthentication yes
+PasswordAuthentication yes
 #PermitEmptyPasswords no

 # Change to yes to enable challenge-response passwords (beware issues with

sshdを再起動して、接続確認します。

# systemctl restart sshd.service
$ ssh 0
The authenticity of host '0.0.0.0 (0.0.0.0)' can't be established.
ED25519 key fingerprint is SHA256:31IwpnBlOv/F7qq0QxB5ZGreuIC8ycpX22+8W5pOPC0.
This key is not known by any other names
Are you sure you want to continue connecting (yes/no/[fingerprint])? 

補足

この作業前からWSL2ディストロとしてUbuntu 22.04 LTSは使っていたのですが、なぜか遭遇したことのない事象が発生していました。最終的にディストロごと消してやり直したら再現しなくなりましたが備忘メモとして残します。

$ ssh 0
ssh: connect to host 0.0.0.0 port 22: Connection refused
# journalctl -xeu ssh.service

Nov 19 15:55:08 DESKTOP-8KGOMCC sshd[803]: sshd: no hostkeys available -- exiting.
$ sudo ssh-keygen -A
# systemctl restart sshd.service
$ ssh 0
The authenticity of host '0.0.0.0 (0.0.0.0)' can't be established.
ED25519 key fingerprint is SHA256:31IwpnBlOv/F7qq0QxB5ZGreuIC8ycpX22+8W5pOPC0.
This key is not known by any other names
Are you sure you want to continue connecting (yes/no/[fingerprint])? 

個人的な不便(wsltty)

WSLを使うターミナルとしてwslttyを使っていますが、執筆時点でこれまでできていたwslttyターミナルを実行するだけでWSLが使えるようになるようになっていません(起動したと思ったらすぐ閉じてしまう。) wsltty側で対応が行われるまでは最初にWindows TerminalからWSL2ディストロを実行しないとダメそうです。今までそんなことなかったんですが。

>wsl -l -v
  NAME            STATE           VERSION
* Ubuntu-18.04    Running         1
  Ubuntu-22.04    Stopped         2

>wslbridge2.exe -d Ubuntu-22.04
ERROR: GetVmId:271: CreateLxProcess: 指定されたファイルが見つかりません。

WSLgは日本語入力で躓いているので、そこを確認できたら別記事で取り上げます。

スポンサーリンク


  1. PowerShellは起動に時間がかかるので、どうしても必要なとき以外は今もコマンドプロンプトを使っています。 [return]

comments powered by Disqus