適用於Linux的 Windows 子系統 (WSL) 現在支援 systemd,這是許多熱門 Linux 發行版所使用的 init 系統和服務管理員,例如 Ubuntu、Debian 等等。 (什麼是系統?)。
init 系統預設值最近已從 SystemV 變更,systemd 現在是目前版本 Ubuntu 的預設版本,該版本將使用 wsl --install
命令 預設值安裝。 除了目前版本的 Ubuntu,其他 Linux 發行版可能仍會使用類似於 SystemV init 的 WSL 初始化程序。 若要變更為 systemd,請參閱 如何啟用 systemd。
什麼是Linux中的 systemd?
根據 systemd.io:「systemd 是 Linux 系統的基本建置組塊套件。 它提供了一個以 PID 1 身分執行的系統和服務管理員,並啟動系統的其餘部分。
Systemd 主要是 init 系統和服務管理員,包括啟動精靈、掛接和自動掛接點維護、快照支援,以及使用 Linux 控制群組追蹤等功能。
大部分主要的 Linux 發行版現在都運行 systemd,因此在 WSL 上啟用它可以讓使用體驗更接近於原生 Linux。 請參閱下列的 影片公告,其中包含 systemd 的示範 或 範例,來深入瞭解 systemd 所提供的功能。
如何啟用 systemd?
Systemd 現在是 目前版本 Ubuntu 的預設系統,該版本將使用 wsl --install
命令 進行預設安裝。
若要在 WSL 2 上的任何其他 Linux 發行版中啟用 systemd(將預設從使用 systemv init 變更為使用 systemd):
請確定您的 WSL 版本為 0.67.6 或更新版本:
- 若要檢查,請執行
wsl --version
;如果命令出現Invalid command line option: --version
錯誤,您必須更新 WSL。 - 若要更新、執行
wsl --update
或 從 Microsoft Store下載最新版本。
- 若要檢查,請執行
開啟 Linux 發行版的命令行,然後輸入
cd /
以存取根目錄,然後ls
列出檔案。 您會看到一個名為「etc」的目錄,其中包含該發行版的 WSL 組態檔。 開啟此檔案,讓您可以使用 Nano 文字編輯器進行更新,方法是輸入:nano /etc/wsl.conf
。在您現在開啟的
wsl.conf
檔案中新增這幾行,以將使用的 init 更改為 systemd:[boot] systemd=true
上啟用 systemd
結束 Nano 文字編輯器(Ctrl + X,輸入 Y 以儲存您的變更,並使用
enter
鍵進行確認)。接著,您必須關閉 Linux 發行版。 您可以使用 PowerShell 中的 命令
wsl.exe --shutdown
重新啟動所有 WSL 實例。重新啟動 Linux 發行版之後,systemd 將會運行。 您可以使用命令
systemctl status
驗證它,以顯示 執行中的 狀態,還有命令systemctl list-unit-files --type=service
,這會顯示與您的 Linux 發行版相關聯的任何服務狀態。
如果您的 Linux 發行版是 Debian/Ubuntu/Kali Rolling,您不僅應該已安裝 systemd 套件,也請確定已安裝 systemd-sysv 套件。
sudo apt-get update -y && sudo apt-get install systemd systemd-sysv -y
深入瞭解 WSL 中的進階設定組態,包括 wsl.conf
(特定於發行版) 和 .wslconfig
(全域) 組態檔之間的差異、如何更新自動掛載設定等等。
Systemd 示範影片
Microsoft與 Canonical 合作,為 WSL 提供系統支援。 請參閱 Craig Loewen(Microsoft 的 WSL 專案經理)和 Oliver Smith(Canonical 的 WSL 上的 Ubuntu 專案經理)宣布 systemd 支援,並展示其所啟用的一些示範。
Oliver 的教學課程,其依據 Ubuntu 部落格上的這些示範 - 包括「在 WSL 上使用 Snap,在幾分鐘內創建 Nextcloud 實例」、「使用 LXD 管理您的 Web 專案」,以及 「在 Ubuntu WSL 上作為 systemd 服務運行 .Net Echo Bot」
Craig 在 GitHub 上的 microk8s 示範
Systemd 範例
相依於 systemd 的一些 Linux 應用程式範例如下:
snap:Canonical 針對使用 Linux 核心和 systemd init 系統的作業系統所開發的軟體封裝和部署系統。 套件稱為「snaps」,用於建置 snaps 的命令行工具稱為「Snapcraft」,用於下載和安裝 snaps 的中央存放庫稱為「Snap Store」,而執行 snaps 所需的守護程序(包括從商店下載,掛載,限制,以及執行應用程式)稱為「snapd」。 整個系統有時稱為“snappy”。請嘗試執行 命令:
snap install spotify
。microk8s:一種開放原始碼、低作業、最少的生產 Kubernetes,可自動化容器化應用程式的部署、調整和管理。 請依照指示 在 WSL2上安裝 MicroK8s,查看《開始使用教學課程》,或觀看在 Windows 上使用 MicroK8s 和 WSL 2 的 Kubernetes影片。
systemctl:用來控制及檢查 systemd 的命令行公用程式,並協助您與 Linux 發行版上的服務互動。 嘗試命令:
systemctl list-units --type=service
以查看哪些服務可用及其狀態。
示範如何使用 systemd 的一些相關教學課程:
如何在Ubuntu 20.04 上使用 Systemd 進行沙箱處理
啟用 systemd 如何影響 WSL 架構?
啟用對 systemd 的支援需要修改 WSL 架構。 由於 systemd 需要 PID 1,在 Linux 發行版中啟動的 WSL init 程式會變成 systemd 的子進程。 因為 WSL init 程式負責提供 Linux 和 Windows 元件之間通訊的基礎結構,因此變更此階層需要重新思考 WSL init 程式所做的一些假設。 必須進行其他修改以確保乾淨關機(因為現在由 systemd 控制關機),並與 WSLg相容,這是 WSL 的一個元件,負責執行以視窗形式顯示而非僅限於命令列的 Linux 圖形使用者介面應用程式。
也請務必注意,使用這些變更時,系統服務不會讓 WSL 實例保持運作。 您的 WSL 執行個體會如同此更新前一樣保持活躍,您可以在 2017 年的背景工作支援部落格文章中詳讀更多資訊。