systemd を有効化する - systemd
かつて WSL2 は独自 init を使っており systemd が動かなかったが、2022 年以降の WSL でネイティブサポートされた。`/etc/wsl.conf` に `systemd=true` を書き、`wsl --shutdown` で再起動するだけで有効になる。
概念図
構文
bash
sudo tee /etc/wsl.conf <<< "[boot]\nsystemd=true"
wsl --shutdown実例
systemd 設定の現状を確認
bash
cat /etc/wsl.conf稼働中のサービスを一覧
bash
systemctl list-units --type=service --state=runningDocker を systemd サービスとして常駐させる
bash
sudo systemctl enable --now docker概要
以前の WSL2 では Microsoft 製の軽量 init が PID 1 として動作し、systemd は起動できませんでした。
その制約のため、systemctl を前提にしたソフト(Snap、Kubernetes のノード設定、Docker の公式インストーラ、一部の開発ツール)が WSL2 ではうまく動かないという悩みがありました。
2022 年に Microsoft が WSL の更新として systemd ネイティブサポートを追加し、現在は 1 行の設定で有効化できます。
systemd が PID 1 になると、service の有効化、timer、logind、cgroup 管理などがすべて Linux サーバーと同じように使えるようになり、デスクトップ OS と同水準の環境が Windows 上に手に入ります。
典型的な用途
systemctl enable dockerで Docker デーモンを常駐させる(Docker Desktop を使わない構成)- Snap パッケージを使いたい(
snapd.serviceが systemd 必須) - Kubernetes ローカルノード(kubeadm 構築)で systemd 前提の設定を通す
- MySQL / PostgreSQL / Redis を
systemctl startで管理する systemd-timesyncd/chronyで時刻同期を恒常化する(時刻ズレ対策)
コマンド例
# WSL2 内で設定を追加
sudo tee /etc/wsl.conf > /dev/null <<EOF
[boot]
systemd=true
EOF
# 一度シャットダウンしてから再起動
exit
wsl --shutdown
wsl -d Ubuntu-22.04
# PID 1 の確認
ps -p 1 -o comm=
# systemd
# サービスの確認
systemctl list-units --type=service --state=running
sudo systemctl enable --now ssh
sudo systemctl status ssh
# ログ
journalctl -u ssh --since '10 minutes ago'
ベストプラクティス
- 新規 WSL2 環境は最初から
systemd=trueにしておく。後から有効化すると既存サービスの挙動が変わって混乱する wsl --updateで WSL 本体を最新に保ち、systemd 統合の改善を取り込む- サービスは
--now付きでsystemctl enable --nowする。次回起動でも上がってくるかを確認する - Docker を使うなら Docker Desktop を外し、
apt install docker-ce+systemctl enable dockerの構成にするとライセンス問題を回避できる - 時刻同期は
systemd-timesyncdを使い、時刻ズレ対策ページの設定とセットで運用する
注意点
- 古い WSL バージョン(2022 年以前)では systemd 機能自体が存在しない。
wsl --versionで確認してから有効化する - 有効化後も PID 1 は systemd だが、WSL ならではの制約(ログインセッションの扱い、一部のデバイス連携など)は残る
systemctl --userは WSL2 で完全には動かない場合があり、GUI アプリ向けのセッション管理が限定的- systemd を有効化するとメモリ常駐量が増える。
.wslconfigで VM のメモリ上限を絞っている場合は見直す - Windows 起動直後のログインで WSL2 の systemd が昇格する前に
wslを叩くと、一部サービスがまだ起動していないことがある
関連トピック
WSL2- Windows Subsystem for Linux の第 2 世代。Hyper-V 技術を基盤にした軽量 VM 上で本物の Linux カーネルを動かす方式で、WSL1 のエミュレーションとは根本的に別物。Docker Desktop の標準バックエンドでもある。 Docker Desktop- Docker Desktop for Windows は WSL2 をバックエンドとしてコンテナを動かす構成。`docker-desktop` 専用ディストリに dockerd を常駐させ、ユーザーのディストリからは統合機能で透過的に使える。 hwclock- Windows のスリープや休止から復帰した後に、WSL2 内の時計が数秒〜数分遅れる現象。TLS 証明書検証や JWT の有効期限判定が失敗する原因になる。 