Ubuntu (WSL)のWebサーバをWindowsから使う場合、Ubuntu (WSL)が起動している状態では常にWebサーバを起動しておきたいことが多い。WSLで動作するUbuntuはデフォルトではこうしたサービスが自動的には起動してこないので、手動で起動するか、そのための仕組みを用意する必要がある。そこで今回は、この辺りの設定方法を説明しよう。→連載「WindowsでUbuntuをはじめる」のこれまでの回はこちらを参照。
Ubuntuを起動
Ubuntuを起動する。スタートメニューから「Ubuntu on Windows」を選択すればよい。
「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コマンドを使うだけで特別なことをする必要もない。