Open4

【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 を使います

https://qiita.com/tkc_tsuchiya/items/f7f4d502d8e2728f69c5

(2022/11/16 追記)
公式でsystemdがサポートされました。以下のスクラップに従って有効にすれば下記の手順は不要です。


systemdを使用するためにハックが必要だったが、それを行ってくれるスクリプトが標準で入ったのでsystemdを使えるようにしてみる
https://qiita.com/shigeokamoto/items/ca2211567771cf40a90d

$ 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"

 511 08:29:00 XXXXXXXX systemd[1]: Starting OpenBSD Secure Shell server...
 511 08:29:00 XXXXXXXX sshd[252]: Server listening on 127.0.0.1 port 22.
 511 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が自動で起動するように設定する。
https://docs.microsoft.com/ja-jp/windows/wsl/wsl-config#boot-settings

/etc/wsl.conf
[boot]
command = "/usr/libexec/wsl-systemd"

シェルの方の設定は使っている端末エミュレータによって違うが、基本的にwsl.exe ~ -d Ubuntu /usr/libexec/nslogin /bin/bashを設定すれば良い。
Alacrittyの場合、以下のような設定になる。

alacritty.yml
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つだけ実行されます。

脚注
  1. https://genzouw.com/entry/2021/01/08/202800/2109/ ↩︎

作成者以外のコメントは許可されていません