启用 wsl systemd 的五种方法:一、修改 /etc/wsl.conf 启用;二、修复文件权限与换行符;三、通过命令行强制启动 systemd;四、确保 wsl2 及内核 ≥5.10;五、清除 init 冲突并重设默认目标。

如果您已在 Windows 11 中安装 WSL,但执行 systemctl 命令时提示 Failed to connect to bus: No such file or directory,则说明当前 WSL 实例未启用 systemd 支持。以下是启用该功能的多种可行方法:
一、通过 /etc/wsl.conf 启用 systemd
此方法通过修改 WSL 发行版内部的配置文件,声明在启动时启用 systemd 初始化系统。该配置仅作用于当前 Linux 发行版,且需配合 WSL 重启生效。
1、在 WSL 终端中以管理员权限打开或创建 /etc/wsl.conf 文件:
sudo nano /etc/wsl.conf
2、在文件中写入以下内容(确保格式严格对齐,无多余空格或不可见字符):
[boot]
systemd=true
3、按 Ctrl+O 保存,回车确认文件名,再按 Ctrl+X 退出编辑器。
4、关闭所有 WSL 实例:
wsl --shutdown
5、重新启动 WSL 终端,运行 ps -p 1 -o comm=,若输出为 systemd,则表示启用成功。
二、验证并修复 wsl.conf 文件权限与位置
若第一种方法未生效,可能是配置文件被错误放置、权限受限或语法不合规。WSL 仅识别位于发行版根文件系统 /etc/wsl.conf 的配置,且要求该文件由 root 用户拥有、权限为 644。
1、确认文件实际存在且路径准确:
ls -l /etc/wsl.conf
2、若显示 No such file or directory,请返回第一步重新创建;若显示权限异常(如 600 或 755),执行:
sudo chmod 644 /etc/wsl.conf && sudo chown root:root /etc/wsl.conf
3、检查文件是否含 Windows 风格换行符(CRLF),此类字符会导致解析失败:
file /etc/wsl.conf
4、若输出含 CRLF,使用 dos2unix 工具修复(如未安装,先运行 sudo apt install dos2unix):
sudo dos2unix /etc/wsl.conf
三、强制启用 systemd 的备用启动方式
当 wsl.conf 配置因发行版限制(如某些精简版镜像)无法触发 systemd 时,可绕过配置文件,直接在启动命令中注入 systemd 进程作为 PID 1。该方法无需修改配置,但每次启动需手动指定参数。
1、在 Windows PowerShell 或 CMD 中,进入目标发行版所在目录(例如 Ubuntu-22.04):
wsl -d Ubuntu-22.04 -u root
2、在 root shell 中执行:
exec /usr/lib/systemd/systemd --system --unit=basic.target
3、新开一个 WSL 终端窗口,运行 systemctl list-units --type=service,若能列出服务项,则证明 systemd 已接管。
4、为简化操作,可在 Windows 的快捷方式或终端启动脚本中固化该命令,例如创建批处理文件:
wsl -d Ubuntu-22.04 -u root -e /usr/lib/systemd/systemd --system --unit=basic.target
四、检查 WSL 版本与内核兼容性
systemd 要求 WSL2 内核版本不低于 5.10,且必须启用虚拟机平台。低版本内核或 WSL1 环境将无法加载 systemd 所需的 cgroup v2 和 namespace 功能。
1、在 PowerShell 中确认 WSL 当前版本:
wsl --list --verbose
2、若目标发行版显示 VERSION 为 1,执行升级命令:
wsl --set-version Ubuntu-22.04 2
3、检查 WSL2 内核版本:
wsl cat /proc/version
4、若内核版本低于 5.10.16.3,需手动更新内核包:
访问 https://aka.ms/wsl2kernel 下载最新 wsl_update_x64.msi 并安装。
五、排查 systemd 启动冲突项
部分发行版预装了传统 SysV init 或 OpenRC,其 init 进程可能抢占 PID 1,导致 systemd 无法启动。此时需清除冲突进程并重设默认目标。
1、检查当前 PID 1 进程:
ps -p 1 -o comm=
2、若输出为 init 或 openrc,说明 systemd 未接管;执行:
sudo systemctl set-default multi-user.target
3、禁用旧 init 相关服务(以 Debian/Ubuntu 为例):
sudo systemctl mask systemd-sysv-generator
4、强制重载 systemd 配置并重启初始化:
sudo systemctl daemon-reload && sudo systemctl reboot
5、重新连接 WSL 后再次验证 ps -p 1 -o comm= 输出是否为 systemd。










