← Back to skills
extension
Category: Development & EngineeringAPI key requirement unconfirmed

WSL Ubuntu 24.04 安装助手

在 Windows 上从零安装 WSL 2 与 Ubuntu 24.04:前置检查、商店直装与阿里云根文件系统导入两条路线、迁移到非系统盘、限制内存与 CPU、安装编译依赖、十条验收清单。

personAuthor: Ninesun66hubOpenAPI

WSL 2 + Ubuntu 24.04 安装

何时使用

  • 用户要在 Windows 上从零安装 WSL、安装 Ubuntu 24.04,或准备 Linux 编译环境。
  • WSL 安装卡在下载;导入后是 root 没有 sudo;内存被吃爆拖死 Windows;C 盘被虚拟磁盘撑满。

何时不用

  • 已有可用发行版,只是要装某个软件:直接进发行版操作,不走本文。
  • 需要 GPU / CUDA 直通、systemd 服务编排:本文不覆盖,另行处理。

三条硬规则

  1. 启用 Windows 功能、安装或迁移发行版需要管理员 PowerShell;提示重启就重启,不重启 wsl 会继续报「未安装」。
  2. 发行版和源码放非系统盘;源码放 ~,不要放 /mnt/d,跨 9p 访问慢 5 到 10 倍。
  3. 每步都有验证命令。输出不符就先排查,不要连着往下跑。

第 1 步 前置检查

管理员 PowerShell:

winver
(Get-CimInstance Win32_ComputerSystem).HypervisorPresent
Get-PSDrive | Select-Object Name,@{n='FreeGB';e={[math]::Round($_.Free/1GB)}}

| 检查 | 期望 | | --- | --- | | Windows build | 19041 以上 | | HypervisorPresent | True | | 目标盘空闲 | 60 GB 以上 |

HypervisorPresent 为 False 且后续安装报 0x80370102,才需要重启进 BIOS 打开 Intel VT-x / VT-d。为 False 但没有报错时先继续,不必进 BIOS。

第 2 步 安装

路线 A:网络正常,商店直装

wsl --install -d Ubuntu-24.04

重启电脑。重启后会弹出 Ubuntu 窗口要求建账号:

  • 用户名只能小写字母和数字,不要中文、不要大写。
  • 密码输入时不显示字符,这是正常的。
  • 这个密码就是 sudo 密码。

验证:

wsl -l -v

期望 VERSION 为 2。为 1 时执行 wsl --set-version Ubuntu-24.04 2。

路线 B:国内网络,下载慢或被墙

先说结论:wsl --install -d Ubuntu-24.04 没有国内镜像。镜像站只镜像 apt 源和 ISO,不镜像商店分发的发行版包。不要在清华、阿里云、华为云之间反复找。

判断卡在哪一步:

| 卡住的位置 | 用哪条路线 | | --- | --- | | 「正在下载: Ubuntu 24.04 LTS」 | B | | 「正在安装: 适用于 Linux 的 Windows 子系统」 | C 然后 B |

路线 B 是只装运行时,发行版改用根文件系统导入,下载量从几百 MB 降到 30 MB 左右。

第 1 步,管理员 PowerShell 只装运行时:

wsl --install --no-distribution

重启后确认:

wsl --version

第 2 步,下载根文件系统。文件名随小版本更新,先列目录确认当前名字:

New-Item -ItemType Directory -Force D:\wsl | Out-Null
Invoke-WebRequest `
  -Uri https://mirrors.aliyun.com/ubuntu-cdimage/ubuntu-base/releases/24.04/release/ `
  -OutFile D:\wsl\listing.html
(Select-String -Path D:\wsl\listing.html -Pattern 'ubuntu-base-24\.04[^\x22]*amd64\.tar\.gz').Matches.Value | Select-Object -Unique

拿到确切文件名后下载,并把同目录的 SHA256SUMS 一起下载比对:

$u = 'https://mirrors.aliyun.com/ubuntu-cdimage/ubuntu-base/releases/24.04/release/'
Invoke-WebRequest -Uri "$u<SHA256SUMS 里的文件名>.tar.gz" -OutFile D:\wsl\ubuntu-base.tar.gz
Invoke-WebRequest -Uri "${u}SHA256SUMS" -OutFile D:\wsl\SHA256SUMS
$h = (Get-FileHash D:\wsl\ubuntu-base.tar.gz -Algorithm SHA256).Hash.ToLower()
Select-String -Path D:\wsl\SHA256SUMS -Pattern $h

第三行有输出才算下载完整,否则重下。

第 3 步,导入。目标目录必须不存在,WSL 会自己建:

wsl --import Ubuntu-24.04 D:\wsl\Ubuntu-24.04 D:\wsl\ubuntu-base.tar.gz --version 2
wsl -l -v

第 4 步,初始化。ubuntu-base 是极简根文件系统,默认 root、没有 sudo、没换源,按顺序执行:

wsl -d Ubuntu-24.04

cat > /etc/apt/sources.list.d/ubuntu.sources <<'EOF'
Types: deb
URIs: https://mirrors.aliyun.com/ubuntu/
Suites: noble noble-updates noble-backports noble-security
Components: main restricted universe multiverse
Signed-By: /usr/share/keyrings/ubuntu-archive-keyring.gpg
EOF

apt update
apt install -y sudo locales tzdata ca-certificates
adduser <用户名>
usermod -aG sudo <用户名>
printf '[user]\ndefault=<用户名>\n' > /etc/wsl.conf
timedatectl set-timezone Asia/Shanghai
locale-gen en_US.UTF-8

退出,执行 wsl --shutdown,再进 wsl -d Ubuntu-24.04,whoami 应返回普通用户名。

ubuntu-base 与商店版的差别:没有预装编辑器、没有 systemd 配置、没有首次启动向导。对编译环境没有影响,第 5 步装完依赖就补齐。

路线 C:运行时本身也慢

运行时 MSI 走 GitHub,同样可能慢。打开 https://github.com/microsoft/WSL/releases/latest 下载 wsl.<版本>.0.x64.msi,装完 wsl --version 确认。用第三方加速站时必须核对官方发布页的 SHA256,否则等于从陌生人手里装系统组件。

第 3 步 资源封顶

WSL2 默认最多占用一半内存,编译时会把 Windows 拖死。新建 %USERPROFILE%\.wslconfig:

[wsl2]
memory=24GB
processors=10
swap=16GB
swapFile=D:\\wsl\\swap.vhdx

[experimental]
autoMemoryReclaim=gradual
sparseVhd=true

取值规则:

| 项 | 取法 | 原因 | | --- | --- | --- | | memory | 物理内存减去 8 GB 左右 | 留给 Windows 和浏览器 | | processors | 物理核数减去 4 | 保证 Windows 仍可响应 | | swap | 16 GB 或物理内存的一半 | 链接阶段防止 OOM 直接杀进程 | | swapFile | 非系统盘 | 别让交换文件挤系统盘 | | autoMemoryReclaim | gradual | Linux 闲置时把内存还给 Windows | | sparseVhd | true | 虚拟磁盘按实际占用增长 |

生效并验证:

wsl --shutdown
wsl -d Ubuntu-24.04
free -h        # total 接近 memory 设定值
nproc          # 等于 processors 设定值
swapon --show  # 能看到 swapFile 对应大小

配置没生效,九成是文件名存成了 .wslconfig.txt,或文件带了 UTF-8 BOM。

第 4 步 迁移到非系统盘

默认落在 C:\Users\<用户>\AppData\Local\Packages\...,一个发行版加编译产物能吃掉 40 GB 以上。在装任何东西之前挪走,代价最小。

wsl --shutdown
wsl --manage Ubuntu-24.04 --move D:\wsl\Ubuntu-24.04
wsl -l -v

目标目录必须不存在;不先 --shutdown 会提示发行版正在运行。

--manage 报「无法识别的参数」时先 wsl --update。仍不支持就用导出再导入,导入后默认用户会变成 root,必须补一步:

wsl --export Ubuntu-24.04 D:\wsl\ubuntu.tar
wsl --unregister Ubuntu-24.04
wsl --import Ubuntu-24.04 D:\wsl\Ubuntu-24.04 D:\wsl\ubuntu.tar --version 2

进入后建 /etc/wsl.conf 写 [user] 段的 default=<用户名>,wsl --shutdown 再进,whoami 确认。确认无误后删掉 ubuntu.tar。

第 5 步 基础依赖

Ubuntu 里:

sudo apt update && sudo apt full-upgrade -y
sudo timedatectl set-timezone Asia/Shanghai

sudo apt install -y git wget curl rpm rpm2cpio cpio make build-essential \
  binutils m4 file python3 libaio1t64

sudo apt install -y htop tmux unzip jq tree ripgrep

libaio1t64 是 24.04 的包名,22.04 上叫 libaio1。装错会提示「无法定位软件包」。

Git 身份让用户提供自己的 GitHub 姓名与邮箱,不要猜:

git config --global user.name "<GitHub 用户名>"
git config --global user.email "<GitHub 邮箱>"
git config --global core.autocrlf input
git config --global init.defaultBranch master

Linux 侧用 input,与 Windows 侧的 true 不同;否则提交的 diff 会带一堆换行噪音。

验证:

gcc --version | head -1      # 24.04 上是 13.3.0
python3 --version            # 24.04 上是 3.12.x
ldd --version | head -1      # glibc 2.39

第 6 步 验收

| # | 命令 | 在哪执行 | 期望 | | --- | --- | --- | --- | | 1 | wsl -l -v | PowerShell | 发行版存在,VERSION 为 2 | | 2 | free -h | Ubuntu | total 接近 memory 设定值 | | 3 | nproc | Ubuntu | 等于 processors 设定值 | | 4 | swapon --show | Ubuntu | 有对应大小的 swap | | 5 | df -h / | Ubuntu | 容量来自非系统盘虚拟磁盘 | | 6 | gcc --version | Ubuntu | 13.3.0 | | 7 | python3 --version | Ubuntu | 3.12.x | | 8 | dpkg -l libaio1t64 | Ubuntu | 已安装 | | 9 | git config --global user.email | Ubuntu | 用户自己的邮箱 | | 10 | whoami | Ubuntu | 普通用户,不是 root |

故障排查

| 现象 | 原因 | 处理 | | --- | --- | --- | | wsl --install 报 0x80370102 | BIOS 没开虚拟化 | 重启进 BIOS 开 Intel VT-x / VT-d | | wsl --install -d Ubuntu-24.04 下载很慢 | 商店分发,无国内镜像 | 走第 2 步路线 B | | 导入后是 root 且没有 sudo | ubuntu-base 是极简根文件系统 | 走第 2 步路线 B 第 4 步 | | 装完仍提示 WSL 未安装 | 没重启 | 重启电脑 | | 内存不是设定值 | .wslconfig 没生效 | 检查路径、.txt 后缀、BOM,再 wsl --shutdown | | 内存够了但一编译就卡死 Windows | 处理器给多了 | 把 processors 降到 8 | | Ubuntu 里访问 C:\ 很慢 | 9p 文件系统 | 正常,源码和构建都放 ~/ | | 启动后停在 /mnt/c/WINDOWS/system32 | 继承了 Windows 当前目录 | 用 wsl ~ 进 home,或改终端起始目录 | | apt update 卡在 archive.ubuntu.com | 线路或 DNS | 换源后重试 | | 时间比 Windows 慢几分钟 | WSL 时钟漂移 | 先 sudo hwclock -s,报 Cannot access the Hardware Clock 时用 wsl --shutdown 重开 | | 虚拟磁盘只涨不缩 | vhdx 不会自动回收 | 开 sparseVhd=true;已膨胀的用 wsl --manage Ubuntu-24.04 --set-sparse true | | 端口冲突 | Windows 与 WSL 共用 localhost | 改 WSL 内服务端口 |

收尾与回滚

  • 备份发行版:wsl --export Ubuntu-24.04 D:\wsl\backup-<日期>.tar。
  • 释放内存:wsl --shutdown;重新进入用 wsl -d Ubuntu-24.04。
  • 删除发行版前先导出,wsl --unregister 不可撤销。
<!-- OB-S:d7kLFjxrrp8CbnIDDQsbvQ -->