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のバージョンを確認する。
wsl --version
このコマンドが動かない場合、旧式の「インボックス版」WSLを使っている。wsl --updateでStore版に更新が必要だ。
| 要件 | 条件 |
|---|---|
| WSLバージョン | 0.67.6以上(Store版) |
| Windows 11 | Store版WSLをインストール済みであればOK |
| Windows 10 | 21H1以降 + KB5020030 |
| WSLバージョン | WSL 2(WSL 1では動作しない) |
ディストリビューションがWSL 2で動作しているかは以下で確認できる。
wsl -l -v
VERSION列が2であれば問題ない。
有効化の手順(3ステップ)¶
ステップ1: wsl.confを編集¶
sudo nano /etc/wsl.conf
以下を追記する。
[boot]
systemd=true
既存の設定がある場合は、[boot]セクションを追加する形で記述する。
ステップ2: WSLを再起動¶
PowerShellからWSLを完全にシャットダウンする。
wsl.exe --shutdown
その後、WSLを再度起動する。wsl.confの変更が反映されるには、シャットダウン後約8秒の待機が必要だ。
ステップ3: 動作確認¶
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実行時にエラーが出る場合、以下を順に確認する。
- wsl.confの記述ミス:
systemd=trueのスペル、[boot]セクション名を確認 - 再起動忘れ:
wsl --shutdownを実行したか(ターミナルを閉じただけでは不十分) - WSL 1で動かしている:
wsl -l -vでVERSIONが2か確認 - 旧式WSL:
wsl --versionが動くか確認。動かなければwsl --update
まとめ¶
wsl.confに[boot] systemd=trueを追加して再起動 — これだけでsystemdが使える- Docker・nginx等のサービス管理が
systemctlで完結する - 起動遅延は
systemd-analyze blameで原因特定 →maskで対処
systemdが使えると、WSL2はほぼネイティブLinuxと同等の開発環境になる。サーバー構成をWSL2でそのまま再現できるため、開発と本番の差分を最小化できる点が最大のメリットだ。