说明:仅供学习使用,请勿用于非法用途,若有侵权,请联系博主删除

作者:zhu6201976

1. 起因:一次“听信” AI 的盲目升级

今天在折腾 WSL 环境时,咨询 AI 得到的回复是:

“升级 wsl --update 不仅不会影响 Docker 的运行,反而通常是 Docker 官方推荐的维护操作,因为 Docker Desktop 的性能和稳定性高度依赖于 WSL 2 内核的最新版本。”

听起来很专业、很合理对吧?于是我顺手一个 wsl --update

2. 翻车:2.6.3.0 版本的“死亡之吻”

升级完成后,wsl --version 显示版本号为 2.6.3.0。看起来挺新,结果一进系统,灾难发生了:

  • 执行 docker image ls 直接卡死,没有任何响应。

  • 容器启动极其缓慢,甚至频繁掉线。

  • 整个开发环境处于半瘫痪状态。

事实证明: 2.6.3.0 这种处于 Windows Insider 渠道的预览版(Pre-release)存在严重的兼容性 Bug,尤其是对于高度依赖 vSock 和虚拟化层的 Docker 来说,简直是噩梦。

3. 救砖:绕了一大圈,最后还得靠自己

发现问题后,我试图降级。AI 给我推了一堆复杂的方案:什么 Remove-AppxPackage、什么注销分发版、甚至让我手动删注册表。不仅操作复杂,而且根本卸载不干净,版本号始终跳不回稳定版。

真相大白: 求人不如求己,我直接运行了 wsl --help。原来最标准的答案就在命令说明里:

C:\Users\Tesla>wsl --help
版权所有 (c) Microsoft Corporation。保留所有权利。
有关此产品的隐私信息,请访问 https://aka.ms/privacy。

用法: wsl.exe [Argument][Options...][CommandLine]

运行 Linux 二进制文件的参数:

    如果未提供命令行,wsl.exe 将启动默认 shell。

    --exec, -e <CommandLine>
        在不使用默认 Linux shell 的情况下执行指定的命令。

    --shell-type <standard|login|none>
        使用提供的 shell 类型执行指定的命令。

    --
        按原样传递剩余的命令行。

选项:
    --cd <Directory>
        将指定目录设置为当前工作目录。
        如果使用 ~,则将使用 Linux 用户的主路径。如果路径以
        / 字符开始,它将被解释为绝对 Linux 路径。
        否则,该值必须是绝对 Windows 路径。

    --distribution, -d <DistroName>
        运行指定的分发版。

    --distribution-id <DistroGuid>
        运行指定的分发版 ID。

    --user, -u <UserName>
        以指定用户身份运行。

    --system
        为系统分发版启动 shell。

用于管理适用于 Linux 的 Windows 子系统的参数:

    --help
        显示使用情况信息。

    --debug-shell
        出于诊断目的打开 WSL2 调试 shell。

    --install [Distro] [Options...]
        安装适用于 Linux 的 Windows 子系统分发版。
        有关有效分发版的列表,请使用 'wsl.exe --list --online'。

        选项:
            --enable-wsl1
                启用 WSL1 支持。

            --from-file <Path>
                从本地文件安装分发版。

            --legacy
                使用旧分发版清单。

            --location <Location>
                设置分发版的安装路径。

            --name <Name>
                设置分发的名称。

            --no-distribution
                仅安装所需的可选组件,不安装分发版。

            --no-launch, -n
                安装后不要启动分发版。

            --version <Version>
                指定要用于新分发的版本。

            --web-download
                从 Internet 而不是 Microsoft Store 下载分发版。

    --manage <Distro> <Options...>
        更改发行版特定选项。

        选项:
            --move <Location>
                将分发移到新位置。

            --set-sparse, -s <true|false>
                将发行版的 vhdx 设置为稀疏,从而允许自动回收磁盘空间。

            --set-default-user <Username>
                设置分发版的默认用户。

    --mount <Disk>
        在所有 WSL 2 分发版中附加和装载物理磁盘或虚拟磁盘。

        选项:
            --vhd
                指定 <Disk> 引用虚拟硬盘。

            --bare
                将磁盘附加到 WSL2,但不要装载它。

            --name <Name>
                使用装入点的自定义名称装载磁盘。

            --type <Type>
                装载磁盘时要使用的文件系统(如果未指定)默认为 ext4。

            --options <Options>
                其他装载选项。

            --partition <Index>
                要装载的分区的索引(如果未指定)默认为整个磁盘。

    --set-default-version <Version>
        更改新分发版的默认安装版本。

    --shutdown
        立即终止所有正在运行的分发版和 WSL 2
        轻型实用工具虚拟机。

    --status
        显示适用于 Linux 的 Windows 子系统状态。

    --unmount [磁盘]
        从所有 WSL2 分发版中卸载和分离磁盘。
        如果在没有参数的情况下调用,则卸载和分离所有磁盘。

    --uninstall
        从此计算机卸载适用于 Linux 的 Windows 子系统包。

    --update
        更新适用于 Linux 的 Windows 子系统包。

        选项:
            --pre-release
                下载预发行版本(如果可用)。

    --version, -v
        显示版本信息。

用于在适用于 Linux 的 Windows 子系统中管理分发版的参数:

    --export <Distro> <FileName> [选项]
        将分发版导出到 tar 文件。
        文件名可以是 - for stdout。

        选项:
            --format <Format>
                指定导出格式。支持的值: tar、tar.gz、vhd。

    --import <Distro> <InstallLocation> <FileName> [选项]
        将指定的 tar 文件作为新分发版导入。
        文件名可以是 - for stdin。

        选项:
            --version <Version>
                指定要用于新分发的版本。

            --vhd
                指定所提供的文件是 .vhdx 文件,而不是 tar 文件。
                此操作在指定的安装位置创建 .vhdx 文件的副本。

    --import-in-place <Distro> <FileName>
        将指定的 .vhdx 文件作为新分发版导入。
        必须使用 ext4 文件系统类型设置此虚拟硬盘的格式。

    --list, -l [选项]
        列出分发版。

        选项:
            --all
                列出所有分发版,包括当前
                正在安装或卸载的分发版。

            --running
                仅列出当前正在运行的分发版。

            --quiet, -q
                仅显示分发版名称。

            --verbose, -v
                显示有关所有分发版的详细信息。

            --online, -o
                显示适合通过 'wsl --install' 安装的可用分发版列表。

    --set-default, -s <Distro>
        将分布版设置为默认值。

    --set-version <Distro> <Version>
        更改指定分发版的版本。

    --terminate, -t <Distro>
        终止指定的分发版。

    --unregister <Distro>
        取消注册分发版并删除根文件系统。
  • 卸载核心包: wsl --uninstall 这个命令能彻底卸载掉当前安装的 WSL 应用包(也就是那个坑人的 2.6.3.0 引擎)。

  • 安装陷阱: 如果你用 wsl --install,系统又会默认给你推最新版,绕不出来。

4. 正确的降级方案(硬核干货)

如果你也遇到了类似的问题,别听 AI 瞎指挥,按这个步骤走:

  1. 彻底卸载: 运行 wsl --uninstall。这步只会卸载 WSL 引擎程序,划重点:你的 Docker Image 和 Container 数据都在 VHD 磁盘里,不会丢失!

  2. 寻找稳定版:WSL GitHub Releases 页面,下载公认稳定的版本,例如:Microsoft.WSL_2.4.13.0_x64_ARM64.msixbundle

  3. 手动安装: 直接双击下载好的 .msixbundle 文件。Windows 会弹出安装界面,点击“安装”或“重新安装”。

  4. 验证:

    C:\Users\Tesla>wsl --version
    WSL 版本: 2.4.13.0
    内核版本: 5.15.167.4-1
    WSLg 版本: 1.0.65
    MSRDC 版本: 1.2.5716
    Direct3D 版本: 1.611.1-81528511
    DXCore 版本: 10.0.26100.1-240331-1435.ge-release
    Windows 版本: 10.0.26200.7840
    
    C:\Users\Tesla>wsl -l -v
      NAME                   STATE           VERSION
    * docker-desktop-data    Running         2
      docker-desktop         Running         2

5. 总结与反思

  • 别迷信最新版: 特别是 Windows Insider 渠道推送的预览版,那是给小白鼠测 Bug 用的,生产环境慎用!

  • 数据安全: 幸好 WSL 的引擎和数据是分离的,即使卸载了 WSL 引擎,只要没运行 --unregister,数据就是安全的。

  • AI 建议仅供参考: AI 可能会因为文档滞后或者对特定 Insider 渠道不敏感而误导你。关键时刻,--help 才是最诚实的老师。

差点因为一个版本更新去重装 Docker,那损失的数据和配置成本可就太大了。记录此篇,希望大家引以为戒!

Logo

有“AI”的1024 = 2048,欢迎大家加入2048 AI社区

更多推荐