使用 systemd 搭配 WSL 管理 Linux 服務

Windows 子系統 Linux 版 (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 主要是初始化系統和服務管理器,包括隨需啟動精靈、掛接和自動掛接點維護、快照支援,以及使用 Linux 控制群組進行處理程序追蹤等功能。

大部分的主要 Linux 發行版本現在都執行 systemd,因此在 WSL 上啟用它可讓體驗更接近於使用裸機 Linux。 請參閱包含 systemd 示範的影片公告,或以下使用 systemd 的範例,以深入瞭解 systemd 提供的功能。

如何啟用 systemd?

Systemd 現在是 Ubuntu 目前版本的預設值,將使用預設的 wsl --install 命令進行安裝。

若要針對 WSL 2 上執行的任何其他 Linux 發行版本啟用 systemd (變更使用 systemv init 的預設值):

  1. 請確定您的 WSL 版本是 0.67.6 或更新版本。 (若要檢查,請執行 wsl --version。若要更新,請執行 wsl --update從 Microsoft Store 下載最新版本。)

  2. 開啟 Linux 發行版本的命令列,然後輸入 cd /,以存取根目錄,然後輸入 ls 列出檔案。 您會看到名為「etc」的目錄,其中包含發行版本的 WSL 組態檔。 開啟此檔案,使用 Nano 文字編輯器進行更新,方法是輸入:nano /etc/wsl.conf

  3. 在現在開啟的 wsl.conf 檔案中新增以下這些行,以變更用於 systemd 的 init:

    [boot]
    systemd=true
    
  4. 結束 Nano 文字編輯器 (Ctrl + X,選取 Y 以儲存變更)。 接著,您必須關閉 Linux 發行版本。 您可以使用 PowerShell 中的 wsl.exe --shutdown 命令啟動所有 WSL 執行個體。

Enable systemd on WSL 2

Linux 發行版本重新啟動之後,systemd 將會執行。 您可以使用以下命令確認:systemctl list-unit-files --type=service,將顯示與 Linux 發行版本相關聯的任何服務狀態。

深入瞭解 WSL 中的進階設定組態,包括 (distribution-specific) 和 .wslconfig (global) 組態檔之間的差異 wsl.conf 、如何更新自動掛接設定等等。

Systemd 示範影片

Microsoft 與 Canonical 合作,為 WSL 提供 systemd 支援。 請參閱 Craig Loewen (Microsoft 的 WSL 專案經理) 和 Oliver Smith (Canonical 的 Ubuntu WSL 專案經理) 宣佈 systemd 支援,並顯示其所啟用功能的部分示範。

Systemd 範例

相依於 systemd 的一些 Linux 應用程式範例如下:

  • snap:Canonical 針對使用 Linux 核心和 systemd init 系統的作業系統所開發的軟體套件和部署系統。 套件稱為「snap」,用於建置 snap 的命令列工具稱為「Snapcraft」、可下載/安裝 snap 的中央存放庫稱為「Snap Store」,而執行 snap 所需的精靈 (從 Store 下載、掛接到位置、限制,及從中執行應用程式) 稱為「snapd」。 整個系統有時稱為「snappy」。請嘗試執行以下命令:snap install spotifysnap install postman

  • microk8s:開放原始碼、低作業、最少的生產 Kubernetes,可自動化容器化應用程式的部署、調整和管理。 請依照指示在 WSL2 上安裝 MicroK8s、查看入門教學課程,或觀看關於含 MicroK8s 和 WSL 2 的 Windows 上的 Kubernetes 的影片。

  • systemctl:用來控制及檢查 systemd 的命令列公用程式,可協助您與 Linux 發行版本上的服務互動。 嘗試以下命令:systemctl list-units --type=service,查看有哪些服務可用及其狀態。

示範如何使用 systemd 的一些相關教學課程:

啟用 systemd 如何影響 WSL 架構?

啟用對 systemd 的支援需變更 WSL 架構。 由於 systemd 需要 PID 1,在 Linux 發行版本中啟動的 WSL init 處理程序會變成 systemd 的子處理程序。 因為 WSL init 處理程序負責提供 Linux 和 Windows 元件之間通訊的基礎結構,因此變更此階層需要重新思考 WSL init 處理程序所做的一些假設。 必須進行其他修改,以確保正常關機 (關機現在由 systemd 控制),並與 WSLg 相容、執行 Linux 圖形化使用者介面 (GUIS) 的 WSL 元件,或 Linux 應用程式顯示在視窗中,而不是命令列中。

也請務必注意,使用這些變更時,系統服務不會讓 WSL 實例保持運作。 WSL 執行個體會用跟此更新之前的相同方式保持運作,您可以在 2017 年的背景工作支援部落格文章中深入瞭解。