快速修复
# WSL 内:启用 systemd
echo -e "[boot]\nsystemd=true" >> /etc/wsl.conf
# Windows 侧:重启发行版(必须,否则不生效)
wsl --terminate <发行版名>
wsl -d <发行版名>
# 验证
ps -p 1 -o comm= # 必须输出 systemd
systemctl is-system-running
你会遇到什么
在 WSL 里 systemctl start docker / systemctl status xxx 报 System has not been booted with systemd as init system (PID 1). Can't operate.(或 Failed to connect to bus)。
照着网上「service 起服务」教程在 WSL 里全失灵——WSL2 默认 PID1 不是 systemd,[boot] systemd=true 没配就是这种状态。
本文路径:快速修复(30 秒一段命令)→ 一步步排查(可跳读)→ 原理与变体(症状/原因/证据)。赶时间直接跳到「快速修复」。
为什么会这样
WSL2 的轻量虚拟机里,PID1 默认是微软自己的 init(不是 systemd)。systemctl 必须 systemd 作为 PID1 才能操作服务总线,否则直接报上面那句。2022 年 9 月起 WSL 支持在 /etc/wsl.conf 加 [boot] systemd=true 让 systemd 成为 PID1。
systemd 的运作前提是「它是 PID1」:它要接管 cgroup、挂载、socket 与 service 状态。WSL 的默认 init 只做最基本的启动,不提供 service 语义,所以 systemctl/journalctl 全部失灵。
启用路径 = wsl.conf 的 [boot] 段 + 重启发行版(wsl --terminate <发行版> 或 wsl --shutdown)——wsl.conf 只在启动时读取,改完不重启等于没改,这是本坑第二高频原因。
确定性推论:报 System has not been booted with systemd = wsl.conf 缺 [boot] systemd=true(或没重启);ps -p 1 -o comm= 输出 systemd 才算真的生效。
一步步来
1. 确认 PID1 是谁 — 必做
ps -p 1 -o comm=
输出 systemd = 已启用,报错另有原因;输出 init = 没启用。
2. 写 wsl.conf — 必做
echo -e "[boot]\nsystemd=true" >> /etc/wsl.conf
已有 [boot] 段就只加 systemd=true 行。
3. 重启发行版 — 必做
# Windows 侧(PowerShell/CMD)
wsl --terminate <发行版名>
wsl -d <发行版名>
4. 验证服务总线可用 — 必做
ps -p 1 -o comm= # systemd
systemctl is-system-running # running / degraded 都算可用
systemctl start docker # 原命令现在能跑
怎么确认修好了
ps -p 1 -o comm= 输出 systemd;systemctl is-system-running 不再报 booted 错误;要启的服务 systemctl status <服务> 正常。
其它环境的表现
| 环境 | 说明 |
|---|---|
| 未启用 systemd | PID1 = init;systemctl 报 System has not been booted with systemd |
| 已启用 | PID1 = systemd;systemctl/journalctl 全可用 |
| 老版本 WSL(< 0.67.6 / 2022-09 前) | 不支持 [boot] systemd=true,需先 wsl --update |
症状
$ systemctl status docker
System has not been booted with systemd as init system (PID 1). Can't operate.
Failed to connect to bus: Host is down
特征:systemctl 任何子命令都报 booted 错误;ps -p 1 不是 systemd;wsl.conf 没有 [boot] systemd=true 或改完没重启。
原因
WSL2 默认 PID1 是 WSL 自带 init,不是 systemd;systemctl 需要 systemd 作 PID1。/etc/wsl.conf [boot] systemd=true 启用 systemd 后必须重启发行版才重新初始化。
解法
ps -p 1 -o comm=确认 PID1;- wsl.conf 加
[boot] systemd=true; - Windows 侧
wsl --terminate <发行版名>重启; - 验证
ps -p 1 -o comm== systemd 后重跑原命令。
验证证据
- 机制核对:微软官方文档(learn.microsoft.com/windows/wsl/systemd);
- 本机对照(2026-08-31):定制预构建版 PID1 = systemd、
systemctl is-system-running= degraded、wsl.conf 已有[boot] systemd=true——健康路径验证;未做禁用复现(避免影响工作环境); - 实测复现日志(2026-08-31)
相关 canonical
按「前置 → 同根 / 同域 / 相关」读:
- 相关(报错相近,根因不同):
- WSL 注册发行版失败错误码族(WSL 发行版生命周期)
- WSL 默认用户变 root(wsl.conf 另一坑:改完必须重启发行版)
适用工具 (1)
本问题方案已挂到下列工具的方案页——从工具页也能回到这里,双向可达。
wsl · 外部工具来源与证据
← 编码代理与终端 问题域 | 问题货架 | 遇到其它问题?去 问题空间 提交求助卡