为啥在 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 中的 Microsoftinit
,到目前为止,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 终端中禁用蜂鸣声[关闭]