zlth@DESKTOP-0AV55VF:/mnt/c/Windows/system32$ sudo systemctl daemon-reload [sudo] password for zlth: System has not been booted with systemd as init system (PID 1). Can't operate. Failed to connect to bus: Host is down
时间: 2025-03-28 14:04:54 浏览: 87
### WSL 中 `systemctl` 错误解决方案
在 Windows Subsystem for Linux (WSL) 环境下尝试运行 `systemctl` 命令时,可能会遇到如下错误:“System has not been booted with systemd as init system (PID 1)”[^1]。这是因为 WSL 默认不支持 `systemd` 作为其初始化系统。
#### 背景说明
WSL 的设计目标是提供一个兼容的 Linux 环境用于开发和测试,但它并不完全模拟传统的 Linux 启动过程。因此,在 WSL 下无法直接使用依赖于 `systemd` 的工具和服务。然而,可以通过一些替代方法来实现类似的功能。
---
#### 方法一:安装并启用 Systemd 支持(适用于 WSL2)
对于 WSL2 用户来说,可以手动配置 `systemd` 来解决此问题:
1. **更新 WSL 版本**
首先确认当前使用的 WSL 是版本 2。如果尚未升级到 WSL2,则需通过 PowerShell 执行以下命令:
```powershell
wsl --set-version <distro-name> 2
```
2. **修改启动脚本**
创建或编辑 `/etc/wsl.conf` 文件以允许 PID 1 运行自定义进程:
```bash
sudo nano /etc/wsl.conf
```
添加以下内容:
```ini
[boot]
command="systemd --unit=basic.target"
```
3. **重新启动 WSL 实例**
使用以下命令重启对应的发行版实例:
```powershell
wsl --terminate <distro-name>
```
完成上述操作后再次执行 `systemctl` 应该不会再报错。
---
#### 方法二:利用服务管理器代替 `systemd`
如果不希望更改默认设置或者不想引入额外复杂度,也可以考虑其他方式启动所需的服务程序。例如可以直接调用后台守护进程文件而不是借助 `systemctl start service_name`。
假设要开启 Apache HTTP Server (`apache2`) ,则可采用下面的方法:
```bash
sudo apache2ctl start
```
这种方法绕过了对 `systemd` 的需求,适合仅需临时运行某些特定应用的情况。
---
#### 注意事项
尽管可以在一定程度上让 `systemd` 工作于 WSL 上面,但这并非官方推荐做法,并可能带来未知稳定性风险以及性能损耗等问题。建议根据实际项目需求权衡利弊后再做决定。
---
阅读全文
相关推荐






