解决WSL2网络和存储问题

背景

之前在电脑上折腾了WSL2(https://notes.z-dd.online/2023/11/07/WSL2%E7%9B%B8%E5%85%B3/),还存在2个不严重但很重要的问题:

  • 网络配置问题,主要是不能从外部局域网访问wsl网络,这使得用板子没法挂载wsl里的nfs和使用tftp,网上有些间接的办法解决了这个问题,但很麻烦,懒得去折腾
  • 内存占用和硬盘存储不能自动回收,就像VirtualBox和VMWare的虚拟硬盘文件一样,会不断扩大,只能手动回收。

新的 23H2 系统版本已经直接解决了上面的问题,但我的系统一直未收到相应的正式版的更新推送。
也懒得去折腾预览版,所以就一直将就地在用,最近刚好收到了更新,于是就弄了弄。

步骤

  1. 更新系统版本到 23H2,这是最重要的步骤和前提

  2. 更新wsl版本

    wsl --update --pre-release
  3. 修改配置
    在 %userprofile%.wslconfig 中写入以下内容然后保存:

    [experimental]
    # 可以在 gradual 、dropcache 、disabled 之间选择
    autoMemoryReclaim=gradual 
    networkingMode=mirrored
    dnsTunneling=true
    firewall=true
    autoProxy=true
    sparseVhd=true

    这样WSL2 和 Windows 主机的网络互通而且 IP 地址相同了,就不需要桥接网络,端口转发等操作了。

  4. 然后启用稀疏 VHD 允许 WSL2 的硬盘空间自动回收,运行如下命令:

    wsl --manage 发行版名字 --set-sparse true 

    发行版名可使用命令 wsl -l -v 查看

扩展: wsl2配置文件.wslconfig

使用 .wslconfig 为 WSL 上运行的所有已安装的发行版配置全局设置。

默认情况下,.wslconfig 文件不存在。 它必须创建并存储在%UserProfile%目录中才能应用这些配置设置。
用于在作为 WSL 2 版本运行的所有已安装的 Linux 发行版中全局配置设置。
只能用于 WSL 2 运行的发行版。 作为 WSL 1 运行的发行版不受此配置的影响,因为它们不作为虚拟机运行。
要访问 %UserProfile% 目录,请在 PowerShell 中使用 cd ~ 访问主目录(通常是用户配置文件 C:\Users<UserName>),或者可以打开 Windows 文件资源管理器并在地址栏中输入 %UserProfile%。 该目录路径应类似于:C:\Users<UserName>.wslconfig。
WSL 将检测这些文件是否存在,读取内容,并在每次启动 WSL 时自动应用配置设置。 如果文件缺失或格式错误(标记格式不正确),则 WSL 将继续正常启动,而不应用配置设置。

参考

https://zhuanlan.zhihu.com/p/657110386
https://learn.microsoft.com/zh-cn/windows/wsl/wsl-config
https://devblogs.microsoft.com/commandline/windows-subsystem-for-linux-september-2023-update/