WSL那些事

这篇文章主要是记录我对于wsl的一些问题,然后去中文互联网上搜搜不到或者搜到但是感觉很抽象看不懂的东西,于是就一边问AI一边解决问题的总结

如何共存同一个版本的系统

步骤概览

  1. 下载 Ubuntu 22.04 安装包

  2. 解压安装包到新目录

  3. 注册为新的 WSL 发行版(实例)

  4. 首次启动初始化系统

  5. (可选)修改发行版默认用户名

相关命令

wsl -l -v #看有几个WSL实例的

wsl --import Ubuntu22-Custom D:\WSL\Ubuntu22-Custom .\ubuntu22-rootfs\install.tar.gz --version 2 #导入镜像的

wsl --import <发行版名称> <安装路径> <根文件系统路径> [--version 2] #用wsl.exe注册ubuntu

.\ubuntu2204.exe config --default-user yourname #设置默认用户的

ubuntu.exe是什么?

微软官方提供的 Ubuntu 发行版的“启动器”和“管理工具”,它主要负责:

  1. 启动 Ubuntu WSL 实例

    • 运行 ubuntu.exe 等同于执行 wsl -d <默认实例名>,帮你启动 Ubuntu 子系统。
    • 它会连接到对应的 WSL 实例(通过注册表里绑定的发行版名称),启动 Linux 终端环境。
  2. 管理配置

    • 支持配置默认用户:

      ubuntu.exe config --default-user <用户名>
      

      该命令设置以后,打开这个发行版时会以指定用户身份登录。

    • 还可以做其他发行版相关的管理工作,比如重置实例(不同版本的 ubuntu.exe 功能可能不完全相同)。

  3. 是 Windows 端的启动工具,不是 Linux 本身

    • 它不是 Linux 系统,也不是内核。
    • 是微软对 Ubuntu WSL 发行版封装的辅助程序,方便用户启动和管理。
  4. 绑定特定实例

    • 每个 ubuntu.exe 绑定一个固定的实例(即注册表里的 DistributionName),所以如果你有多个 Ubuntu 实例,每个实例对应一个或多个启动器(比如商店安装的和你自己解包的)。

wsl.exe和ubuntu.exe的区别

功能 wsl.exe ubuntu.exe
启动 WSL 发行版 支持所有已安装的 WSL 实例 只启动绑定的那个 Ubuntu 实例
管理实例(默认用户、版本等) 支持(但默认用户设置需要用特殊方法) 支持(如 config --default-user
导入/导出发行版 支持 不支持
支持发行版列表管理 支持 不支持
发行版无关 是(跨所有 WSL 发行版通用) 否(只能管自己绑定的 Ubuntu)

wsl.exe 是管理所有 WSL 的“万能钥匙”,功能全面但命令多;

ubuntu.exe 是专为 Ubuntu 设计的“专用钥匙”,简洁便捷,适合快速启动和配置单个发行版。

ubuntu.exe是如何确认目标实例的

上文中说到ubuntu.exe是Ubuntu 发行版的“启动器”和“管理工具”,具体如何管理呢.
答案是:ubuntu.exe 是通过 Windows 注册表中定义的别名(distribution name)来定位它所管理的 WSL 实例的。

也就是它内部写死绑定了一个 DistributionName,如 Ubuntu-22.04

可以使用strings.exe ubuntu.exe | findstr /i ubuntu来查看绑定了哪个系统.从这个指令可以看出,确实是硬编码到应用程序了

通过wsl.exe注册(安装)ubuntu[重点]

这里AI-Ubuntu22是我自己定义的名字,本来是用来打算学深度学习的

  1. 首先下载Ubuntu 22.04 WSL 安装包(Appx)

    • 访问官方链接下载 .appx.tar.gz 安装包:

    👉 Ubuntu 22.04 下载地址(Microsoft Store CDN):

    注意:每一步解压都要把对应的文件后缀改成zip等可以解压的格式才行.

    .AppxBundle 是一个 Microsoft Store 多架构应用包,里面包含多个 .appx 子包和资源(如 ARM64、x64、语言包等),不能直接用于安装 WSL 发行版或提取 rootfs。

    如何得到install.tar.gz:

    → 解出多个 .appx 子包(不同架构、缩放、语言)
        → 找到 x64 对应的那个(Ubuntu_2204.1.7.0_x64.appx)
            → 解包这个 .appx 才能拿到 install.tar.gz
    
  2. 使用命令:

    wsl --import <发行版名称> <安装路径> <根文件系统路径> [--version 2]
    
    <发行版名称>:你自定义的新名称(如 AI-Ubuntu22)
    
    <安装路径>:你希望它存放的位置(比如 E:\wsl\AI-Ubuntu22)
    
    <根文件系统路径>:你准备的 .tar.gz 或 .tar 文件(如 .\ubuntu22-rootfs\install.tar.gz)
    
    --version 2(可选):指定使用 WSL 2(推荐)
    

    示例命令:

    wsl --import AI-Ubuntu22 E:\wsl\AI-Ubuntu22 .\ubuntu22-rootfs\install.tar.gz --version 2
    

    这会导入一个名为 AI-Ubuntu22 的 WSL 发行版,并安装在 E:\wsl\AI-Ubuntu22 文件夹中。

  3. 安装完成之后可以用wsl -d AI-Ubuntu22启动

    由于导入后的 WSL 实例初次运行默认用户是 root。所以要设置默认用户(比如设置为 r0xy),

    • 打开 WSL 并添加你想要的默认用户(如果还没有的话)wsl -d AI-Ubuntu22 --user root

      然后在 WSL 中添加新用户:

      adduser yourusername
      usermod -aG sudo yourusername
      
    • 查询该用户的 UID

    id -u yourusername
    

    假设返回的是 1000

    • 修改注册表

      • 打开注册表编辑器

        Win+R 输入 regedit 回车

      • 定位到路径

        HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Lxss
        
      • 每个子项对应一个已安装的 WSL 实例,要找到 DistributionName 是 你设置的名字 的那个子项。

      • 在该子项下,新建或修改 DWORD 值

        名称:DefaultUid

        类型:DWORD (32位)

        数值:你的 UID(例如 1001),十进制输入(不要输入十六进制)

      • 关闭注册表。

    • 测试

      在 PowerShell 运行wsl -d AI-Ubuntu22,这时应该就会直接以指定的用户登录 WSL,而不是 root 了。

  4. 添加到shell的标签页中

    新建一个配置文件,然后把这两个地方修改一下就可以了

    image-20250804202758080

通过wsl --import安装能否使用ubuntu.exe启动

不可以.

通过 wsl --import 导入的实例:

  • 没有自动生成对应的 ubuntu.exe 启动器
  • 只能通过 wsl -d AI-Ubuntu22 这种通用命令启动;
  • 可以用 Windows Terminal、新建快捷方式等调用 wsl -d AI-Ubuntu22 启动。

ubuntu.exe 启动器的特点:

  • 是微软商店官方 Ubuntu 发行版捆绑提供的;
  • 绑定了一个固定的实例名(比如 Ubuntu-22.04),专门用来启动和管理那个实例;
  • 你自己导入的实例没有对应官方的 ubuntu.exe,除非你自己手动拿它的启动器文件(即解包出来的那个 ubuntu.exe)放在一起用。

这里举个栗子

下面是我把解包之后的ubuntu.exe和import导入后的文件放在一个文件夹里面,但是我使用.\ubuntu.exe config --default-user指令缺报错.

strings.exe ubuntu.exe | findstr /i ubuntu什么都没有就意味着ubuntu.exe 没有绑定到导入的那个实例,也就无法用ubuntu.exe来管理这个系统了

如果想用 ubuntu.exe 启动器和配置,必须用它自带的 ubuntu.exe install 方式重新安装注册实例。

PS E:\wsl\AI-Ubuntu22> dir


    目录: E:\wsl\AI-Ubuntu22


Mode                 LastWriteTime         Length Name
----                 -------------         ------ ----
-a----          2025/8/4     19:06     1167065088 ext4.vhdx
-a----        2022/10/26     17:26         595968 ubuntu.exe


PS E:\wsl\AI-Ubuntu22> .\ubuntu.exe config --default-user root
Installing, this may take a few minutes...
WslRegisterDistribution failed with error: 0x80070002
Error: 0x80070002 ???????????

PS E:\wsl\AI-Ubuntu22> .\ubuntu.exe config --default-user r0xy
Installing, this may take a few minutes...
WslRegisterDistribution failed with error: 0x80070002
Error: 0x80070002 ???????????

PS E:\wsl\AI-Ubuntu22> strings.exe ubuntu.exe | findstr /i ubuntu
posted @ 2025-08-04 20:30  r_0xy  阅读(51)  评论(0)    收藏  举报