编码代理与终端 · 收录于 2026-08-31 · 适用 1 工具 ✓ 实测验证

WSL 里 systemctl 报 System has not been booted with systemd / 服务起不来

已验证 2026-08-31systemctl 报 System has not been booted with systemd——/etc/wsl.conf 写 [boot] systemd=true,wsl --terminate 重启后 ps -p 1 应输出 systemd。

快速修复

# 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 <服务> 正常。

其它环境的表现

环境说明
未启用 systemdPID1 = 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 后必须重启发行版才重新初始化。

解法

  1. ps -p 1 -o comm= 确认 PID1;
  2. wsl.conf 加 [boot] systemd=true;
  3. Windows 侧 wsl --terminate <发行版名> 重启;
  4. 验证 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

按「前置 → 同根 / 同域 / 相关」读:

适用工具 (1)

本问题方案已挂到下列工具的方案页——从工具页也能回到这里,双向可达。

wsl · 外部工具

来源与证据

收录 验证 ✓ 实测验证适用 1 工具
方案含本地实测或来源可复核的解法;未实测项已在文中如实标注。

← 编码代理与终端 问题域 | 问题货架 | 遇到其它问题?去 问题空间 提交求助卡