为啥在 WSL 中禁用 systemd?

Posted

技术标签:

【中文标题】为啥在 WSL 中禁用 systemd?【英文标题】:why systemd is disabled in WSL?为什么在 WSL 中禁用 systemd? 【发布时间】:2019-08-29 22:50:52 【问题描述】:

没有一个 systemd 命令在 WSL(Ubuntu Bash 18.04)中运行。当我运行sudo systemctl is-active kubelet 时,错误是output: System has not been booted with systemd as init system (PID 1). Can't operate. : running command: sudo systemctl is-active kubelet

如何在 WSL 中启用 systemd 功能?有什么办法摆脱System has not been booted with systemd

【问题讨论】:

【参考方案1】:

目前 WSL 不支持 Systemd。更多信息可以在with this GitHub issue找到。

此外,Docker(在撰写本文时)还没有在 WSL 之上工作,这意味着 Kubelet 不会有太大用处。为了在本地运行 Kubernetes,您可以使用包含 Kubernetes 支持的Docker for Windows,或者您可以使用Minikube 使用 Hyper-V 或 Virtualbox 运行 VM。

【讨论】:

Docker 现在有对 WSL 的实验性支持:docs.docker.com/docker-for-windows/wsl-tech-preview 在 WSL2 中微软的 'init' 被真正的 linux 'init' 取代了吗?还是微软的'init'? @datdinhquoc 有点晚了,但是(如果您仍然想知道)它仍然是 WSL2 中的 Microsoft init,到目前为止,Microsoft 没有任何迹象表明它会随时更改很快。他们仍在研究如何支持 Systemd,但目前尚未宣布任何计划。【参考方案2】:

使用 WSL2 时,您可以使用:

sudo service docker start

这个命令基本上是执行脚本/etc/init.d/docker

可以通过脚本 /etc/default/docker 进行一些自定义,例如指定 HTTP 代理。

【讨论】:

这适用于所有其他已安装的服务,如 apache、memcached 等。您也可以执行此 WSL (1)。 在windows上,使用这个命令——sudo service,而不是systemctl 例如:sudo service docker start sudo service ssh start【参考方案3】:

Windows Subsystem for Linux (WSL) 2 引入了一个重要的 架构变化,因为它是由 Microsoft 构建的完整 Linux 内核, 允许 Linux 容器在没有仿真的情况下本地运行。

在安装 Docker Desktop WSL 2 后端之前,您必须完成 以下步骤:

安装 Windows 10 版本 1903 或更高版本。启用 WSL 2 功能 窗户。

来源 - Docker Desktop WSL 2 backend

要了解您的设备运行的是哪个版本的 Windows,请按 Windows 徽标键 + R,在“打开”框中键入 winver,然后选择“确定”。

WSL 不支持 Systemd,但有一个解决方法 - Script to enable systemd support on current Ubuntu WSL2 images from the Windows store。

【讨论】:

github 脚本成功了!【参考方案4】:

在 WSL2 中破解 Systemd

Systemd 在 WSL2 中不是原生的,但 Shayne 找到了破解它的方法:https://github.com/shayne/wsl2-hacks

第一次使用的体验非常不稳定,但它适用于我的大部分使用:docker、minikube (--driver=none)、systemd 服务。

PS:请注意在使用之前始终连接到您的用户 (bash $USER)。否则您将无法访问您的个人资料配置~/.profile~/.bash_profile)。


使用 Systemd Genie

Arkane 发布了一种在 systemd 中为 WSL2 编排命名空间(或瓶子)的方法:https://github.com/arkane-systems/genie

安装后通过精灵连接到您的个人资料:

genie -c bash

此时,只有 Ubuntu 18.04 和 19.10 可以工作。目前没有 Ubuntu 20.04 的软件包(我很兴奋)。

Docker 和 Minikube 也可以在此配置中作为本机 (--driver=none) 工作。

【讨论】:

【参考方案5】:

您可以在 WSL2 中使用 bubblewrap 相当轻松地启动 systemd:

# pacman -S bubblewrap  # or apt, etc.
# bwrap --dev-bind / / --unshare-pid --as-pid-1 /usr/lib/systemd/systemd

如果启动成功,它不会向当前 TTY 打印任何内容,但是如果您在另一个 TTY 中运行 htop 等,您会看到它已启动并启动了配置的服务。

然后,您可以通过将 /usr/lib/systemd/system/sshd.service 符号链接到 /etc/systemd/system/multi-user.target.wants/ 来手动启用 OpenSSHd。在/root/.ssh配置你的密钥,启动systemd,你应该可以SSH进去了。

【讨论】:

完成,尽管我认为这将适用于任何兼容的 Linux 环境。 :) 酷 - 我很快就会试一试!我已经学会在没有 Systemd 的情况下勉强过活,但在 WSL 下,有时它确实会让生活变得更轻松。 终于开始尝试这个,至少用nsenter 加入命名空间而不是ssh'ing。一个问题(现在)——你的例子不是bwrap命令行需要--proc /proc?否则,似乎现有的/proc 被使用了,这意味着 that /proc 中的 PID1 仍然是 /init 另外,在我的测试中,这个bwrap 命令会创建一个nosuid 的rootfs,这意味着您不能在其中以普通用户身份运行并使用sudo。那是你的经历吗?根据您的说明,听起来您可以通过在命名空间内以 root 身份运行来避免这种情况?

以上是关于为啥在 WSL 中禁用 systemd?的主要内容,如果未能解决你的问题,请参考以下文章

WSL 错误 System has not been booted with systemd as init system (PID 1). Can‘t operate

在 Windows 10 上的 WSL 终端中禁用蜂鸣声[关闭]

使用Systemctl命令来管理系统服务

WSL2:为啥我必须在重启 PC 后关闭 WSL 才能重启 WSL

无法禁用 systemd 服务

WSL中使用systemctl报错问题