Ubuntu (WSL)のWebサーバをWindowsから使う場合、Ubuntu (WSL)が起動している状態では常にWebサーバを起動しておきたいことが多い。WSLで動作するUbuntuはデフォルトではこうしたサービスが自動的には起動してこないので、手動で起動するか、そのための仕組みを用意する必要がある。そこで今回は、この辺りの設定方法を説明しよう。→連載「WindowsでUbuntuをはじめる」のこれまでの回はこちらを参照

Ubuntuを起動

Ubuntuを起動する。スタートメニューから「Ubuntu on Windows」を選択すればよい。

  • スタートメニューから「Ubuntu」を起動

    スタートメニューから「Ubuntu」を起動

  • Ubuntu / Windows Terminal

    Ubuntu / Windows Terminal

「Ubuntu on Windows」を選択すると、上のようなターミナルアプリケーションが起動してくる。ここでUbuntuのコマンドを実行する。

サービスを管理するsystemd

Ubuntuでは、複数のサービス(デーモン)を実行して利用することが多い。サービスの起動、停止、状態確認、有効化、無効化といった操作は設定ファイルで行うこともあれば、制御用のコマンドを使うこともある。こうした操作の方法はいくつかパターンがあったが、最近ではsystemdと呼ばれるサービスマネージャで行うケースが増えている。

Ubuntu (WSL)では、2022年にsystemdが使用できるようになった。systemdを介することで、サービスの制御を田のLinuxディストリビューションと同じように行える。具体的には、systemctlコマンドを使って動作を行う。

systemctlコマンドの代表的な使い方は次のとおり。

操作 コマンドサービスの状態を確認する
状態確認 sudo systemctl status サービス名
起動 sudo systemctl start サービス名
停止 sudo systemctl stop サービス名
再起動 sudo systemctl restart サービス名
有効化 sudo systemctl enable サービス名
無効化 sudo systemctl disable サービス名

systemdは、以前のUbuntu (WSL)では使うことができなかった。本稿執筆時点でも、デフォルトでは無効になっている。この機能を利用するには設定ファイルを書く必要がある。

systemdを使えるようにする

Ubuntu (WSL)を起動すると、最初は次のようなプロセス状態になっている。systemd関連のプロセスは動作していないし、前回インストールしたNginxも動作していない。

Ubuntu (WSL)起動直後のps auxwwの実行結果

daichi@VAIO-SX14:~$ ps auxww
USER       PID %CPU %MEM    VSZ   RSS TTY      STAT START   TIME COMMAND
root         1  0.0  0.0   2324  1508 ?        Sl   11:10   0:00 /init
root         4  0.0  0.0   2324     4 ?        Sl   11:10   0:00 plan9 --control-socket 5 --log-level 4 --server-fd 6 --pipe-fd 8 --log-truncate
root         7  0.0  0.0   2328   112 ?        Ss   11:10   0:00 /init
root         8  0.0  0.0   2344   116 ?        D    11:10   0:00 /init
daichi       9  0.7  0.0  10044  4924 pts/0    Ss   11:10   0:00 -bash
daichi      17  0.0  0.0  10620  3200 pts/0    R+   11:10   0:00 ps auxww
daichi@VAIO-SX14:~$

ここで、rootユーザー権限で「/etc/wsl.conf」というファイルを作成し、そこに次の設定内容を書き込む。

/etc/wsl.confに追加する内容

[boot]
systemd=true

この状態で、一度Ubuntuを抜けて「wsl --shutdown」でUbuntuを終了する。「wsl」で再度Ubuntu (WSL)を起動して同じように「ps axuww」とコマンドを実行すると、今度は次のようになる。

Ubuntu (WSL)起動直後のps auxwwの実行結果

daichi@VAIO-SX14:~$ ps auxww
USER         PID %CPU %MEM    VSZ   RSS TTY      STAT START   TIME COMMAND
root           1  4.1  0.0 169868 10988 ?        Ss   11:12   0:00 /sbin/init
root           2  0.0  0.0   2324  1192 ?        Sl   11:12   0:00 /init
root           5  0.0  0.0   2324     4 ?        Sl   11:12   0:00 plan9 --control-socket 6 --log-level 4 --server-fd 7 --pipe-fd 9 --log-truncate
root          50  1.1  0.0  43952 15560 ?        S<s  11:12   0:00 /lib/systemd/systemd-journald
root          73  0.6  0.0  22320  5616 ?        Ss   11:12   0:00 /lib/systemd/systemd-udevd
systemd+      87  0.3  0.0  19076  7540 ?        Ss   11:12   0:00 /lib/systemd/systemd-networkd
root         242  2.8  0.0   3772  1852 ?        Ss   11:12   0:00 snapfuse /var/lib/snapd/snaps/core18_1705.snap /snap/core18/1705 -o ro,nodev,allow_other,suid
root         243  0.1  0.0   3648  1624 ?        Ss   11:12   0:00 snapfuse /var/lib/snapd/snaps/snapd_7264.snap /snap/snapd/7264 -o ro,nodev,allow_other,suid
root         244  0.0  0.0   3820  1468 ?        Ss   11:12   0:00 snapfuse /var/lib/snapd/snaps/lxd_14804.snap /snap/lxd/14804 -o ro,nodev,allow_other,suid
systemd+     251  0.6  0.0  24476 11808 ?        Ss   11:12   0:00 /lib/systemd/systemd-resolved
root         254  0.1  0.0 237324  6880 ?        Ssl  11:12   0:00 /usr/lib/accountsservice/accounts-daemon
message+     255  0.5  0.0   7572  4380 ?        Ss   11:12   0:00 /usr/bin/dbus-daemon --system --address=systemd: --nofork --nopidfile --systemd-activation --syslog-only
root         258  1.0  0.1  29620 18168 ?        Ss   11:12   0:00 /usr/bin/python3 /usr/bin/networkd-dispatcher --run-startup-triggers
root         261  0.0  0.0 232724  6328 ?        Ssl  11:12   0:00 /usr/lib/policykit-1/polkitd --no-debug
syslog       262  0.1  0.0 224356  4464 ?        Ssl  11:12   0:00 /usr/sbin/rsyslogd -n -iNONE
root         263  3.1  0.2 1392020 38452 ?       Ssl  11:12   0:00 /usr/lib/snapd/snapd
root         266  0.5  0.0  17364  7808 ?        Ss   11:12   0:00 /lib/systemd/systemd-logind
root         267  0.5  0.0 393292 11484 ?        Ssl  11:12   0:00 /usr/lib/udisks2/udisksd
root         286  0.3  0.0 315088 10816 ?        Ssl  11:12   0:00 /usr/sbin/ModemManager
root         304  0.0  0.0   8548  2736 ?        Ss   11:12   0:00 /usr/sbin/cron -f
root         315  1.0  0.1 108132 20304 ?        Ssl  11:12   0:00 /usr/bin/python3 /usr/share/unattended-upgrades/unattended-upgrade-shutdown --wait-for-signal
daemon       322  0.0  0.0   3804  2240 ?        Ss   11:12   0:00 /usr/sbin/atd -f
root         327  0.0  0.0   7360  2244 hvc0     Ss+  11:12   0:00 /sbin/agetty -o -p -- \u --noclear --keep-baud console 115200,38400,9600 vt220
root         338  0.0  0.0   5836  1804 tty1     Ss+  11:12   0:00 /sbin/agetty -o -p -- \u --noclear tty1 linux
root         345  0.0  0.0  12188  6880 ?        Ss   11:12   0:00 sshd: /usr/sbin/sshd -D [listener] 0 of 10-100 startups
root         387  0.4  0.0  16928  6152 ?        Ss   11:12   0:00 /lib/systemd/systemd-timedated
root         433  0.0  0.0   2328   108 ?        Ss   11:12   0:00 /init
root         434  0.0  0.0   2344   112 ?        R    11:12   0:00 /init
daichi       435  0.2  0.0  10044  5040 pts/0    Ss   11:12   0:00 -bash
root         436  0.0  0.0   5700  4236 pts/1    Ss   11:12   0:00 /bin/login -f
daichi       562  0.2  0.0  19076  9524 ?        Ss   11:12   0:00 /lib/systemd/systemd --user
daichi       563  0.0  0.0 171224  3284 ?        S    11:12   0:00 (sd-pam)
daichi       568  0.2  0.0  10024  4892 pts/1    S+   11:12   0:00 -bash
daichi       575  0.0  0.0  10620  3252 pts/0    R+   11:12   0:00 ps auxww
daichi@VAIO-SX14:~$

/etc/wsl.confにsystemdを使うという設定を追加したため、起動してきたUbuntuがsystemdを起動し、systemdがシステムの状態に従って関連するサービスの起動を行ったことがわかる。

次のように、ステータスを表示させると状態がどうなっているかの概要を知ることができる。

systemctl status

daichi@VAIO-SX14:~$ systemctl status
● VAIO-SX14
    State: degraded
     Jobs: 0 queued
   Failed: 2 units
    Since: Mon 2023-04-24 11:12:18 JST; 29s ago
   CGroup: /
           ├─user.slice
           │ └─user-1000.slice
           │   ├─user@1000.service
           │   │ └─init.scope
           │   │   ├─562 /lib/systemd/systemd --user
           │   │   └─563 (sd-pam)
           │   └─session-c1.scope
           │     ├─436 /bin/login -f
           │     └─568 -bash
           ├─init.scope
           │ └─1 /sbin/init
           └─system.slice
             ├─systemd-networkd.service
             │ └─87 /lib/systemd/systemd-networkd
             ├─systemd-udevd.service
             │ └─73 /lib/systemd/systemd-udevd
             ├─cron.service
             │ └─304 /usr/sbin/cron -f
             ├─polkit.service
             │ └─261 /usr/lib/policykit-1/polkitd --no-debug
             ├─systemd-timedated.service
             │ └─387 /lib/systemd/systemd-timedated
             ├─networkd-dispatcher.service
             │ └─258 /usr/bin/python3 /usr/bin/networkd-dispatcher --run-startup-triggers
             ├─snap-core18-1705.mount
             │ └─242 snapfuse /var/lib/snapd/snaps/core18_1705.snap /snap/core18/1705 -o ro,nodev,allow_other,suid
             ├─accounts-daemon.service
             │ └─254 /usr/lib/accountsservice/accounts-daemon
             ├─ModemManager.service
             │ └─286 /usr/sbin/ModemManager
             ├─snap-lxd-14804.mount
             │ └─244 snapfuse /var/lib/snapd/snaps/lxd_14804.snap /snap/lxd/14804 -o ro,nodev,allow_other,suid
             ├─systemd-journald.service
             │ └─50 /lib/systemd/systemd-journald
             ├─atd.service
             │ └─322 /usr/sbin/atd -f
             ├─unattended-upgrades.service
             │ └─315 /usr/bin/python3 /usr/share/unattended-upgrades/unattended-upgrade-shutdown --wait-for-signal
             ├─ssh.service
             │ └─345 sshd: /usr/sbin/sshd -D [listener] 0 of 10-100 startups
             ├─snapd.service
             │ └─263 /usr/lib/snapd/snapd
             ├─snap-snapd-7264.mount
             │ └─243 snapfuse /var/lib/snapd/snaps/snapd_7264.snap /snap/snapd/7264 -o ro,nodev,allow_other,suid
             ├─rsyslog.service
             │ └─262 /usr/sbin/rsyslogd -n -iNONE
             ├─console-getty.service
             │ └─327 /sbin/agetty -o -p -- \u --noclear --keep-baud console 115200,38400,9600 vt220
             ├─systemd-resolved.service
             │ └─251 /lib/systemd/systemd-resolved
             ├─udisks2.service
             │ └─267 /usr/lib/udisks2/udisksd
             ├─dbus.service
             │ └─255 /usr/bin/dbus-daemon --system --address=systemd: --nofork --nopidfile --systemd-activation --syslog-only
             ├─system-getty.slice
             │ └─getty@tty1.service
             │   └─338 /sbin/agetty -o -p -- \u --noclear tty1 linux
             └─systemd-logind.service
               └─266 /lib/systemd/systemd-logind
daichi@VAIO-SX14:~$

Ubuntu (WSL)を活用しようとすると、Ubuntuのサービスが自動的に起動して動作する状況を作る必要がある。この辺りはしばらくスタンダードな方法がなかったり、しばらくすると動作の状況が変わったりする状態だった。

systemdが使えるようになるまでは他の方法で似たようなことを実現していたが、systemdが使えるようになったので、今後は基本的にこの機能を有効化して使う方法が標準になっていくとみられる。/etc/wsl.confを作成して設定を追加するだけで、それ以降の操作はsystemctlコマンドを使うだけで特別なことをする必要もない。