使用 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。
根據 systemd.io:「systemd 是 Linux 系統的基本建置組塊套件。 其提供以 PID 1 身分執行並啟動系統其餘部分的系統和服務管理員。
systemd 主要是初始化系統和服務管理器,包括隨需啟動精靈、掛接和自動掛接點維護、快照支援,以及使用 Linux 控制群組進行處理程序追蹤等功能。
大部分的主要 Linux 發行版本現在都執行 systemd,因此在 WSL 上啟用它可讓體驗更接近於使用裸機 Linux。 請參閱包含 systemd 示範的影片公告,或以下使用 systemd 的範例,以深入瞭解 systemd 提供的功能。
Systemd 現在是 Ubuntu 目前版本的預設值,將使用預設的 wsl --install
命令進行安裝。
若要針對 WSL 2 上執行的任何其他 Linux 發行版本啟用 systemd (變更使用 systemv init 的預設值):
請確定您的 WSL 版本是 0.67.6 或更新版本。 (若要檢查,請執行 wsl --version
。若要更新,請執行 wsl --update
或從 Microsoft Store 下載最新版本。)
開啟 Linux 發行版本的命令列,然後輸入 cd /
,以存取根目錄,然後輸入 ls
列出檔案。 您會看到名為「etc」的目錄,其中包含發行版本的 WSL 組態檔。 開啟此檔案,使用 Nano 文字編輯器進行更新,方法是輸入:nano /etc/wsl.conf
。
在現在開啟的 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 中的進階設定組態,包括 (distribution-specific) 和 .wslconfig
(global) 組態檔之間的差異wsl.conf
、如何更新自動掛接設定等等。
Microsoft 與 Canonical 合作,為 WSL 提供 systemd 支援。 請參閱 Craig Loewen (Microsoft 的 WSL 專案經理) 和 Oliver Smith (Canonical 的 Ubuntu WSL 專案經理) 宣佈 systemd 支援,並顯示其所啟用功能的部分示範。
相依於 systemd 的一些 Linux 應用程式範例如下:
snap:Canonical 針對使用 Linux 核心和 systemd init 系統的作業系統所開發的軟體套件和部署系統。 套件稱為「snap」,用於建置 snap 的命令列工具稱為「Snapcraft」、可下載/安裝 snap 的中央存放庫稱為「Snap Store」,而執行 snap 所需的精靈 (從 Store 下載、掛接到位置、限制,及從中執行應用程式) 稱為「snapd」。 整個系統有時稱為“snappy”。請嘗試執行命令: snap install spotify
。
microk8s:開放原始碼、低作業、最少的生產 Kubernetes,可自動化容器化應用程式的部署、調整和管理。 請依照指示在 WSL2 上安裝 MicroK8s、查看入門教學課程,或觀看關於含 MicroK8s 和 WSL 2 的 Windows 上的 Kubernetes 的影片。
systemctl:用來控制及檢查 systemd 的命令列公用程式,可協助您與 Linux 發行版本上的服務互動。 嘗試以下命令:systemctl list-units --type=service
,查看有哪些服務可用及其狀態。
示範如何使用 systemd 的一些相關教學課程:
啟用對 systemd 的支援需變更 WSL 架構。 由於 systemd 需要 PID 1,在 Linux 發行版本中啟動的 WSL init 處理程序會變成 systemd 的子處理程序。 因為 WSL init 處理程序負責提供 Linux 和 Windows 元件之間通訊的基礎結構,因此變更此階層需要重新思考 WSL init 處理程序所做的一些假設。 必須進行其他修改,以確保正常關機 (關機現在由 systemd 控制),並與 WSLg 相容、執行 Linux 圖形化使用者介面 (GUIS) 的 WSL 元件,或 Linux 應用程式顯示在視窗中,而不是命令列中。
也請務必注意,使用這些變更時,系統服務不會讓 WSL 實例保持運作。 WSL 執行個體會用跟此更新之前的相同方式保持運作,您可以在 2017 年的背景工作支援部落格文章中深入瞭解。