ぶていのログでぶログ

思い出したが吉日

WSLをUbuntu 24.04 (beta)にアップデートした

[!IMPORTANT] この記事を執筆時点での情報です。正式リリース後のLTSバージョンでは修正されているかもしれません。

Ubuntu 24.04(beta)が降ってきたので早速手元のWSL環境をアップデートした。

$ lsb_release -a
No LSB modules are available.
Distributor ID: Ubuntu
Description:    Ubuntu Noble Numbat (development branch)
Release:        24.04
Codename:       noble

$ wsl.exe --version
WSL バージョン: 2.2.2.0
カーネル バージョン: 5.15.150.1-2
WSLg バージョン: 1.0.61
MSRDC バージョン: 1.2.5105
Direct3D バージョン: 1.611.1-81528511
DXCore バージョン: 10.0.25131.1002-220531-1700.rs-onecore-base2-hyp
Windows バージョン: 10.0.22631.3447

systemctl --user statusがFailed to connect to bus: No such file or directory

毎回恒例のやつ。 これが起こるとユーザランドのserviceが起動しないので、そうすると私の場合はGNOME keyringがキックされない*1ので、毎回ssh鍵のパスワードを入力するハメになってかなりめんどくさい。。 そこで本腰を入れて調査した。 結果どうもsystemd-networkdがコケているのがわるいことがわかった 。

$ systemctl --failed
  UNIT                                 LOAD   ACTIVE SUB    DESCRIPTION
● tpm-udev.path                        loaded failed failed Handle dynamically added tpm devices
● systemd-networkd-wait-online.service loaded failed failed Wait for Network to be Configured
● systemd-remount-fs.service           loaded failed failed Remount Root and Kernel File Systems
● tpm-udev.service                     loaded failed failed Handle dynamically added tpm devices

Legend: 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.

4 loaded units listed.

WSLではsystemd-networkdはdisableでいい*2ので、disableにして再起動すると問題は解消される。

$ sudo systemctl disable systemd-networkd
Removed "/etc/systemd/system/sockets.target.wants/systemd-networkd.socket".
Removed "/etc/systemd/system/multi-user.target.wants/systemd-networkd.service".
Removed "/etc/systemd/system/network-online.target.wants/systemd-networkd-wait-online.service".
Disabling 'systemd-networkd.service', but its triggering units are still active:
systemd-networkd.socket
$ wsl.exe --shutdown

# 再接続後
$ systemctl --user status
● zephyranthes
    State: running
    Units: 171 loaded (incl. loaded aliases)
     Jobs: 0 queued
   Failed: 0 units
    Since: Mon 2024-04-15 22:24:18 JST; 8s ago
  systemd: 255.4-1ubuntu7
-- snip --

tpm-udev.path/service と systemd-remount-fs.serviceがこけている

Ubuntu24.04からの変更だとおもうが…failedになっているのが気になってしまうのでなんかする。 tpm-udev.path/serviceはどうも、TPMモジュールを使うためのサービスのようだ。

$ dpkg -s tpm-udev
Package: tpm-udev
Status: install ok installed
Priority: optional
Section: admin
Installed-Size: 28
Maintainer: Ubuntu Developers <ubuntu-devel-discuss@lists.ubuntu.com>
Architecture: all
Multi-Arch: foreign
Version: 0.6ubuntu1
Depends: adduser, udev
Description: udev rules for TPM modules
 This package provides udev rules for the TPM modules. Both TPM1 or TPM2 need
 this package to be installed to provide proper permissions of the TPM.
Original-Maintainer: Ying-Chun Liu (PaulLiu) <paulliu@debian.org>

TPMモジュールはWIndows側では利用するだろうが、WSLでは利用しない(とおもう)のでパッケージを削除してしまってよいだろう。 もし気になるなら tpm-udev.path をdisableにすればよい*3

systemd-remount-fs.serviceはエラーログをみると原因がわかる。

❯ sudo journalctl -u systemd-remount-fs.service | tail
Apr 15 22:35:58 zephyranthes systemd-remount-fs[78]: mount: /: can't find LABEL=cloudimg-rootfs.
Apr 15 22:35:58 zephyranthes systemd-remount-fs[70]: /usr/bin/mount for / exited with exit status 1.

fstabを見るとcloud-imageの一時的な領域をremountするような定義になっているっぽい。 これがなぜ必要なのか理解していないが、少なくともWSLでは不要*4なのでこの定義を削除してよいとおもう。

$ cat /etc/fstab
LABEL=cloudimg-rootfs   /        ext4   discard,errors=remount-ro       0 1

これで、failedしたUnitはなくなるはず

$ systemctl --failed
  UNIT LOAD ACTIVE SUB DESCRIPTION

0 loaded units listed.

Waylandにつながらない

$ wl-paste
Failed to connect to a Wayland server: No such file or directory
Note: WAYLAND_DISPLAY is set to wayland-0
Note: XDG_RUNTIME_DIR is set to /run/user/1000/
Please check whether /run/user/1000//wayland-0 socket exists and is accessible.

はいぃ。。。 どうも /run/user/1000/wayland-0 がなくなっているようだ。

$ ls -lah /run/user/1000/wayland-0
lsd: /run/user/1000/wayland-0: No such file or directory (os error 2).

前に記事を書いたときは一度lnしてしまえば解決していた。 しかし、24.04(beta)からは起動ごとにクリアされるっぽく、毎回lnを実行する必要がありそうだ。 さすがに手動で実行するのはめんどくさいので↓のようなUnitファイルを作って解決することにした。 なお雛形はChatGPTに作ってもらった。

$ vim ~/.config/systemd/user/create-link-wayland.service
[Unit]
Description=Create symlink for Wayland socket at startup if not exists

[Service]
Type=oneshot
ExecStart=/bin/ln -s /mnt/wslg/runtime-dir/wayland-0 /run/user/1000/wayland-0
ExecStart=/bin/ln -s /mnt/wslg/runtime-dir/wayland-0.lock /run/user/1000/wayland-0.lock
RemainAfterExit=yes

[Install]
WantedBy=default.target

ファイルを作ったら有効化すれば次回からこのシンボリックリンクが作成されるはず。

$ systemctl --user daemon-reload

$ systemctl --user enable create-link-wayland
Created symlink /home/buty4649/.config/systemd/user/default.target.wants/create-link-wayland.service → /home/buty4649/.config/systemd/user/create-link-wayland.service.

$ systemctl --user start create-link-wayland

$ ls -1 /run/user/1000/wayland-0*
/run/user/1000/wayland-0 ⇒ /mnt/wslg/runtime-dir/wayland-0
/run/user/1000/wayland-0.lock ⇒ /mnt/wslg/runtime-dir/wayland-0.lock

おまけ: xz-utils

話題となったxz-utils。24.04(beta)では 5.6.1+really5.4.5-1 がはいっていた。 5.6.1じゃん!!!っとおもったが、Changelogをみるとどうも5.4.5-0.2のバックポートバージョンだった。安心

$ apt changelog xz-utils
xz-utils (5.6.1+really5.4.5-1) unstable; urgency=critical

  * Non-maintainer upload by the Security Team.
  * Revert back to the 5.4.5-0.2 version

 -- Salvatore Bonaccorso <carnil@debian.org>  Thu, 28 Mar 2024 15:59:38 +0100
-- snip --

*1:昔ブログをかいたよなぁっとおもったら書いてなかったので書く

*2:https://zenn.dev/kenchan/articles/5f3d53182f0a75

*3:tpm-udev.serviceはtpm-udev.pathに依存しているのでtmp-udev.pathをdisableにすると連動して無効化される

*4:ログとかをみるとWSLでも、WSLで動いていると認識したうえでcloud-initが動いていてちょっと驚いた