WSL 外掛程式
Windows 應用程式現在可以使用 WSL 外掛程式,建立並與在 Windows 子系統 Linux 版 (WSL) 內執行的 Linux 行程互動。 本文概述其運作方式,以及如何開始使用它們。
WSL 外掛程式提供下列核心功能:
- 允許應用程式指定啟動 WSL 虛擬機時啟動的 Windows 可執行檔
- Windows 可執行檔可以在 WSL 內建立 Linux 進程,而且可以使用虛擬化套接字直接與它們通訊
使用這些應用程式,Windows 應用程式可以建置在 WSL 體驗之上,並提供與 Windows 子系統 Linux 版 相關的其他功能。
身為 WSL 外掛程式建立者,您可以將登錄機碼設定為指向外掛程式的 DLL 檔案,在電腦上安裝外掛程式。
身為 WSL 使用者,您使用的任何應用程式都會在其一般安裝程式中自動安裝 WSL 外掛程式。
若要啟動外掛程式專案,您必須建置 Win32 dll。 最簡單的方式就是嘗試我們的 WSL 外掛程式範例專案。 您可以將 WSL 外掛程式範例存放庫複製到本機資料夾,git clone
並在 Visual Studio 中開啟。
當您開啟專案時,請瀏覽至 dllmain.cpp
檔案 (https://github.com/microsoft/wsl-plugin-sample/blob/main/plugin.cpp),您會看到 WSL 外掛程式可用的函式清單。
然後,您可以按 [建置] 索引標籤並建置您的專案,這會輸出可供您使用的 DLL,很可能在 下方 wsl-plugin-sample\x64\Debug\WSLPluginSample.dll
。
WSL 外掛程式只有在數位簽署時才會執行。 若要測試這項功能,您必須在機器上啟用測試簽署。
開啟提升權限的 PowerShell 視窗,並 執行下列命令來啟用測試簽署 :
## If this command results in "The value is protected by Secure Boot policy and cannot be modified or deleted"
## Then reboot the PC, go into BIOS settings, and disable Secure Boot. BitLocker may also affect your ability to modify this setting.
Bcdedit.exe -set TESTSIGNING ON
一旦啟用測試簽署(可能需要重新啟動),在已提升許可權的 Powershell 命令提示字元中,位於上方所建立WSLPluginSample.dll檔案的目錄中,我們將建立 WSL 測試憑證:
# Create the cert
$certname = "WSLPluginTestCert"
$cert = New-SelfSignedCertificate -Subject "CN=$certname" -CertStoreLocation "Cert:\CurrentUser\My" -KeyExportPolicy Exportable -KeySpec Signature -KeyLength 2048 -KeyAlgorithm RSA -HashAlgorithm SHA256 -Type CodeSigningCert
# Export it to a local path
Export-Certificate -Cert $cert -FilePath ".\$certname.cer"
# Sign the DLL file
Set-AuthenticodeSignature -FilePath "C:\dev\Path\To\Your\WSLPlugin.dll" -Certificate $cert
最後將憑證匯入至受信任的跟證書授權單位:
certutil -addstore "Root" ".\$certname.cer"
如需詳細資訊,請參閱如何建立自我簽署憑證文件頁面。
在相同提升許可權的 PowerShell 視窗中,執行下列命令來安裝外掛程式,並確定將外掛程式 DLL 的路徑變更為現有的路徑:
Reg.exe add HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Lxss\Plugins /v demo-plugin /t REG_SZ /d C:\Path\to\plugin.dll /f
若要使用外掛程式,請透過下列方式重新啟動 wsl 服務:
sc.exe stop wslservice
wsl.exe echo “test”
您的外掛程式現在應該會載入。 如需外掛程式無法載入的詳細資訊,請參閱疑難解答和其他資訊一節。
然後當您完成時,您可以執行此命令來移除外掛程式(請記住,您必須重新啟動 WSL 服務才能生效):
Reg.exe delete HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Lxss\Plugins /v demo-plugin
常見的錯誤碼:
- Wsl/Service/CreateInstance/CreateVm/Plugin/ERROR_MOD_NOT_FOUND -> 無法載入外掛程式 DLL。 檢查外掛程式註冊路徑是否正確
- Wsl/Service/CreateInstance/CreateVm/Plugin/TRUST_E_NOSIGNATURE -> 外掛程式 DLL 未簽署,或計算機不信任其簽章
- 請 啟用測試簽署 ,並參閱 上面關於如何設定測試憑證的簽署一節。
- Wsl/Service/CreateInstance/CreateVm/Plugin/* -> 外掛程式 DLL 在 WSLPLUGINAPI_ENTRYPOINTV1 或 OnVmStarted 中傳回錯誤
- Wsl/Service/CreateInstance/Plugin/* -> 外掛程式 DLL 在 OnDistributionStarted 中傳回錯誤()
透過 ExecuteBinary() 建立的 Linux 進程將會在 WSL2 虛擬機的根命名空間中執行。 此命名空間與任何散發無關,而且具有極簡的 Mariner 根文件系統。
該文件系統是可寫入的 tmpfs,這表示當 WSL2 虛擬機關閉時,將會卸除對它所做的所有變更。
您可以在 WSL 執行時執行 wsl --debug-shell
,以檢查根命名空間的內容。
- 所有 WSL 外掛程式勾點都是同步的,這表示 WSL 會在繼續之前等待外掛程式攔截完成。
- WSL 會將外掛程式傳回的任何錯誤視為嚴重錯誤(這表示使用者的散發套件不會啟動)
- 外掛程式程式代碼會在與 WSL 服務相同的位址空間中執行。 外掛程式中的任何損毀都會損毀整個 WSL 服務,可能會導致數據遺失