使用 systemd 通过 WSL 管理 Linux 服务
适用于 Linux 的 Windows 子系统 (WSL) 现在支持 systemd,它是许多常用的 Linux 发行版(例如 Ubuntu、Debian 等)使用的 init 系统和服务管理器。 (什么是 systemd?)。
init 系统默认值最近已不再是 SystemV,systemd 现在是使用 wsl --install
命令默认值安装的 Ubuntu 的当前版本默认值。 除当前版本的 Ubuntu 以外的 Linux 发行版仍然可能使用 WSL init,它类似于 SystemV init。 若要更改为 systemd,请参阅如何启用 systemd。
Linux 中的 systemd 是指什么?
根据 systemd.io:“systemd 是 Linux 系统的基本构建基块套件。 它提供一个系统和服务管理器,该管理器作为 PID 1 运行并启动系统的其余部分。”
Systemd 主要是一个 init 系统和服务管理器,它包括按需启动守护程序、装载和自动装载点维护、快照支持以及使用 Linux 控制组进行跟踪等功能。
大多数主要的 Linux 发行版现在都运行 systemd,因此在 WSL 上启用它可使体验更接近于使用裸机 Linux。 请参阅带 systemd 演示的视频公告或下面的 systemd 使用示例,详细了解 systemd 提供的功能。
如何启用 systemd?
Systemd 现在是将使用 wsl --install
命令默认值安装的 Ubuntu 的当前版本默认值。
若要为 WSL 2 上运行的任何其他 Linux 发行版启用 systemd(更改默认值,使其不再使用 systemv init):
确保 WSL 版本为 0.67.6 或更高版本。 (若要检查,请运行
wsl --version
。若要更新,请运行wsl --update
或从 Microsoft Store 下载最新版本。)打开 Linux 发行版的命令行并输入
cd /
来访问根目录,然后输入ls
来列出文件。 你将看到一个名为“etc”的目录,其中包含发行版的 WSL 配置文件。 打开此文件,以便可通过输入nano /etc/wsl.conf
,使用 Nano 文本编辑器进行更新。在
wsl.conf
文件中添加以下行,你现在已打开此文件来更改用于 systemd 的 init:[boot] systemd=true
退出 Nano 文本编辑器(Ctrl + X,选择 Y 来保存更改)。 然后,需要关闭 Linux 发行版。 可以使用 PowerShell 中的
wsl.exe --shutdown
命令重启所有 WSL 实例。
Linux 发行版重启后,systemd 将会运行。 可使用 systemctl list-unit-files --type=service
命令进行确认,这将显示与 Linux 发行版关联的任何服务的状态。
详细了解 WSL 中的高级设置配置,其中包括 wsl.conf
(特定于发行版)和 .wslconfig
(全局)配置文件之间的差异、如何更新自动装载设置等。
Systemd 演示视频
Microsoft 与 Canonical 合作,为 WSL 提供 systemd 支持。 请查看 Craig Loewen(Microsoft 的 WSL 项目经理)和 Oliver Smith(Canonical 的 Ubuntu on WSL 项目经理)宣布 systemd 支持并展示其启用功能的一些演示。
Oliver 基于 Ubuntu 博客上的这些演示的教程 - 包括“在 WSL 上使用 snap 只需几分钟即可创建 Nextcloud 实例”、“使用 LXD 管理 Web 项目”和 Run a .Net Echo Bot as a systemd service on Ubuntu WSL(在 Ubuntu WSL 上将 .Net Echo Bot 作为 systemd 服务运行)
Systemd 示例
下面是一些依赖于 systemd 的 Linux 应用程序示例:
snap:Canonical 为使用 Linux 内核和 systemd init 系统的操作系统开发的软件打包和部署系统。 这些包称为“snap”,用于生成 snap 的命令行工具称为“Snapcraft”,可下载/安装 snap 的中心存储库称为“Snap Store”,运行 snap 所需的守护程序(从应用商店下载、装载到位、进行限制并从中运行应用)称为“snapd”。 整个系统有时称为“snappy”。尝试运行游命令:
snap install spotify
。microk8s:一种开源、低运营、最低生产 Kubernetes,可自动部署、缩放和管理容器化应用。 按照说明在 WSL2 上安装 MicroK8s,查看入门教程或观看关于 Windows 上的 Kubernetes 与 MicroK8s 和 WSL 2 的视频。
systemctl:用于控制和检查 systemd 的命令行实用工具,可帮助你与 Linux 发行版上的服务进行交互。 请尝试
systemctl list-units --type=service
命令来查看哪些服务可用及其状态。
一些相关教程演示了使用 systemd 的方法:
Understanding and Using Systemd(了解和使用 Systemd)
Systemd Essentials: Working with the Services, Units, and the Journal(Systemd 基础知识:使用服务、单元和日记)
How To Sandbox Processes With Systemd On Ubuntu 20.04(如何在 Ubuntu 20.04 上使用 Systemd 设置进程沙盒)
启用 systemd 如何影响 WSL 体系结构?
启用对 systemd 的支持需要更改 WSL 体系结构。 systemd 需要 PID 1,因此在 Linux 发行版中启动的 WSL init 进程将成为 systemd 的子进程。 由于 WSL init 进程负责为 Linux 和 Windows 组件之间的通信提供基础结构,因此更改此层次结构需要重新考虑 WSL init 进程做出的一些假设。 必须进行其他修改,以确保干净关闭(因为关闭现在由 systemd 控制),并与 WSLg、运行 Linux 图形用户界面 (GUI) 的 WSL 组件,或者 Windows 而不是命令行中显示的 Linux 应用兼容。
此外,请务必注意,通过这些更改,systemd 服务不会使 WSL 实例保持活动状态。 WSL 实例将保持活动状态,就像在此更新之前一样,你可以在这篇 2017 年的后台任务支持博客文章中阅读详细信息。