我最近嘗試在 Windows (WSL2) 上安裝 Ubuntu。我嘗試了該free
命令,並且使用了很少的交換記憶體區塊。我想減少交換性,所以我vm.swappiness=10
在 中新增了條目/etc/sysctl.conf
。我嘗試重新加載sysctl.conf
,似乎有效,但是當我嘗試關閉 WSL 並啟動新會話時,swappiness 被重置為預設值 60。
WSL2 上的 Ubuntu 是否會覆蓋此設定以使其再次變為 60?
答案1
/etc/sysctl.conf
通常在 Ubuntu 中啟動時由 Systemd 解析(我相信是透過systemd-sysctl.service
)。自從WSL不使用Systemd,當您關閉並重新啟動 WSL 子系統時,它不會被「處理」。這與我在回答中所描述的類似這個堆疊溢位問題(現在無需閱讀,但如果您需要的話,它有更多詳細資訊)。
解決方案(也正如我在該特定答案中所描述的那樣)是使用kernelCommandLine
WSL2 核心的設定:
在您的 Windows
%userprofile%
目錄(通常)中使用以下內容C:\Users\<username>
建立或編輯檔案:.wslconfig
[wsl2] kernelCommandLine = "sysctl.vm.swappiness=10"
在 WSL(以及任何其他 WSL 實例)上退出 Ubuntu
wsl --shutdown
從 PowerShell、CMD 或開始功能表發出重新開始
您應該發現vm.swappiness
現在仍然存在。請注意,由於所有 WSL2 會話共享相同的內核,因此該選項將全域生效。無論您如何設定交換性(或任何核心參數),情況都是如此。
另請注意,該 Stack Overflow 問題的 OP 至少早在 Windows 10 build 18363 就已經對此進行了測試。
其他替代方案
我相信該.wslconfig
選項可能最適合此目的,但您也可以:
/etc/wsl.conf
與使用[boot]
Windows 11 上的部分強制sysctl
在每次啟動時執行。- 使用您的用戶設定檔手動運行它。如果您走這條路,請使用類似的方法
wsl.exe -u root sysctl --system
來避免輸入密碼或設定sudoers
。