Windows 應用程式現在可以建立 Linux 子系統內部執行的 Linux 進程,並與 WSL 外掛程式互動。 本文概述其運作方式,以及如何開始使用它們。
瞭解外掛程式功能
WSL 外掛程式提供下列核心功能:
- 允許應用程式指定啟動 WSL 虛擬機時啟動的 Windows 可執行檔
- Windows 可執行檔可以在 WSL 內建立 Linux 進程,而且可以使用虛擬化套接字直接與它們通訊
使用這些應用程式,Windows 應用程式可以建置在 WSL 體驗之上,並提供與適用於 Linux 的 Windows 子系統相關的其他功能。
安裝外掛程式
身為 WSL 外掛程式建立者,您可以將登錄機碼設定為指向外掛程式的 DLL 檔案,在電腦上安裝外掛程式。
身為 WSL 使用者,您使用的任何應用程式都會在其一般安裝程式中自動安裝 WSL 外掛程式。
建立您自己的外掛程式
若要啟動外掛程式專案,您必須建置 Win32 dll。 最簡單的方式就是嘗試我們的 WSL 外掛程式範例專案。 您可以將 WSL 外掛程式範例存放庫 複製到本機資料夾, git clone 並在 Visual Studio 中開啟。
當您開啟專案時,請瀏覽至 dllmain.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
最後一步將憑證匯入至受信任的根憑證授權單位:
Import-Certificate -FilePath ".\$certname.cer" -CertStoreLocation Cert:\LocalMachine\Root"
如需詳細資訊,請參閱 如何建立自我簽署憑證 文件頁面。
安裝外掛程式
在相同提升許可權的 PowerShell 視窗中,執行下列命令來安裝外掛程式,並確定將外掛程式 DLL 的路徑變更為現有的路徑:
Set-ItemProperty -Path "HKLM:\SOFTWARE\Microsoft\Windows\CurrentVersion\Lxss\Plugins" -Name "demo-plugin" -Value "C:\Path\to\plugin.dll" -Force
若要使用外掛程式,請透過下列方式重新啟動 wsl 服務:
Stop-Service -Name "wslservice" -Force
wsl.exe echo "test"
您的外掛程式現在應該已載入。 如需外掛程式無法載入的詳細資訊,請參閱 疑難解答和其他資訊 一節。
然後當您完成時,您可以執行此命令來移除外掛程式(請記住,您必須重新啟動 WSL 服務才能生效):
Remove-ItemProperty -Path "HKLM:\SOFTWARE\Microsoft\Windows\CurrentVersion\Lxss\Plugins" -Name "demo-plugin" -Force
疑難解答和其他資訊
常見的錯誤碼:
- 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 中傳回錯誤()
Linux 使用者空間中的外掛
透過 ExecuteBinary() 建立的 Linux 進程將會在 WSL2 虛擬機的根命名空間中執行。 此命名空間未關聯到任何發行版,並且具有一個非常簡化的以 Mariner 為基礎的根文件系統。
該文件系統是可寫入的 tmpfs,這表示當 WSL2 虛擬機關閉時,將會卸除對它所做的所有變更。
您可以在 WSL 執行時執行 wsl --debug-shell ,以檢查根命名空間的內容。
其他考慮
- 所有 WSL 外掛程式掛鉤都是同步的,這表示 WSL 會在繼續之前等待外掛程式掛鉤完成。
- WSL 會將插件傳回的任何錯誤視為致命錯誤,也就是說,使用者的發行版本不會啟動。
- 外掛程式程式代碼會在與 WSL 服務相同的位址空間中執行。 外掛程式中的任何損毀都會損毀整個 WSL 服務,可能會導致數據遺失