Dock Stay
systemd を有効化する - systemd の使い方・オプション・サンプル

systemd を有効化する - systemd

かつて WSL2 は独自 init を使っており systemd が動かなかったが、2022 年以降の WSL でネイティブサポートされた。`/etc/wsl.conf` に `systemd=true` を書き、`wsl --shutdown` で再起動するだけで有効になる。

概念図

systemd diagram

構文

bash
sudo tee /etc/wsl.conf <<< "[boot]\nsystemd=true"
wsl --shutdown

実例

systemd 設定の現状を確認

bash
cat /etc/wsl.conf

稼働中のサービスを一覧

bash
systemctl list-units --type=service --state=running

Docker を 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 を叩くと、一部サービスがまだ起動していないことがある

関連トピック