根本原因是wsl2默认未启用systemd,pid 1仍是轻量init;需通过/etc/wsl.conf配置[boot] systemd=true并执行wsl --shutdown后重启,ps -p 1 -o comm=输出systemd即成功。

在 Win11 的 WSL2 中运行 Docker、snap、systemd timer、udev 规则或完整 GUI 应用时,常遇到 Failed to connect to bus: No such file or directory 或 System has not been booted with systemd as init system 报错,根本原因是 WSL2 默认未启用 systemd 初始化系统,PID 1 进程仍是轻量级 init,无法承载现代 Linux 服务生态。
通过 /etc/wsl.conf 启用 systemd(主推方案)
这是微软官方支持、最稳定且永久生效的方式,适用于 Ubuntu、Debian、Kali 等主流发行版,修改后每次启动自动加载 systemd。
第一步:在 WSL 终端中以 root 权限打开配置文件:sudo nano /etc/wsl.conf
第二步:严格输入以下两行内容——不能有空行、不能缩进、不能含中文、不能用 Windows 换行符(CRLF):
[boot]
systemd=true
第三步:保存退出 nano:按 Ctrl+O → 回车确认 → Ctrl+X 退出
第四步:关闭所有 WSL 实例,确保旧进程彻底释放:wsl --shutdown。这一步不可跳过,否则新配置不会加载。
第五步:重新启动该发行版(例如点击开始菜单中的 Ubuntu 图标),进入后立即执行:ps -p 1 -o comm=。若输出为 systemd,说明已成功接管 PID 1。
排查 wsl.conf 失效的常见原因
即使按上述步骤操作,仍可能因底层细节被忽略而失败。WSL 仅识别位于发行版根文件系统、权限为 644、所有者为 root、无 CRLF 的 /etc/wsl.conf 文件。
方法一:检查文件是否存在及权限是否合规:ls -l /etc/wsl.conf
方法二:若权限不是 644 或所有者不是 root,立即修复:sudo chmod 644 /etc/wsl.conf && sudo chown root:root /etc/wsl.conf
方法三:检测换行符类型:file /etc/wsl.conf。如果输出含 CRLF,说明是 Windows 风格换行,nano 在某些终端下会悄悄引入它,导致 WSL 完全忽略该文件。
【必须修复】若确认含 CRLF,先安装 dos2unix:sudo apt update && sudo apt install -y dos2unix,再执行:sudo dos2unix /etc/wsl.conf。
临时启用 systemd(快速验证用)
当你不确定当前发行版是否兼容,或想绕过配置文件直接测试 systemd 是否能跑通,可用此法。它不修改任何文件,但每次重启后失效。
在 Windows PowerShell 中执行(将 Ubuntu-22.04 替换为你实际的发行版名称):wsl -d Ubuntu-22.04 --system
终端启动后立即运行:systemctl is-system-running。若返回 running,说明内核与发行版支持无问题,可放心回退去修 wsl.conf。
注意:该命令会阻塞当前终端窗口,如需继续操作,请新开一个 WSL 窗口。
Arch Linux 用户特别说明
Arch Linux 官方 WSL 镜像自 2.4.12 版本起已默认启用 systemd,无需手动编辑 wsl.conf。你只需确认版本并验证状态即可。
在 PowerShell 中运行:wsl --list --verbose,查看 Arch Linux 对应的 VERSION 是否 ≥ 2.4.12 且状态为 Running。
若为 Stopped,执行:wsl -d archlinux 启动实例。
启动后直接运行:systemctl list-units --type=service | head -n 5。有输出即表示 systemd 已就绪。











