コンテンツにスキップ

WSL2でsystemdを有効化する方法 — 設定から活用・トラブル対処まで

対象: WSL2でsystemctlを使いたい開発者(Linux基本操作ができる方)

この記事のポイント

  • 設定は2行だけ/etc/wsl.conf[boot]セクションを追加して再起動
  • Docker・サービス管理が可能にsystemctl enableでサービス自動起動を設定できる
  • 起動遅延は対処可能 不要サービスのmaskで高速化できる

「System has not been booted with systemd」の正体

WSL2でsystemctl statusを実行すると、こんなエラーが出る。

System has not been booted with systemd as init system (PID 1).
Can't operate.
Failed to connect to bus: Host is down

WSL2はデフォルトでsystemdが無効だからだ。WSL独自のinitプロセスがPID 1として起動するため、systemdを前提とするコマンドがすべて失敗する。

この問題はwsl.confの設定1つで解決する。以前はサードパーティツール(genie, Distrod等)が必要だったが、2022年9月のWSL 0.67.6以降、公式にサポートされた。

前提条件の確認

設定の前に、まずWSLのバージョンを確認する。

PowerShellで実行
wsl --version

このコマンドが動かない場合、旧式の「インボックス版」WSLを使っている。wsl --updateでStore版に更新が必要だ。

要件条件
WSLバージョン0.67.6以上(Store版)
Windows 11Store版WSLをインストール済みであればOK
Windows 1021H1以降 + KB5020030
WSLバージョンWSL 2(WSL 1では動作しない)

ディストリビューションがWSL 2で動作しているかは以下で確認できる。

PowerShellで実行
wsl -l -v

VERSION列が2であれば問題ない。

有効化の手順(3ステップ)

ステップ1: wsl.confを編集

WSL内で実行
sudo nano /etc/wsl.conf

以下を追記する。

/etc/wsl.conf
[boot]
systemd=true

既存の設定がある場合は、[boot]セクションを追加する形で記述する。

ステップ2: WSLを再起動

PowerShellからWSLを完全にシャットダウンする。

PowerShellで実行
wsl.exe --shutdown

その後、WSLを再度起動する。wsl.confの変更が反映されるには、シャットダウン後約8秒の待機が必要だ。

ステップ3: 動作確認

WSL内で実行
systemctl status

State: runningと表示されれば成功だ。サービス一覧も確認してみよう。

systemctl list-unit-files --type=service | head -20

Ubuntu 23.04以降はデフォルトで有効

wsl --installで最新のUbuntuをインストールした場合、systemdはデフォルトで有効になっている。Debian・Kali等の他ディストリビューションでは手動設定が必要。

有効化後にできること

systemdが動くと、Linux環境としての実用性が大きく上がる。

Dockerをsystemctlで管理

Docker Desktopなしで、WSL2内のDockerエンジンを直接管理できる。

sudo systemctl enable docker.service
sudo systemctl start docker
docker run hello-world

サービスの自動起動設定

WebサーバーやデータベースをWSL起動時に自動で立ち上げられる。

sudo systemctl enable nginx
sudo systemctl enable postgresql

その他の用途

  • snap: snapdデーモンがsystemdに依存するため、snap経由のパッケージインストールが可能に
  • MicroK8s: WSL2上で軽量Kubernetesを実行
  • カスタムサービス: 自作のデーモンをUnit fileで管理

トラブルシューティング

起動が遅くなった

最もよくある問題だ。systemd有効化後、WSLの起動に数十秒かかることがある。

原因: systemd-networkd-wait-online.service等がタイムアウトを待っている。

# 遅延の原因を特定
systemd-analyze blame | head -10

# 不要なサービスをmask(無効化より強力)
sudo systemctl mask systemd-networkd-wait-online.service
sudo systemctl mask multipathd.socket

maskしたサービスはwsl --shutdown後の再起動で反映される。

まだエラーが出る場合

systemctl実行時にエラーが出る場合、以下を順に確認する。

  1. wsl.confの記述ミス: systemd=trueのスペル、[boot]セクション名を確認
  2. 再起動忘れ: wsl --shutdownを実行したか(ターミナルを閉じただけでは不十分)
  3. WSL 1で動かしている: wsl -l -vでVERSIONが2か確認
  4. 旧式WSL: wsl --versionが動くか確認。動かなければwsl --update

まとめ

  • wsl.conf[boot] systemd=trueを追加して再起動 — これだけでsystemdが使える
  • Docker・nginx等のサービス管理がsystemctlで完結する
  • 起動遅延はsystemd-analyze blameで原因特定 → maskで対処

systemdが使えると、WSL2はほぼネイティブLinuxと同等の開発環境になる。サーバー構成をWSL2でそのまま再現できるため、開発と本番の差分を最小化できる点が最大のメリットだ。

関連記事