WSL 2 上啟用微軟官方支援的 systemd

2022-10-01 06:00:41

以前折騰了很久的 genie 和 distrod 來實現 wsl2 上的 systemd。現在微軟和Canonical聯合宣告發布了官方支援的systemd,之前的折騰貌似有點浪費時間了。如果微軟不釋出這個systemd的解決方案,本文的主題可能就是去對比 geniedistrod 了。

在安裝體驗後,個人感覺官方支援的systemd確實比上述兩個開源專案體驗更佳。很值得有需要在wsl環境中執行docker、nginx、mysql等後臺服務的小夥伴來嚐鮮。

本文首先會用兩個小節去比較genie和distrod,對他們不感興趣的小夥伴,可以直接跳到第三節。

和genie的對比

genie的使用通過genie -s進入執行著systemd的bottle環境,通過genie -u退出,此處需要手動處理或額外設定~/.bashrc。但通過wsl直接執行的shell命令預設又不是位於systemd的bottle之中,這為vscode使用帶來了一些問題,需要額外處理: 1. code命令找不到2. vscode server 未執行在bottle中

此外genie首次執行時,會需要等待240秒並顯示出無法啟動的service,使用者需要手動禁用這些有問題的service,才能再下次執行時正常使用。試圖通過設定縮短等待時間,發現只是徒勞

總體而言genie的使用還是較為複雜的,使用前需要完整閱讀wiki。相比之下官方支援的systemd的使用更為簡單。通過簡單設定後,是開箱即用,使用者無感的。這一點genie無法媲美。

和distrod的對比

distrod直接修改了你的預設shell,執行時也是開箱即用。distrod基於ruby編寫執行效能很好,執行也很穩定。
它還支援基於lxc社群映象安裝多個發行版,且都經過了測試,如:centos / alma / arch / fedora / debian / ubuntu 等等。

而官方支援的systemd還是有一點時優於distrod的,那就是啟用了官方systemd的wsl2範例,在使用者停止操作後,會自動關閉,和未啟用systemd 時的特性一樣,這有利於節約電腦的計算資源。

如何安裝和使用微軟官方支援的 systemd

啟用最新的wsl systemd特性前,可先閱讀微軟和Canonical提供的檔案:
https://devblogs.microsoft.com/commandline/systemd-support-is-now-available-in-wsl/
https://ubuntu.com/blog/ubuntu-wsl-enable-systemd
https://devblogs.microsoft.com/commandline/a-preview-of-wsl-in-the-microsoft-store-is-now-available

如果需要使用微軟官方支援的systmed,在目前來說你需要滿足這些前置條件:

  1. 作業系統為windows 11
  2. wsl 版本為 0.67.6 或以上。

檢視wsl版本號命令為: wsl --version,如果此命令未正常回顯版本號,或版本號低於0.67.6,那麼你安裝的wsl還不支援systemd。

截至2022/9/30,wsl 0.67.6及以上版本還是預覽版本,
如果你是Windows Insiders使用者,那麼可以通過 https://aka.ms/wslstorepage 連結跳轉到微軟應用商店來安裝最新版本的 wsl preview。
如果你未加入Windows Insiders計劃,那麼可以通過 https://github.com/microsoft/WSL/releases 下載最新的preview版本(0.68.2)來進行體驗。

安裝後,可以通過以下命令進行更新: wsl.exe --update --web-download。此命令是在0.67.6版本中新增的。

安裝好新版wsl後,通過以下命令來設定wsl啟用 systemd:

echo -e "[boot]\nsystemd=true" | sudo tee -a /etc/wsl.conf

設定後需要通過wsl --shutdown命令關閉wsl,來進行wsl的完整重啟。

如何判斷systemd是否啟用成功

判斷wsl是否已啟用systemd,可通過以下命令檢視:

ps --no-headers -o comm 1

如果命令返回的是init說明systemd未啟用,如果是systemd那麼你的systemd已啟用成功了。

檢視已啟用的systemd service

通過systemctl的list-units、list-unit-files命令,都可以很好的檢視目前的systemd狀態,命令如下:

systemctl list-units --type=service
systemctl list-unit-files --type=service --state=enabled

結束語

首先希望這篇文章能夠幫助到你體驗到最新版本的wsl-systemd特性,如果有任何問題歡迎你留言。

此外還想插兩句題外話:
在微軟生態下開發開源專案其實是很被動的,因為你不知道什麼時候會被官方降維打擊。 為genie和distrod而感到惋惜。