很多人在 Windows 上第一次装好 WSL,敲下第一行 sudo apt update,就卡在了下载速度上。我从 WSL 1.0 一直用到现在的 2.0,也在这上面栽过不少跟头——看着 apt 一秒几 KB 的进度条,一度怀疑是电脑坏了。折腾过后才发现,默认的 apt 软件源放在境外服务器,从国内访问就是慢,解决办法也很直接:把 apt 的软件源换成国内镜像源。这篇就来完整梳理一遍 WSL 下 apt 换源的原理、步骤和避坑经验,读完你也能在几分钟内搞定,后面装 ROS、CUDA、编译工具链都顺畅不少。想直接动手的朋友,可以从第 2 节的操作部分开始;想搞清楚为什么换源能提速的,建议从头到尾看一遍。
1. 为什么要换apt源:从WSL下的下载困境说起
1.1 apt源的工作机制
apt(Advanced Package Tool)是 Ubuntu 等 Debian 系发行版的包管理工具。它和软件源的关系,有点像手机应用商店和商店服务器——apt 会从配置好的软件源服务器拉取软件包元数据和 deb 安装包。这些源地址通常写在 /etc/apt/sources.list 文件里,或者写在 /etc/apt/sources.list.d/ 目录下的多个文件里。WSL 里的 Ubuntu 默认使用 archive.ubuntu.com、security.ubuntu.com 这些官方源,服务器部署在境外,国内用户访问时的网络链路非常长,晚高峰经常出现连接超时、速度只有几 KB 的情况。WSL 本身又不像宿主机 Windows 那样有各种下载通道,所以 apt 龟速就成了很多人刚上手 WSL 时的第一道坎。
1.2 镜像源为什么能提速
镜像源就是把上游软件源的文件在本地或国内服务器上做一份完整拷贝,每隔几小时到一天自动同步。国内访问这些服务器时,网络路径更短,出口带宽更充裕,所以同样的 apt update 和 apt install 速度能快几十倍。值得注意的是,镜像源不是单独维护了一份修改版软件包,数据内容与官方源几乎一致,只是传输通道变了。所以在 apt 看来,换源只是换了一台软件包服务器,不会影响系统更新和软件安装的兼容性。这就像买同一个牌子的矿泉水,楼下便利店和远处大超市都能进货,只是楼下这家路近、耗油少、拿货快。
1.3 换源前需要确认的四件事
- 确认 Ubuntu 版本:不同版本的软件仓库代号不同,写错代号会导致 404 或依赖错乱,用
lsb_release -a查看。 - 确认是否留存备份:改配置前先把 sources.list 或 ubuntu.sources 复制一份,出错能秒回滚。
- 确认网络可用性:换源后需要用
apt update验证,如果 WSL 连不上外网,再好的镜像源也白搭。 - 确认系统时间:WSL 时钟有时漂移,时间偏差过大会导致 https 证书校验失败,可以先
date看一下。
这几点都是血泪教训换来的。系统时间那条尤其隐蔽,我后面专门讲,它容易让人误以为是源配错了。
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. apt换源全流程:备份、改源、验证
2.1 确认系统版本并备份配置
进入 WSL 终端后,先跑命令:
bash复制lsb_release -a
输出会包括 Distributor ID、Release(比如 22.04、24.04)和 Codename(jammy、noble)。这个 Codename 是配置源的关键字。然后备份:
bash复制sudo cp /etc/apt/sources.list /etc/apt/sources.list.bak
如果是 24.04 或之后的版本,配置文件可能在 /etc/apt/sources.list.d/ubuntu.sources,同样备份一份:
bash复制sudo cp /etc/apt/sources.list.d/ubuntu.sources /etc/apt/sources.list.d/ubuntu.sources.bak
备份这一步很多人觉得多余,真出了问题就知道香了。我第一次改源时没备份,结果把 jammy 写成了 jammmy,apt update 报了一堆 404,最后对着报错抓了半天才反应过来。另外,如果发现 /etc/apt/sources.list 是空文件,别慌,Ubuntu 从某个版本开始已经把默认源配置挪到了 /etc/apt/sources.list.d/ 目录里,先看一眼目录内容再动手。
2.2 替换为国内镜像源
根据系统版本选择对应源。以 Ubuntu 24.04(codename 是 noble)搭配清华源为例,编辑文件:
bash复制sudo nano /etc/apt/sources.list.d/ubuntu.sources
清空后写入以下内容:
code复制Types: deb
URIs: https://mirrors.tuna.tsinghua.edu.cn/ubuntu/
Suites: noble noble-updates noble-backports noble-security
Components: main restricted universe multiverse
Signed-By: /usr/share/keyrings/ubuntu-archive-keyring.gpg
这个格式是 Ubuntu 24.04 开始主推的 deb822 格式。它把原来一行一个仓库的写法,改成了类似 INI 文件的键值对。Types 表示仓库类型,URIs 是镜像地址,Suites 是仓库套件名称,Components 是组件分类,Signed-By 指定用于验证软件包签名的公钥文件。很多人在 22.04 上换过源,换了 24.04 后找不到 /etc/apt/sources.list 能改,其实问题就在这。
如果是 20.04 或 22.04,直接编辑 /etc/apt/sources.list,例如 22.04(jammy)的清华源:
code复制deb https://mirrors.tuna.tsinghua.edu.cn/ubuntu/ jammy main restricted universe multiverse
deb https://mirrors.tuna.tsinghua.edu.cn/ubuntu/ jammy-updates main restricted universe multiverse
deb https://mirrors.tuna.tsinghua.edu.cn/ubuntu/ jammy-backports main restricted universe multiverse
deb https://mirrors.tuna.tsinghua.edu.cn/ubuntu/ jammy-security main restricted universe multiverse
想换阿里云源,把域名换成 mirrors.aliyun.com/ubuntu/ 就行;中科大源对应 mirrors.ustc.edu.cn/ubuntu/;北京师范大学镜像对应 mirrors.bnu.edu.cn/ubuntu/。各家镜像站的同步策略略有差异,但基本覆盖 main、universe、multiverse、restricted 这些核心组件,日常开发够用。一个小提醒:能直接用 https 就用 https,新版 Ubuntu 已经内置 ca-certificates,不需要额外操作;如果遇到证书问题,可以先临时用 http 排障,但长期使用还是建议修复证书问题而不是降级到 http。
2.3 更新软件索引并验证
保存配置文件后,执行:
bash复制sudo apt update
如果输出里不再出现大量 404 或连接超时,并且 Hit / Get 数量正常,说明换源成功。接着建议跑一次升级:
bash复制sudo apt upgrade -y
这一步会把系统缓存中的软件包索引刷新到底,也能顺带验证源里的软件包是否能正常下载安装。初次使用镜像源,可以把更新日志里的速度做个对比,大概率直接从几 KB/s 跳到几 MB/s。如果 apt update 期间出现公钥签名相关报错,先别急,跳到第 3 节看排查方法。另外,升级过程中如果提示是否更新配置文件,我建议看清楚 diff 再选,尤其是 sources.list 这类关键文件,别一路回车把镜像配置又覆盖了。
2.4 动手写一个一键换源脚本
每次重装 WSL 都要去翻配置太麻烦,可以把切换源的逻辑写成一个脚本。这里给个简单的参考,按需修改 MIRROR 变量即可:
bash复制#!/bin/bash
# 简单的一键换源脚本,支持传统sources.list格式
CODENAME=$(lsb_release -cs)
MIRROR="mirrors.tuna.tsinghua.edu.cn/ubuntu/"
sudo cp /etc/apt/sources.list /etc/apt/sources.list.bak 2>/dev/null
sudo tee /etc/apt/sources.list > /dev/null <<EOF
deb https://$MIRROR $CODENAME main restricted universe multiverse
deb https://$MIRROR ${CODENAME}-updates main restricted universe multiverse
deb https://$MIRROR ${CODENAME}-backports main restricted universe multiverse
deb https://$MIRROR ${CODENAME}-security main restricted universe multiverse
EOF
sudo apt update
注意,24.04 的 deb822 格式和这个脚本的写法不同,要先确认目录结构,不要无脑跑。我一般会把脚本放进自己的 dotfiles 仓库,换新机器时一条命令就能恢复习惯的配置环境。
3. 换源后常见的坑与排查实录
3.1 apt update报错Hash Sum mismatch
现象:update 到一半报错,提示 Hash Sum mismatch 或 Failed to fetch ... Hash Sum mismatch。原因主要有两种:一是镜像站正在同步上游,你拉到了半新半旧的软件包索引;二是本地 apt 缓存的 lists 文件损坏。处理方法是清空缓存再重新拉取:
bash复制sudo rm -rf /var/lib/apt/lists/*
sudo apt update
如果多个镜像源都出现这个问题,基本可以锁定是镜像同步状态异常,换一个源或者等半小时再试。经验之谈:晚高峰时,各家镜像偶尔会同时进入同步窗口,错峰更新能避开这个问题。我自己的习惯是白天装开发环境,晚上只做简单的 update,不在高峰期折腾大包升级。
3.2 公钥无法验证的报错
现象:apt update 输出类似 The following signatures couldn't be verified because the public key is not available: NO_PUBKEY ...。原因有两个方向:镜像站文件签名用的密钥不在本机信任列表里,或者系统里的公钥过期、被误删。处理方法是手动导入公钥:
bash复制sudo apt-key adv --keyserver keyserver.ubuntu.com --recv-keys 公钥ID
这个命令在 Ubuntu 22.04 之后会提示 apt-key 已废弃,24.04 上更推荐用 gpg 命令配合 /usr/share/keyrings 目录。简单起见,可以先运行上面的命令看看能否解决;如果 apt-key 不可用,再改用:
bash复制sudo gpg --keyserver keyserver.ubuntu.com --recv-keys 公钥ID
sudo gpg --export --armor 公钥ID | sudo tee /etc/apt/trusted.gpg.d/mirror-key.gpg
公钥服务器偶尔也会慢,可以多试几次,或者直接安装 ubuntu-keyring 包恢复默认信任列表。记住一点:公钥问题是换源时最容易被误判的报错,很多人以为是源配错了,结果反复改地址浪费时间。
3.3 WSL虚拟磁盘空间不释放
现象:在 WSL 里删了一大堆文件,Windows 上的 ext4.vhdx 文件还是那么大,C 盘被占得难受。原因:WSL2 把整个 Linux 文件系统放在一个虚拟磁盘文件里,删除文件只是把磁盘标记为可用,不会主动把空间还给宿主机。这也算换源引出的衍生问题,毕竟源速度快了之后,apt clean 和删除缓存包会变得频繁,空间问题就跟着显现出来。
处理方法:先清理 apt 缓存,然后关停 WSL 并压缩虚拟磁盘:
bash复制wsl --shutdown
diskpart
在 diskpart 会话中执行:
code复制select vdisk file="C:\Users\你的用户名\AppData\Local\Packages\CanonicalGroupLimited.Ubuntu_xxx\LocalState\ext4.vhdx"
attach vdisk readonly
compact vdisk
detach vdisk
exit
路径里的发行版标识需要根据自己安装的 Ubuntu 确定,可以用 wsl -l -v 查看发行版名称,再到对应的目录下找到 ext4.vhdx。另外,较新的 WSL 版本支持稀疏虚拟磁盘,可以用 wsl --manage <发行版> --set-sparse true 提前预防空间膨胀。不过稀疏磁盘开启后,磁盘碎片可能增多,具体取舍看个人使用习惯。
3.4 其他高频问题的排查速查表
| 现象 | 常见原因 | 解决办法 |
|---|---|---|
| apt update 一直卡在 Waiting for headers | 网络连接慢或源服务器繁忙 | 换个源重试;检查 DNS 配置 |
| 域名解析失败但能 ping 通 IP | WSL2 DNS 服务异常 | 编辑 /etc/resolv.conf 添加 nameserver 223.5.5.5,再 sudo chattr +i /etc/resolv.conf 防止被覆盖 |
| 提示 The repository ... does not have a Release file | sources 里的版本代号写错 | 用 lsb_release -a 确认代号并修正 |
| apt 安装时报依赖错误 | 软件包依赖关系破损 | sudo apt --fix-broken install |
| WSL --update 下载很慢 | 微软服务器下载通道繁忙 | 手动去官网下载最新 WSL 安装包更新,比在终端里等省心 |
| apt update 报证书校验失败 | WSL 系统时间漂移 | sudo ntpdate ntp.aliyun.com 校准时间 |
这个表里的问题我都实际遇到过,特别是最后一行的系统时间问题,它最容易被忽略。WSL 的时钟并不是始终和宿主机同步的,一旦漂移过大,https 源的证书就会校验失败,而报错文案又很像源地址写错了,容易把人带偏。
4. 源配好之后:围绕apt与WSL的进一步优化
4.1 让apt下载再快一点的两种思路
换源之后速度已经不错了,但还可以再压榨一下。第一种是并行下载,新版 apt 默认支持多连接,但效果有限,可以装 apt-fast 来分块下载,它会调用 aria2 或 axel 把大包切成若干小块并行拉取:
bash复制sudo apt install aria2 -y
sudo apt install apt-fast -y
实测在慢速网络中提升明显,但安装 apt-fast 本身也需要先换好源,否则第一步就卡住。第二种思路是控制 update 频率:apt update 不需要每次装包前都执行,一天一次足够;频繁 update 会增加镜像站压力和本地 IO 等待。另外,如果只是临时下载某个大软件包,可以用 sudo apt download 包名 先抓 deb,再 sudo apt install ./包名.deb,这样报错信息更清晰,也能缓存到本地留作复用。
4.2 多源并存与源优先级管理
镜像源再可靠,也有维护窗口,多留一个备用的理解。准备两个镜像源,写在 /etc/apt/sources.list.d/ 下的不同文件里,然后通过 /etc/apt/preferences.d/ 配置优先级,例如:
code复制Package: *
Pin: origin mirrors.tuna.tsinghua.edu.cn
Pin-Priority: 900
备用源把 Pin-Priority 调低一些。这样默认从主源下载,主源异常时 apt 会按优先级自动走备用源。对 WSL 这种单发行版环境,这个配置属于锦上添花,但学会原理对以后管理服务器也很有用。我目前的做法是只在主源出问题时手动切换,不常驻双源,因为双源并存偶尔会让 apt 的孤儿包判断变得混乱。
4.3 结合VSCode、CUDA、ROS等场景的联动说明
很多人在 WSL 里干的事,不只是装编译器,还包括装 VSCode Remote-WSL 插件、CUDA、ROS 这些大头。VSCode Remote-WSL 不需要额外换源,它走的是微软下载通道,在 Windows 侧自动更新。ROS 则有独立的软件源,包地址在 packages.ros.org,下载同样慢,可以考虑使用国内镜像把 ROS 源指向镜像站。CUDA 的安装包通常从 NVIDIA 官方 CDN 下载,速度还行,装完后用 apt 处理依赖时,Ubuntu 基础源已经换成国内镜像,整体体验会顺畅很多。这些工具的安装源和 apt 源是相互独立的关系,先把系统源理顺,后面无论装什么都少一层阻碍。
4.4 我的几条个人经验
第一,换源前一定先备份。这个我一直强调,因为在某些版本上改坏了 sources,apt 会进入一个尴尬的坏状态,没有备份的话修复起来要花好几倍时间。第二,别把清华源当成万能解。清华 TUNA 整体可靠,但高峰期也有不痛快的时候。我自己的习惯是:先配清华,如果 update 卡顿严重,直接在 sources 里把域名替换成阿里镜像,一条 sed 命令就切过去:
bash复制sudo sed -i 's/mirrors.tuna.tsinghua.edu.cn/mirrors.aliyun.com/g' /etc/apt/sources.list
第三,WSL 里的时间问题比想象中常见。我有一次帮朋友排查一个问题,反复换了三次源都没用,最后 sudo ntpdate ntp.aliyun.com 一步解决。第四,Docker Desktop 里的 WSL 后端也适用同样方法。如果 Docker 用的 WSL 发行版需要装软件,在对应的发行版里用同一套换源逻辑就能提速。这些心得都是我在实际使用 WSL 过程中一点一点积累下来的,写出来就是希望朋友们不用再踩一遍。
