systemctl
命令,但是它给了我以下错误:System has not been booted with systemd as init system (PID 1).
Can't operate. Failed to connect to bus: Host is down
我该如何修复它?
systemctl
命令,但是它给了我以下错误:System has not been booted with systemd as init system (PID 1).
Can't operate. Failed to connect to bus: Host is down
我该如何修复它?
新的 Windows 11 22H2 或更高版本的 WSL 用户在运行 wsl --install
命令时,将自动安装 WSL 应用程序版本,除非明确添加 --inbox
选项。
Windows 11 21H2 用户仍然可以使用以下方法安装 WSL 应用程序。
Windows 10 用户需要 KB5020030 或更高版本。请注意,在此更新发布时,尚不清楚旧版 Windows 10 是否可用。到目前为止,我个人只能在 Windows 10 22H2 上验证过。
在满足先决条件的 Windows 版本后,您可以使用多种方法安装或升级到 WSL 应用程序的 1.0.0 版本(或更高版本):
通过Microsoft Store(作为“Windows子系统Linux”)。
或者从Github存储库的Releases页面。要手动安装一个版本:
重新启动(确保WSL完全不在使用中)。简单的wsl --shutdown
可能有效,但通常不会。
从上面的链接下载1.0.0(或更高版本)的发布版。
启动管理员PowerShell并执行以下操作:
Add-AppxPackage <path.to>/Microsoft.WSL_1.0.0.0_x64_ARM64.msixbundle
wsl --version # 确认版本
wsl ~
即可)。sudo -e /etc/wsl.conf
[boot]
systemd=true
wsl --shutdown
sudo systemctl status
systemctl
通常用于在Ubuntu下启动服务。对于不支持Systemd的旧版本(或者如果您选择不启用它),仍然有几种替代方案可以代替systemctl
命令。
幸运的是,Ubuntu整体上对没有Systemd也能很好地适应。
Systemd本质上只是一种(可能是过度简化的)"完成系统任务的方式"。通常情况下(但并非总是,见下面的脚注),可以找到一种无需Systemd的方法来完成相同的任务,而且通常还有多种方法可供选择。
选项1:“旧方法”
在WSL上的Ubuntu中,许多常见的系统服务仍然可以使用“旧的”init.d
脚本来替代systemctl
与Systemd单元一起使用。您可以使用ls /etc/init.d/
命令查看这些脚本。
例如,您可以使用sudo service ssh start
启动ssh
,它将运行/etc/init.d/ssh
脚本并传递start
参数。
甚至一些非默认安装的软件包,如MySql/MariaDB,也会安装Systemd单元文件和旧的init.d
脚本,因此您仍然可以对它们使用service
命令。
要在启动时自动启动服务(类似于systemctl enable
),请参阅Super User上的此答案以了解如何使用/etc/wsl.conf
实现此目的。
选项2:Docker
许多软件包/服务都可以作为Docker镜像使用。Docker在WSL2上运行得很好(特别是WSL2;在WSL1上无法运行)。如果您要启动的服务没有SysVinit“service”脚本,很可能有一个可用的Docker镜像可以在容器化环境中运行。
例如:Elasticsearch,如此问题和我的答案。
Dockerfile
以了解如何在没有Systemd的情况下启动服务。有关更多信息,请参阅下一个选项:“手动方法”。选项3:“手动方法”
编辑:由于Docker可能是许多服务的更好选择,因此将其从原来的“选项2”降低了一级。
但是,某些服务没有等效的init脚本,尤其是在其他发行版上。为简单起见,让我们假设ssh
的init.d
脚本不可用。
在这种情况下,“答案”是弄清楚Systemd单元文件在做什么,并尝试手动复制。这可能会因复杂性而有所不同。但是,我建议首先查看您要运行的Systemd单元文件:
less /lib/systemd/system/ssh.service
# 省略部分内容
[Service]
EnvironmentFile=-/etc/default/ssh
ExecStartPre=/usr/sbin/sshd -t
ExecStart=/usr/sbin/sshd -D $SSHD_OPTS
RuntimeDirectory=sshd
RuntimeDirectoryMode=0755
为了理解其行为,我省略了一些不太相关的行,但您可以使用man systemd.exec
、man systemd.service
和其他命令来了解大多数选项的作用。
在这种情况下,当您运行sudo systemctl start ssh
时,它会执行以下操作:
在Ubuntu中,有一些应用程序和功能非常复杂,以至于很难从Systemd中解开。最明显的例子就是Snap系统。我相信理论上可能创建一个不使用Systemd的Snap系统版本。然而,这不会发生的两个很好的原因(至少目前不会发生):
Snap是由Canonical创建和支持的系统。
Canonical已经选择了Systemd作为Ubuntu的init系统。即使WSL不容易支持它,这也不会改变。Canonical的开发人员编写Snap系统时期望Systemd的功能存在。
目前似乎没有第三方希望将Snap移植到非Systemd发行版。这些发行版通常使用Flatpak代替Snap。然而,值得注意的是,即使在可用Systemd的发行版上,Flatpak也倾向于使用Systemd。但是,Flatpak也适用于非Systemd发行版。
Gnome也是一个与Systemd紧密耦合的应用程序(生态系统),但它足够受欢迎,以至于已经有了适用于非Systemd init系统的移植版本。尽管如此,在Ubuntu上运行它需要假设存在Systemd,因此如果您想在Ubuntu/WSL上不使用Systemd运行它,您将不得不反向工程处理其他发行版上使用的流程。
还有一些软件在没有Systemd的情况下可能无法正常工作(或者至少不完全正常)。我最近遇到的一个例子是Cockpit。
虽然我能够在没有Systemd的情况下使其运行起来,但它最终需要Systemd存在才能执行许多(如果不是大部分)功能。实际上,Cockpit的一部分是Systemd的前端。
这种类型的软件执行Systemd命令(例如systemctl
),可能是“有替代方案”的例外。
service
命令属于systemd
。我在wsl上遇到了OP的错误,但是mariadb
可以使用service
。service是一个wrapper
,可以与init.d
和systemctl
一起使用。 - Timowsl --version
打印出:无效的命令行选项:--version
。 - Quolonel Questions/etc/wsl.conf
文件启动服务的另一种方式。你可以添加以下指令:[boot]
command="service apache2 start; service mariadb start"
来源 - Arthur Lacosteservice
命令来完成这个任务。请查看标题为“旧方法”的部分。 - NotTheDr01ds
systemctl
命令在WSL上无法正常工作,除非进行一些严重的黑客操作。不建议使用。 - user535733systemctl
?你应该使用Windows命令。你想要实现什么目标? - WinEunuuchs2Unixsudo service ssh restart
。但要注意,在WSL2下,ssh
的工作方式可能与您预期的不太相同。 - NotTheDr01ds