amtoaer

晓风残月

叹息似的渺茫,你仍要保存着那真!
github
x
telegram
steam
nintendo switch
email

在 wsl2 中完美啟用 systemd

在 wsl2 中啟用 systemd 的方法至少有如下三種:

  1. genie
  2. subsystemctl
  3. wsl-distrod

本文主要介紹第三種方法,並在後文介紹選用第三種方法的優勢。

安裝方法#

安裝分為兩個選項:

  1. 安裝一個新的帶有 systemd 的發行版
  2. 為現有的發行版增加 systemd 支持

以下分別介紹。

安裝一個新的帶有 systemd 的發行版#

  1. 下載並解壓縮 distrod_wsl_launcher,執行解壓縮出的二進制文件

  2. 跟隨引導安裝一個新的發行版

  3. [可選項] 使用如下命令使你的發行版在 Windows 啟動時自動運行:

    sudo /opt/distrod/bin/distrod enable --start-on-windows-boot
    

為現有的發行版增加 systemd 支持#

  1. 下載並執行最新的安裝腳本:

    curl -L -O "https://raw.githubusercontent.com/nullpo-head/wsl-distrod/main/install.sh"
    chmod +x install.sh
    sudo ./install.sh install
    
  2. 在你的發行版中開啟 distrod

    有兩個選擇:

    1. 在 Windows 啟動時運行你的發行版:

      /opt/distrod/bin/distrod enable --start-on-windows-boot
      
    2. 否則:

      /opt/distrod/bin/distrod enable
      

      注:接下來仍然可以通過執行/opt/distrod/bin/distrod enable --start-on-windows-boot讓發行版跟隨 Windows 啟動。

  3. 重新啟動你的發行版

    關掉你的 WSL 窗口,在 PowerShell 中執行如下命令:

    wsl --shutdown
    

    接下來重新打開一個新的 WSL 窗口,你的 shell 將在 systemd 會話中運行。

與其他方法的對比#

官方文檔中,Distrod 描述了其工作原理:

簡而言之,Distrod 是一個二進制文件,它會創建一個簡單的容器,將 systemd 作為 init 進程,並在該容器中啟動您的 WSL 會話。為了做到這一點,Distrod 做了以下事情:

  1. 修改具體發行版的 rootfs,以使其與 WSL 和 systemd 兼容。
    1. 修改 systemd 服務,使其與 WSL 兼容。
    2. /opt/distrod/bin/distrod和其他資源放進 rootfs。
    3. 把 Distrod 二進制文件註冊為登錄 shell。
  2. 當 Distrod 作為登錄 shell 被 WSL 的 init 進程啟動時,Distrod:
    1. 在簡單的容器中啟動 systemd
    2. 在這個容器中啟動你實際的 shell
    3. 在 systemd 會話和 WSL 交互環境間建立橋梁。

事實上 Distrod 和 genie、subsystemctl 的工作原理是類似的:創建一個容器,在容器內以 pid 1 啟動 systemd 並使用 shell。在其官方文檔中也有提過:

把 Distrod 作為一個獨立的一次性命令:在這種情況下, distrod 的工作方式就像 genie 和 subsystemctl。

但是,Distrod 在自啟動方面做了更多的工作。通過上述操作,Distrod 做到了:

  1. 安裝並啟用後,啟動 WSL 會自動啟動 systmed。
  2. 添加--start-on-windows-boot參數後,Distrod 會註冊一個 Windows 任務,使得 WSL 在 Windows 開機時就會運行。

對比其他方法需要手動編寫 shell 腳本實現自動啟動,安裝更簡單、使用更方便的 Distrod 無疑更受用戶青睞。

結語#

在安裝、使用過程中遇到任何問題,可以參考官方資料

文章中發現任何錯誤歡迎在評論區指出!~

載入中......
此文章數據所有權由區塊鏈加密技術和智能合約保障僅歸創作者所有。