使用 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 的預設值):
請確定您的 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
、如何更新自動掛接設定等等。
Systemd 示範影片
Microsoft 與 Canonical 合作,為 WSL 提供 systemd 支援。 請參閱 Craig Loewen (Microsoft 的 WSL 專案經理) 和 Oliver Smith (Canonical 的 Ubuntu WSL 專案經理) 宣佈 systemd 支援,並顯示其所啟用功能的部分示範。
Oliver 根據 Ubuntu 部落格上這些示範設立的教學課程包含「在 WSL 上使用 snap 在幾分鐘內建立 Nextcloud 執行個體」、「使用 LXD 管理您的 Web 專案」和「在 Ubuntu WSL 上以 systemd 服務身分執行 .Net Echo Bot」
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 的支援需變更 WSL 架構。 由於 systemd 需要 PID 1,在 Linux 發行版本中啟動的 WSL init 處理程序會變成 systemd 的子處理程序。 因為 WSL init 處理程序負責提供 Linux 和 Windows 元件之間通訊的基礎結構,因此變更此階層需要重新思考 WSL init 處理程序所做的一些假設。 必須進行其他修改,以確保正常關機 (關機現在由 systemd 控制),並與 WSLg 相容、執行 Linux 圖形化使用者介面 (GUIS) 的 WSL 元件,或 Linux 應用程式顯示在視窗中,而不是命令列中。
也請務必注意,使用這些變更時,系統服務不會讓 WSL 實例保持運作。 WSL 執行個體會用跟此更新之前的相同方式保持運作,您可以在 2017 年的背景工作支援部落格文章中深入瞭解。