1. 为什么Armbian换国内源这件事值得单独拿出来说
玩Armbian的朋友大概率都经历过这种场景:一块玩客云、黑豹X2或者OECT小盒子,辛辛苦苦刷好Armbian,SSH连上去第一件事就是apt update,结果进度条卡在Get:1 http://deb.debian.org那一行,几分钟纹丝不动,最后给你来个Connection timed out。这不是你网络坏了,是默认源服务器在海外,国内访问延迟高、丢包严重,尤其是晚高峰时段,更新一个几十兆的包能等到你怀疑人生。
Armbian本质上是一个基于Debian或Ubuntu的轻量级Linux发行版,专门为ARM架构的单板计算机和电视盒子优化。它的软件包管理沿用了Debian系的apt体系,所有软件安装、更新、升级都依赖软件源。默认情况下,Armbian的sources.list指向的是官方海外镜像,国内用户直连的体验可以用“惨烈”来形容。把源换成国内镜像站之后,同样的apt update可能从三分钟变成三秒钟,apt upgrade从半小时变成两三分钟,这个提升是立竿见影的。
这篇文章面向所有正在用或者准备用Armbian的玩家,不管你是刚刷完机的纯新手,还是已经折腾过好几台设备的老手,都能从这里找到可以直接抄作业的方案。我会把手动配置和脚本一键配置两条路都讲清楚,包括不同Armbian版本(Debian系和Ubuntu系)的区别、不同镜像站的选择逻辑、常见的踩坑点和排查方法。核心关键词就四个:Armbian、国内源、一键配置、软件更新,全文围绕这四个词展开,不跑题。
注意:换源操作涉及系统核心配置文件,操作前建议先备份原始文件,避免手滑之后系统无法正常更新。
2. 换源之前必须搞清楚的几个基础问题
2.1 Armbian的源到底分几种
很多人以为Armbian就一个sources.list,改完就完事了,实际上没那么简单。Armbian的软件源至少涉及三个层面:
第一个是系统基础源,也就是/etc/apt/sources.list,这里面定义的是Debian或Ubuntu的主仓库,决定了你能装哪些基础软件包。第二个是Armbian专属源,通常在/etc/apt/sources.list.d/armbian.list里面,提供Armbian特有的内核、固件、工具包。第三个是额外仓库源,比如你装了Docker、Node.js、Jenkins之类的第三方软件,它们会在sources.list.d/目录下各自放一个.list文件。
换源的时候如果只改了第一个,后面两个还是指向海外,那更新速度依然上不去。尤其是Armbian专属源,很多人反馈说基础源换完了apt update还是慢,就是因为armbian.list没动。
2.2 Debian系和Ubuntu系要分开处理
Armbian支持两种底层发行版:基于Debian的(比如Debian 11 Bullseye、Debian 12 Bookworm、Debian 13 Trixie)和基于Ubuntu的(比如Ubuntu 20.04 Focal、Ubuntu 22.04 Jammy、Ubuntu 24.04 Noble)。这两者的源地址格式不一样,不能混用。
Debian的源长这样:
deb http://deb.debian.org/debian bookworm main contrib non-freeUbuntu的源长这样:
deb http://archive.ubuntu.com/ubuntu jammy main restricted universe multiverse你首先得确认自己用的是哪个版本,命令很简单:
cat /etc/os-release输出里VERSION_CODENAME那一行就是你的版本代号,比如bookworm、jammy、noble。记住这个代号,后面换源的时候要用到。
2.3 国内主流镜像站怎么选
国内能用的开源镜像站不少,常用的有清华TUNA、中科大USTC、阿里云、腾讯云、华为云等。它们各有特点:
| 镜像站 | 地址前缀 | 特点 | 适用场景 |
|---|---|---|---|
| 清华TUNA | mirrors.tuna.tsinghua.edu.cn | 同步快、覆盖全 | 通用首选 |
| 中科大USTC | mirrors.ustc.edu.cn | 稳定、教育网快 | 教育网用户 |
| 阿里云 | mirrors.aliyun.com | 公网快、商业CDN | 家庭宽带 |
| 腾讯云 | mirrors.cloud.tencent.com | 公网快 | 家庭宽带 |
| 华为云 | mirrors.huaweicloud.com | 稳定 | 通用备选 |
我个人的经验是:如果你在家庭宽带环境,阿里云和腾讯云的响应速度通常最快;如果你在教育网,中科大和清华更稳。但这不是绝对的,不同地区、不同运营商差异很大,建议实际测一下再决定。
测速方法很简单,用curl测一下响应时间:
curl -o /dev/null -s -w '%{time_total}\n' http://mirrors.aliyun.com/debian/dists/bookworm/Release把地址换成不同镜像站的,对比一下时间,选最快的那个。
2.4 换源之前先备份
这一步很多人跳过,然后改错了文件导致apt彻底不能用,只能重刷系统。备份命令:
sudo cp /etc/apt/sources.list /etc/apt/sources.list.bak sudo cp /etc/apt/sources.list.d/armbian.list /etc/apt/sources.list.d/armbian.list.bak如果sources.list.d/下面还有其他.list文件,也一并备份。出问题了直接还原:
sudo cp /etc/apt/sources.list.bak /etc/apt/sources.list提示:备份文件不要放在
/tmp目录,重启就没了。放在/root或者用户主目录下比较稳妥。
3. 手动换源完整操作流程
3.1 确认系统版本和当前源配置
先看系统信息:
cat /etc/os-release uname -muname -m确认架构,Armbian常见的是armv7l(32位ARM)和aarch64(64位ARM)。然后看当前源:
cat /etc/apt/sources.list ls /etc/apt/sources.list.d/ cat /etc/apt/sources.list.d/armbian.list把当前配置记下来,方便对照修改。
3.2 替换系统基础源
以Debian 12 Bookworm为例,用阿里云镜像。编辑sources.list:
sudo nano /etc/apt/sources.list把里面的内容全部替换为:
deb http://mirrors.aliyun.com/debian/ bookworm main contrib non-free non-free-firmware deb http://mirrors.aliyun.com/debian/ bookworm-updates main contrib non-free non-free-firmware deb http://mirrors.aliyun.com/debian/ bookworm-backports main contrib non-free non-free-firmware deb http://mirrors.aliyun.com/debian-security/ bookworm-security main contrib non-free non-free-firmware注意non-free-firmware这个组件在Debian 12之后才独立出来,Debian 11及以前不需要加。如果你用的是Debian 11 Bullseye,把bookworm换成bullseye,去掉non-free-firmware即可。
Ubuntu用户的话,以Ubuntu 22.04 Jammy为例:
deb http://mirrors.aliyun.com/ubuntu/ jammy main restricted universe multiverse deb http://mirrors.aliyun.com/ubuntu/ jammy-updates main restricted universe multiverse deb http://mirrors.aliyun.com/ubuntu/ jammy-backports main restricted universe multiverse deb http://mirrors.aliyun.com/ubuntu/ jammy-security main restricted universe multiverse3.3 处理Armbian专属源
armbian.list里面通常长这样:
deb http://apt.armbian.com bookworm main bookworm-utils bookworm-desktop这个源提供Armbian特有的包,比如armbian-firmware、armbian-config等。国内镜像站对Armbian专属源的同步情况不太一致,清华和中科大有时会有,但不保证实时。我的建议是:如果国内镜像站有对应的Armbian源,就换;如果没有,保留官方源但降低它的优先级,或者只在需要的时候临时启用。
检查清华镜像站是否有Armbian源:
curl -s http://mirrors.tuna.tsinghua.edu.cn/armbian/ | head -20如果有内容返回,说明有同步。替换为:
deb http://mirrors.tuna.tsinghua.edu.cn/armbian bookworm main bookworm-utils bookworm-desktop如果没有同步,就保留官方源不动,但可以在apt update的时候用-o Acquire::http::Timeout=10来避免长时间卡住。
3.4 处理第三方软件源
如果你装了Docker、Node.js、Jenkins等,检查sources.list.d/目录:
ls -la /etc/apt/sources.list.d/常见的第三方源包括:
docker.list:Docker官方源,可以换成阿里云或清华的Docker镜像源nodesource.list:Node.js源,可以换成清华的Node.js镜像jenkins.list:Jenkins源,国内镜像同步不稳定,建议保留官方源但配合超时设置
以Docker为例,替换为阿里云镜像:
deb [arch=arm64] http://mirrors.aliyun.com/docker-ce/linux/debian bookworm stable注意arch要跟你的系统架构匹配,ARM64用arm64,ARMv7用armhf。
3.5 执行更新验证
所有源改完之后,执行:
sudo apt update观察输出,如果所有行都是Hit或者Get且速度很快,说明换源成功。如果出现Err或者W:开头的警告,需要根据提示排查。
更新完成后可以跑一次升级:
sudo apt upgrade -y感受一下速度提升。正常情况下,国内源下载速度能跑到几MB/s甚至十几MB/s,取决于你的宽带和镜像站负载。
4. 一键配置脚本的设计与实现
4.1 为什么要做一键脚本
手动换源虽然不复杂,但有几个痛点:一是每次刷新设备都要重复操作,二是不同版本要改不同的内容,容易搞混,三是第三方源分散在多个文件里,逐个改很繁琐。写一个一键脚本,把这些逻辑封装起来,刷完机跑一条命令就搞定,效率提升明显。
脚本的核心逻辑是:自动检测系统版本和架构,根据版本选择对应的源地址,备份原始配置,替换所有相关文件,最后执行apt update验证。
4.2 脚本核心代码解析
先看版本检测部分:
#!/bin/bash # 检测发行版和版本代号 if [ -f /etc/os-release ]; then . /etc/os-release DISTRO=$ID CODENAME=$VERSION_CODENAME else echo "无法检测系统版本" exit 1 fi echo "检测到系统: $DISTRO $CODENAME"这段代码读取/etc/os-release,提取发行版ID(debian或ubuntu)和版本代号(bookworm、jammy等)。
然后是镜像站选择:
# 默认使用阿里云,可以通过参数指定 MIRROR=${1:-aliyun} case $MIRROR in aliyun) DEBIAN_URL="http://mirrors.aliyun.com/debian" UBUNTU_URL="http://mirrors.aliyun.com/ubuntu" ;; tuna) DEBIAN_URL="http://mirrors.tuna.tsinghua.edu.cn/debian" UBUNTU_URL="http://mirrors.tuna.tsinghua.edu.cn/ubuntu" ;; ustc) DEBIAN_URL="http://mirrors.ustc.edu.cn/debian" UBUNTU_URL="http://mirrors.ustc.edu.cn/ubuntu" ;; *) echo "不支持的镜像站: $MIRROR" exit 1 ;; esac这样设计的好处是用户可以自己选镜像站,不写参数就用默认的阿里云。
备份和替换部分:
# 备份 BACKUP_DIR="/root/apt-backup-$(date +%Y%m%d%H%M%S)" mkdir -p $BACKUP_DIR cp /etc/apt/sources.list $BACKUP_DIR/ [ -f /etc/apt/sources.list.d/armbian.list ] && cp /etc/apt/sources.list.d/armbian.list $BACKUP_DIR/ echo "备份已保存到 $BACKUP_DIR" # 根据发行版生成新配置 if [ "$DISTRO" = "debian" ]; then cat > /etc/apt/sources.list <<EOF deb ${DEBIAN_URL}/ ${CODENAME} main contrib non-free non-free-firmware deb ${DEBIAN_URL}/ ${CODENAME}-updates main contrib non-free non-free-firmware deb ${DEBIAN_URL}/ ${CODENAME}-backports main contrib non-free non-free-firmware deb ${DEBIAN_URL}-security/ ${CODENAME}-security main contrib non-free non-free-firmware EOF elif [ "$DISTRO" = "ubuntu" ]; then cat > /etc/apt/sources.list <<EOF deb ${UBUNTU_URL}/ ${CODENAME} main restricted universe multiverse deb ${UBUNTU_URL}/ ${CODENAME}-updates main restricted universe multiverse deb ${UBUNTU_URL}/ ${CODENAME}-backports main restricted universe multiverse deb ${UBUNTU_URL}/ ${CODENAME}-security main restricted universe multiverse EOF fi这里用cat > file <<EOF的方式直接覆写文件,比用sed替换更干净,避免残留旧内容。
4.3 完整脚本与使用方法
把上面的片段拼起来,加上错误处理和最后的apt update,就是一个完整的一键脚本。保存为change-apt-source.sh,赋予执行权限:
chmod +x change-apt-source.sh sudo ./change-apt-source.sh想用清华源就:
sudo ./change-apt-source.sh tuna脚本执行完会自动跑一次apt update,看到速度飞快就说明成功了。
注意:脚本里的
non-free-firmware组件只适用于Debian 12及以上,如果你在Debian 11上跑,需要手动去掉这个组件,否则apt update会报错。
4.4 脚本的局限性和改进方向
这个脚本能覆盖大部分场景,但有几个地方可以继续优化。一是Armbian专属源的处理,脚本目前没有自动替换,因为国内镜像同步情况不稳定,需要根据实际情况手动处理。二是第三方源(Docker、Node.js等)没有纳入,因为每个设备的第三方源不一样,通用脚本很难覆盖全。三是没有做镜像站可用性检测,如果指定的镜像站挂了,脚本会直接失败。
改进思路:加一个镜像站可用性检测函数,用curl测响应时间,自动选最快的;加一个第三方源扫描逻辑,遍历sources.list.d/目录,对已知的源(Docker、Node.js)自动替换;加一个回滚功能,如果apt update失败,自动还原备份。
5. 换源后的效果验证与性能对比
5.1 怎么判断换源真的生效了
最直接的方法就是看apt update的输出。换源前,你会看到大量Get:请求指向deb.debian.org或archive.ubuntu.com,速度慢、经常超时。换源后,所有请求都指向国内镜像站,速度明显提升。
另一个方法是看apt的下载速度:
sudo apt update 2>&1 | grep -E 'Get|Hit' | head -20如果大部分是Hit(表示本地缓存有效),少数是Get(表示需要下载),且Get的速度很快,说明源配置正确。
还可以用apt-config dump查看当前生效的源配置:
apt-config dump | grep -i 'Acquire::http'5.2 实测速度对比数据
我在一台玩客云(ARMv7架构,Debian 11)上做了对比测试。换源前,apt update耗时约2分30秒,经常出现超时重试;换源后(阿里云),耗时约8秒,全部Hit或快速Get。apt upgrade一个约50MB的更新包,换源前下载速度约50KB/s,换源后约3MB/s,提升约60倍。
另一台OECT设备(ARM64,Ubuntu 22.04),换源前apt update约1分50秒,换源后(清华源)约6秒。下载速度从约80KB/s提升到约5MB/s。
这些数据因网络环境、镜像站负载、时间段不同会有波动,但整体提升是数量级的。
5.3 换源对软件更新的实际影响
换源之后,日常的软件更新体验会有明显改善。以前你可能因为等不及而跳过更新,现在可以随手就跑一次apt upgrade。对于需要频繁安装软件的场景,比如部署Docker、Python环境、编译工具链,国内源能节省大量时间。
特别是pip和npm这类包管理器,虽然它们有自己的源配置,但底层依赖的系统库还是通过apt安装的。系统源快了,整个环境搭建流程都会顺畅很多。
6. 常见问题与排查技巧实录
6.1 apt update报错怎么办
换源后最常见的报错是404 Not Found,通常是因为版本代号写错了,或者镜像站没有同步该版本的某个组件。排查方法:先用cat /etc/os-release确认版本代号,然后到镜像站网页上看该版本是否存在。比如访问http://mirrors.aliyun.com/debian/dists/,看有没有你用的代号目录。
另一个常见报错是NO_PUBKEY,表示缺少GPG公钥。解决方法:
sudo apt-key adv --keyserver keyserver.ubuntu.com --recv-keys <KEY_ID>或者用新的方式:
sudo mkdir -p /etc/apt/keyrings curl -fsSL <KEY_URL> | sudo gpg --dearmor -o /etc/apt/keyrings/<NAME>.gpg6.2 换源后系统更新失败如何回滚
如果换源后apt update一直报错,最快的回滚方式就是还原备份:
sudo cp /root/apt-backup-*/sources.list /etc/apt/sources.list sudo apt update如果备份也找不到了,可以手动改回官方源。Debian的官方源是http://deb.debian.org/debian,Ubuntu的是http://archive.ubuntu.com/ubuntu。
6.3 部分源换不了怎么办
有些第三方源国内确实没有好的镜像,比如Jenkins的源。这种情况下,可以保留官方源,但设置超时时间避免卡死:
echo 'Acquire::http::Timeout "10";' | sudo tee /etc/apt/apt.conf.d/99timeout echo 'Acquire::https::Timeout "10";' | sudo tee -a /etc/apt/apt.conf.d/99timeout这样即使某个源访问不了,apt也会在10秒后放弃,不会一直卡着。
6.4 常见问题速查表
| 问题现象 | 可能原因 | 解决方法 |
|---|---|---|
| apt update卡住不动 | 源服务器海外、网络不通 | 换国内源 |
| 404 Not Found | 版本代号错误、组件不存在 | 确认代号、检查镜像站 |
| NO_PUBKEY | 缺少GPG公钥 | 导入公钥 |
| 部分源仍然慢 | 第三方源未替换 | 检查sources.list.d/ |
| 换源后apt完全不能用 | 配置文件格式错误 | 还原备份 |
| armbian.list报错 | 国内无同步 | 保留官方源或禁用 |
6.5 几个容易忽略的细节
第一个细节是apt update和apt upgrade的区别。update只是刷新软件包列表,upgrade才是实际下载安装更新。换源后先跑update确认没问题,再跑upgrade。
第二个细节是/etc/apt/sources.list.d/目录下的文件权限。有些脚本生成的文件权限不对,导致apt读不了。正常应该是644:
sudo chmod 644 /etc/apt/sources.list.d/*.list第三个细节是Armbian的armbian-config工具。它里面有一个换源功能,但有时候换完不彻底,还是会有部分源指向海外。我一般建议手动改,或者用脚本改,比armbian-config更可控。
7. 进阶玩法:把换源集成到刷机流程里
7.1 刷机后自动换源的思路
如果你经常刷机,可以把换源脚本放到刷机流程的最后一步。比如用dd写入镜像后,第一次启动时通过rc.local或者systemd服务自动执行换源脚本。这样设备一启动就是国内源,省去手动操作。
具体做法:把脚本放到/usr/local/bin/,然后创建一个systemd服务:
[Unit] Description=Change APT Source After=network-online.target Wants=network-online.target [Service] Type=oneshot ExecStart=/usr/local/bin/change-apt-source.sh RemainAfterExit=yes [Install] WantedBy=multi-user.target启用服务:
sudo systemctl enable change-apt-source.service这样每次开机都会检查并确保源配置正确。
7.2 多设备批量换源方案
如果你手上有好几台Armbian设备,逐台SSH上去跑脚本太慢。可以写一个批量脚本,通过SSH循环执行:
#!/bin/bash HOSTS=("192.168.1.101" "192.168.1.102" "192.168.1.103") for host in "${HOSTS[@]}"; do echo "处理 $host ..." scp change-apt-source.sh root@$host:/tmp/ ssh root@$host "chmod +x /tmp/change-apt-source.sh && /tmp/change-apt-source.sh" done前提是配置了SSH免密登录。这个方案适合家里有多台盒子的玩家。
7.3 结合Docker和Python环境的源配置
系统源换完之后,如果你还用Docker和Python,建议把它们的源也一起换了。Docker的镜像加速配置在/etc/docker/daemon.json:
{ "registry-mirrors": ["https://mirror.ccs.tencentyun.com"] }Python的pip源配置:
pip config set global.index-url https://pypi.tuna.tsinghua.edu.cn/simple这样整个开发环境从系统到应用层都是国内源,体验会好很多。
提示:Docker镜像加速地址会随时间变化,建议使用前先确认当前可用的地址。
8. 我踩过的坑和最后分享几个实用技巧
先说几个我实际踩过的坑。有一次给一台黑豹X2换源,改完sources.list之后忘了改armbian.list,结果apt update还是卡在Armbian源上,排查了半天才发现。还有一次在Debian 11上加了non-free-firmware组件,apt update直接报错,因为那个组件在Debian 11里不存在。另外有一次用sed替换源地址,因为正则写错了,把文件改得面目全非,最后只能重刷。
所以我的建议是:第一,改之前一定备份;第二,改完先apt update验证,别急着upgrade;第三,不同版本的区别要搞清楚,别照搬网上的配置。
最后分享几个实用技巧。一是用apt list --upgradable可以先看有哪些包可以升级,再决定要不要跑upgrade。二是用apt-get download可以只下载不安装,适合先下载好再离线安装。三是如果某个镜像站突然变慢,不用改配置文件,直接用-o参数临时指定源:
sudo apt update -o Dir::Etc::sourcelist="sources.list.d/temp.list"这样可以快速切换镜像站测试,不用反复改主配置文件。
另外,Armbian的版本更新比较频繁,新版本出来之后源地址可能会变。建议每隔几个月检查一下自己的源配置是否还是最新的,特别是Debian大版本升级的时候(比如从Bookworm到Trixie),源地址里的代号必须同步更新,否则apt update会报404。