WSL2を使う際、以前はいちいちsudo service docker start
などと打たなければならず不便だったが、気づけばWSLのアップデートにより、いくつか設定を追加すればこの辺の問題が解消されることに気づいたのでメモ。
前提条件
wsl-configの公式ドキュメント - systemdのサポートを見ると、
バージョン0.67.6以降のWSL2でsystemdを有効に出来ることが分かる。
PowerShellなどで
wsl --version
などと打って上記の条件を満たすことを確認する。
ちなみに今回検証を行った環境はWindows11で、
# wsl --version
WSL バージョン: 1.1.3.0
カーネル バージョン: 5.15.90.1
WSLg バージョン: 1.0.49
MSRDC バージョン: 1.2.3770
Direct3D バージョン: 1.608.2-61064218
DXCore バージョン: 10.0.25131.1002-220531-1700.rs-onecore-base2-hyp
Windowsバージョン: 10.0.22621.1413
といった感じ。また、使ったディストリビューションはストアから入手したUbuntu22.04LTSであり、
サービスを起動する対象してDocker(Community Edition)をdocker-docsに記載の手順に従ってインストールしている。
設定の実施
先程のwsl.confに関するドキュメントに記載している通りにすればOK.
対象のWSL2ディストリビューションに入り、例えばsudo vim /etc/wsl.conf
などとしてwsl.conf
に以下のような内容を追記・設定する。(※無ければ新規作成する)
[boot]
systemd=true
次に、systemctl
コマンドで使いたいサービスをenable
にしておく。
今回の例ではdockerを自動起動するようにしたいので、
# bashなど
sudo systemctl enable docker
などとする。
今回はdockerの自動起動を例にしているが、例えばQiita - systemctl コマンド などを参考にし、他のサービスの設定を同様に行うことが出来る。
最後にsystemdのサポートを参考に、以下のいずれかを実行する:
# 全てのdistroのシャットダウン
wsl --shutdown
# 対象のものだけシャットダウン
wsl -t <対象のディストリビューション名>
これで次回起動時からsystemctl enable
したサービスが自動起動する。
実際に設定を行ったディストリビューションを再起動し、
# bashなど
# dockerサービスの例
sudo systemctl status docker
# ● docker.service - Docker Application Container Engine
# Loaded: loaded (/lib/systemd/system/docker.service; enabled; vendor preset: enabled)
# Active: active (running) since Sat 2023-03-25 20:29:51 JST; 11min ago
# TriggeredBy: ● docker.socket
# Docs: https://docs.docker.com
# Main PID: 585 (dockerd)
# Tasks: 14
# Memory: 148.4M
# CGroup: /system.slice/docker.service
# └─585 /usr/bin/dockerd -H fd:// --containerd=/run/containerd/containerd.sock
などのように、自分でsudo systemctl start docker
とかsudo service docker start
とかをやらなくても勝手に立ち上がっていることが確認できる。
参考
一応他のやり方もあるので紹介。
wsl-configの設定のドキュメントを読み進めると、ブート設定という項目があり、WSLの開始時に実行するコマンドを指定できるとのこと。
ドンピシャな例としてdockerをWSL起動時に一緒に立ち上げる例が上記ドキュメント内で示されている。
# Set a command to run when a new WSL instance launches. This example starts the Docker container service.
[boot]
command = service docker start
ただし、ドキュメントにも記載の通り、Windows11以降かWindows Server2022以降でないと使用できないとのこと。
個人的にはsystemctlが使える場合はそちらでやる方がWSLに依らない一般的な手法を使えるため良いような気がしたが、
これもどこかで使い道があるかもしれないのでメモしておく。