WSL 2 + Ubuntu 24.04 安装
何时使用
- 用户要在 Windows 上从零安装 WSL、安装 Ubuntu 24.04,或准备 Linux 编译环境。
- WSL 安装卡在下载;导入后是 root 没有 sudo;内存被吃爆拖死 Windows;C 盘被虚拟磁盘撑满。
何时不用
- 已有可用发行版,只是要装某个软件:直接进发行版操作,不走本文。
- 需要 GPU / CUDA 直通、systemd 服务编排:本文不覆盖,另行处理。
三条硬规则
- 启用 Windows 功能、安装或迁移发行版需要管理员 PowerShell;提示重启就重启,不重启
wsl会继续报「未安装」。 - 发行版和源码放非系统盘;源码放
~,不要放/mnt/d,跨 9p 访问慢 5 到 10 倍。 - 每步都有验证命令。输出不符就先排查,不要连着往下跑。
第 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不可撤销。
微信扫一扫