【WSL2】Ubuntu22.04にアップグレードしたあとにやったこと
Dockerがネットワークの初期化に失敗して起動しないためiptables-legacyを使用するように変更
$ sudo update-alternatives --config iptables
alternative iptables (/usr/sbin/iptables を提供) には 2 個の選択肢があります。
選択肢 パス 優先度 状態
------------------------------------------------------------
* 0 /usr/sbin/iptables-nft 20 自動モード
1 /usr/sbin/iptables-legacy 10 手動モード
2 /usr/sbin/iptables-nft 20 手動モード
現在の選択 [*] を保持するには <Enter>、さもなければ選択肢の番号のキーを押してください: 1
update-alternatives: /usr/sbin/iptables (iptables) を提供するためにマニュアルモードで /usr/sbin/iptables-legacy を使います
(2022/11/16 追記)
公式でsystemdがサポートされました。以下のスクラップに従って有効にすれば下記の手順は不要です。
systemdを使用するためにハックが必要だったが、それを行ってくれるスクリプトが標準で入ったのでsystemdを使えるようにしてみる
$ ps ax
PID TTY STAT TIME COMMAND
1 ? Sl 0:00 /init
7 ? Ss 0:00 /init
8 ? D 0:00 /init
9 pts/0 Ss 0:00 -bash
37 pts/0 R+ 0:00 ps ax
$ sudo /usr/libexec/wsl-systemd
$ ps ax
PID TTY STAT TIME COMMAND
1 ? Sl 0:00 /init
7 ? Ss 0:00 /init
8 ? S 0:00 /init
9 pts/0 Ss 0:00 -bash
46 ? S 0:00 /usr/bin/unshare --fork --mount-proc --pid --propagation unchanged -- s
47 ? Ss 0:00 /lib/systemd/systemd --unit=multi-user.target
88 ? S<s 0:00 /lib/systemd/systemd-journald
116 ? Ss 0:00 /lib/systemd/systemd-udevd
131 ? Ss 0:00 /lib/systemd/systemd-networkd
134 ? Ss 0:00 /usr/sbin/cron -f -P
136 ? Ss 0:00 @dbus-daemon --system --address=systemd: --nofork --nopidfile --systemd
140 ? Ss 0:00 /lib/systemd/systemd-logind
141 ? Ss 0:00 /usr/sbin/atd -f
246 ? Ss 0:00 /lib/systemd/systemd-resolved
284 ? Ssl 0:00 /usr/bin/containerd
287 tty1 Ss+ 0:00 /sbin/agetty -o -p -- \u --noclear --keep-baud console 115200,38400,960
295 ? Ss 0:00 /sbin/agetty -o -p -- \u --noclear tty1 linux
297 ? Ss 0:00 /lib/systemd/systemd-timedated
298 ? Ss 0:00 sshd: /usr/sbin/sshd -D [listener] 0 of 10-100 startups
320 ? Ssl 0:00 /usr/bin/dockerd -H fd:// --containerd=/run/containerd/containerd.sock
486 pts/0 R+ 0:00 ps ax
systemdを起動することはできたが、この状態だとPIDが1でないのでsystemctlコマンドなどが正常に動かない
/usr/libexec/nsloginを使用することでsystemdのPIDが1になる環境(?)に入ることができる
$ sudo systemctl status ssh.service
Failed to get properties: 通信端点が接続されていません
$ /usr/libexec/nslogin
$ sudo systemctl start ssh.service
$ sudo systemctl status ssh.service
● ssh.service - OpenBSD Secure Shell server
Loaded: loaded (/lib/systemd/system/ssh.service; enabled; vendor preset: enabled)
Active: active (running) since Wed 2022-05-11 08:29:00 JST; 5min ago
Docs: man:sshd(8)
man:sshd_config(5)
Process: 233 ExecStartPre=/usr/sbin/sshd -t (code=exited, status=0/SUCCESS)
Main PID: 252 (sshd)
Tasks: 1 (limit: 4700)
Memory: 5.1M
CGroup: /system.slice/ssh.service
└─252 "sshd: /usr/sbin/sshd -D [listener] 0 of 10-100 startups"
5月 11 08:29:00 XXXXXXXX systemd[1]: Starting OpenBSD Secure Shell server...
5月 11 08:29:00 XXXXXXXX sshd[252]: Server listening on 127.0.0.1 port 22.
5月 11 08:29:00 XXXXXXXX systemd[1]: Started OpenBSD Secure Shell server.
$ ps ax
PID TTY STAT TIME COMMAND
1 ? Ss 0:00 /lib/systemd/systemd --unit=multi-user.target
42 ? S<s 0:00 /lib/systemd/systemd-journald
70 ? Ss 0:00 /lib/systemd/systemd-udevd
85 ? Ss 0:00 /lib/systemd/systemd-networkd
88 ? Ss 0:00 /usr/sbin/cron -f -P
90 ? Ss 0:00 @dbus-daemon --system --address=systemd: --nofork --nopidfile --systemd
94 ? Ss 0:00 /lib/systemd/systemd-logind
95 ? Ss 0:00 /usr/sbin/atd -f
200 ? Ss 0:00 /lib/systemd/systemd-resolved
238 ? Ssl 0:00 /usr/bin/containerd
241 tty1 Ss+ 0:00 /sbin/agetty -o -p -- \u --noclear --keep-baud console 115200,38400,960
249 ? Ss 0:00 /sbin/agetty -o -p -- \u --noclear tty1 linux
252 ? Ss 0:00 sshd: /usr/sbin/sshd -D [listener] 0 of 10-100 startups
274 ? Ssl 0:00 /usr/bin/dockerd -H fd:// --containerd=/run/containerd/containerd.sock
473 pts/0 S 0:00 /bin/bash
517 pts/0 R+ 0:00 ps ax
↑の手順でsystemdを有効化することはできたが、都度コマンドを叩くのは面倒なので自動で行うように設定する
/etc/wsl.conf
のbootセクションにコマンドを登録することでsystemdが自動で起動するように設定する。
[boot]
command = "/usr/libexec/wsl-systemd"
シェルの方の設定は使っている端末エミュレータによって違うが、基本的にwsl.exe ~ -d Ubuntu /usr/libexec/nslogin /bin/bash
を設定すれば良い。
Alacrittyの場合、以下のような設定になる。
shell:
program: /Windows/System32/wsl.exe
args:
- '~'
- '-d'
- 'Ubuntu'
- '/usr/libexec/nslogin'
- '/bin/bash'
※/bin/bashの部分は自分の使っているシェルに適宜変える
bashの上でnsloginが起動している状態だが、これをしないと
wslコマンドの-eオプションでnsloginを実行するとSHELL環境変数が/usr/libexec/nsloginになるためSHELL環境変数を見るアプリケーション(vimなど)でエラーが発生することがある。
SHELL環境変数が定義されているときはそれを引き継いでくれるので、bashを先に起動してからbash上でnsloginを実行するように設定している。
→-eオプションがないときはbash -c
と同様の動作になるらしくbashのプロセスが残らないので[1]、この方法で実行してもbashのプロセスは1つだけ実行されます。