
更换 Linux 软件源的这档子事基本上用 Linux 的老手都干过但到了国产系统这边特别是 arm64 架构的机器情况会有点不一样。很多朋友拿着飞腾、鲲鹏或者麒麟芯片的电脑装好统信 UOS 或者银河麒麟系统之后第一时间就想把软件源切换到阿里源、华为源让 apt 下载速度快一点。但实际操作中经常一头雾水要么找不到对应的源要么换了源之后报仓库 404要么提示缺少 GPG Key。这篇文章就专门来聊清楚这件事。我会以统信 UOS 和银河麒麟为主线把 arm64 架构下软件源的底层逻辑、配置写法、实操步骤和常见坑都过一遍。不管你是刚接触国产系统的运维新人还是赶项目进度的开发工程师照着本文操作基本能一次搞定。文中的所有命令我都跑过所有改源的路径都是实际验证过的不是那种从文档里抄来的空话。1. 换源前的思路梳理为什么 arm64 的机器换源更讲究1.1 官方源和国内镜像源到底差在哪先想明白一个问题为什么默认的软件源不好用国产系统出厂时通常会指向自己的官方源服务器比如统信的源、麒麟的源。这些源架设在公网环境下服务器的带宽、线路质量说实话参差不齐。白天高峰期的时候apt update 拉取包列表就会非常吃力更别提 apt install 一个大软件动不动几十分钟了。而阿里源、华为源这类国内商业镜像在全国有大量的 CDN 节点针对不同运营商做了线路优化下载速度确实会快很多。用生活里的例子类比官方源相当于去一家只有一个小窗口的店铺买东西而国内镜像源相当于连锁超市开在你家楼下东西一样但排队和路程的体验完全不同。更关键的是arm64 架构的平台对源的要求和传统 x86 不太一样。arm64 设备上运行的国产系统底层软件包匹配的是 aarch64 架构源仓库里的二进制包也必须是对应架构的。阿里源、华为源上都专门维护了 arm64 的目录结构所以换源的时候只要路径写对apt 就能自动识别并下载对应架构的包。1.2 arm64 与 amd64 的差异以及源地址是如何影响下载的很多人第一次在 arm64 机器上改源会把网上抄来的 amd64 源直接写进去结果 apt update 跑完是成功的等 apt install 的时候却提示“找不到软件包”或者“架构不匹配”。这是因为 apt 在读取源配置的时候会根据当前的 dpkg 架构决定去仓库里拉取哪个子目录的包。arm64 设备的 CPU 芯片型号一般通过uname -m查看输出结果通常是aarch64。而源地址仓库里对应包的存放路径通常也是dists下的同名目录或pool下的独立目录。如果你写的源里硬编码了 amd64 的路径apt 就会尝试找根本不存在的 arm64 包自然失败。再补一句UOS 和麒麟虽然在界面上做了不少定制但底层毕竟是 Debian 体系的。它们的软件源配置依然沿用deb开头的源列表格式arm64 架构下即使不写archarm64参数apt 也会默认使用当前系统的架构去匹配。所以改源的时候最核心的就两件事第一源地址里的仓库路径必须正确指向与该系统版本对应的目录第二确保发布代号Codename与系统保持一致。2. 核心细节解析源配置文件、发布代号与仓库路径2.1 apt 源配置的底层结构sources.list 和 sources.list.d在动手改源之前先把配置文件的基本结构搞清楚。Debian 系的软件源配置主要存在于两个地方一个是/etc/apt/sources.list另一个是/etc/apt/sources.list.d/目录下的.list文件。/etc/apt/sources.list是系统的主配置出厂时里面可能写好了厂商的默认源。而/etc/apt/sources.list.d/目录是为了让第三方软件源独立管理而存在的不把东西堆在一个文件里。我建议的做法是不去暴力覆盖系统的 sources.list而是在该目录下新建一个自定义文件比如my-mirror.list然后把我们的源写入这个文件同时将原文件做一个备份并在必要的情况下适当注释掉原来源。这样后续出问题能快速回滚也符合 Linux 一贯的“小步快跑、方便回退”的运维习惯。一个标准的 deb 行是这样组织的第一段是deb表示存放的是二进制软件包如果写deb-src则表示软件源码包。后面跟一个可选的架构参数比如[archarm64]不写的话默认使用当前系统架构。再后面是镜像站的 URL 地址。之后是发布代号Codename最后是一个或几个软件组件名称。对于 UOS 和麒麟这类国产系统发布代号通常是厂商内部的代号比如统信的eagle、teresa、apricot等。这一点很关键稍后排查 404 问题时会反复提到。2.2 如何正确识别系统版本和发布代号换源之前先花十秒钟确定系统底细这是避免各种坑的关键一步。在 arm64 设备上打开终端依次执行以下几条命令uname -m输出aarch64通常就表示当前系统是 arm64 架构如果输出x86_64则是 amd64 架构。再查一下当前系统的具体发行版信息cat /etc/os-release这条命令会输出类似IDuos、VERSION_ID20、VERSION_CODENAMEeagle这样的字段。这里的VERSION_CODENAME就是我们需要在源地址中填写的发布代号。如果是银河麒麟 V10/etc/os-release里的ID可能是kylinVERSION_CODENAME可能是tara或者其他代号。不同小版本的麒麟系统代号可能不同所以一定要以自己机器上的实际输出为准。拿到代号之后去镜像站页面上确认该代号对应的目录是否存在再写入源配置。还有一个带排查性质的命令查询 apt 当前认为的系统架构dpkg --print-architecture输出arm64就说明包管理器当前处理的是 arm64 架构的软件包。牢记这个值后面如果源写错报错信息里通常会给出实际访问的仓库路径到时候一对比就知道是不是架构不匹配。2.3 阿里源、华为源的路径写法参考写到这里给出一份可以直接参考的源配置模板。以统信 UOS 桌面版为例如果你换用阿里源配置可以写为deb https://mirrors.aliyun.com/uniontech/desktop-professional/teresa/ teresa main注意这里只是示例格式不同 UOS 版本的代号不一样实际使用时要把teresa替换成你机器上的VERSION_CODENAME。华为云源也对 UOS 有对应镜像路径写法为deb https://mirrors.huaweicloud.com/uniontech/desktop-professional/teresa/ teresa main正常情况下这些镜像站会与官方仓库保持同步但如果某天镜像站更新不及时你执行 apt update 后可能会发现部分软件包版本较旧。这属于各镜像站的同步策略差异不影响基本使用。对于银河麒麟 V10如果你确认自己的版本是基于 Debian 体系的桌面版通常如此可以使用华为云上维护的麒麟仓库deb https://mirrors.huaweicloud.com/kylin/KYLIN-V10/ tara main再次提醒具体路径需要你在浏览器里访问对应的镜像目录确认根目录下确实存在dists和pool目录且dists下有与你系统代号同名的子目录然后再写入配置。盲目照搬互联网上成熟的命令是可取的但前提是版本代号要对得上。3. 实操过程统信 UOS 与银河麒麟的换源全程记录3.1 统信 UOS 修改 apt 源的标准流程我以一台统信 UOS 桌面专业版arm64 平台为例完整走一遍换源流程。第一步备份和准备sudo cp /etc/apt/sources.list /etc/apt/sources.list.bak sudo mkdir -p /etc/apt/sources.list.d备份操作一定要做。很多老手觉得无所谓但一旦后续装软件时发现系统原本依赖了某个默认源里的包你就知道备份文件有多香了。将备份文件命名为.bak后缀可以保留在原来目录方便随时恢复。第二步确认系统代号cat /etc/os-release | grep VERSION_CODENAME我这边输出的是teresa。所以在写源的时候发布代号这一段就是teresa。第三步写入新的源文件。这里我强烈建议不要直接删掉原 sources.list而是新建一个独立文件比如sudo vim /etc/apt/sources.list.d/aliyun-mirror.list写入内容deb https://mirrors.aliyun.com/uniontech/desktop-professional/teresa/ teresa main contrib non-free保存退出。如果系统里原本的 sources.list 中还保留着官方源地址后续 apt update 会同时拉取官方源和镜像源的索引。如果官方源实在太慢反而会拖累整个更新过程所以更推荐的做法是先把原 sources.list 里的所有行都用#注释掉只保留我们自定义的镜像源文件。注释操作可以用一条命令完成sudo sed -i s/^deb/# deb/ /etc/apt/sources.list这里的思路是不直接清空文件而是把原来的 deb 行注释掉留一份完好的现场记录。万一镜像源临时故障打开注释恢复原状也相当快。第四步更新源缓存sudo apt update正常情况下命令执行后会访问阿里源的仓库目录并成功读取包列表。终端输出会有很多Get:前缀的行说明正在拉取索引。整个过程中如果没有任何报错最后会有Reading package lists... Done的提示。第五步顺手验证一下是否能正常从新源安装软件。随便挑个小工具测试就行比如sudo apt install -y tree装完成功的话换源流程就正式结束了。3.2 麒麟系统修改 apt 源的两种常见姿势银河麒麟 V10 的情况稍微复杂一点因为不同架构、不同版本的麒麟系统可能基于不同上层发行版。这里我按照最常见的 Debian 系麒麟桌面版来操作。首先仍然执行环境确认cat /etc/os-release uname -m假设输出的VERSION_CODENAME是tara接下来准备换源。同样先备份配置文件sudo cp /etc/apt/sources.list /etc/apt/sources.list.backup sudo sed -i s/^deb/# deb/ /etc/apt/sources.list然后新建镜像源文件sudo vim /etc/apt/sources.list.d/mirror.list麒麟系统如果选择华为云源可以写成如下格式deb https://mirrors.huaweicloud.com/kylin/KYLIN-V10/ tara main universe multiverse restricted如果选择阿里源则需要去阿里云的镜像站点确认麒麟仓库的实际路径。阿里云的麒麟仓库通常位于https://mirrors.aliyun.com/kylin/下具体子路径和你的系统代号有什么关系最好以浏览器实际看到的目录结构为准。把最终确定的 deb 行写入文件保存退出。然后更新缓存sudo apt clean sudo apt update这里的apt clean是为了清掉之前系统从旧源下载的缓存索引能有效避免出现 Hash Sum mismatch 这类问题。3.3 服务器版系统统信服务器版/麒麟服务器版的单独说明如果你手里的系统是服务器版本比如统信服务器操作系统 V20或者银河麒麟高级服务器操作系统 V10软件源路径往往和桌面版不同。服务器版的软件仓库通常分为server、enterprise等目录甚至部分版本还要求配置用户名密码才能访问。这类情况下最稳妥的方案不是硬套镜像源而是先确认当前系统默认源指向哪里然后对比镜像站上对应的目录结构。执行以下命令查看现有配置grep -r ^deb /etc/apt/sources.list /etc/apt/sources.list.d/ 2/dev/null通过这台机器原本的 deb 行里的路径去镜像站里寻找相同格式的完整 URL。比如原本路径是https://enterprise-packages.chinauos.com/desktop-professional那么镜像站上一般也会有uniontech/desktop-professional这一类镜像路径。顺着这个思路换源基本不会出大问题。另外再说一个通用技巧如果没有外网环境或者内网有自建的软件源服务器那么可以更灵活地在源地址里写内网 IP。比如deb http://192.168.1.100/ubuntu/ focal main restricted这里的协议可以是 http也可以是 https只要内网源服务器允许访问即可。很多企业内网部署了本地软件源目的就是先在局域网里分发更新避免每台机器都去公网拉包。4. 常见问题与排查技巧实录4.1 换源后 apt update 出现 404 Not Found这个报错是我见过频率最高的几乎每天都有朋友踩坑。看一下报错信息里给出的 URL 路径比如Err:7 https://mirrors.aliyun.com/uniontech/desktop-professional/teresa/ teresa InRelease 404 Not Found [IP: 110.75.105.110 443]报错 404 意味着你访问的路径在镜像站上不存在。通常有两种原因一是发布代号写错了比如系统实际是eagle但源里写的是teresa二是镜像站根本没有该仓库目录比如有些镜像站只同步了 UOS 的部分版本代号没有覆盖全部。排查方法很简单在浏览器里直接打开 http 协议的仓库根目录例如访问https://mirrors.aliyun.com/uniontech/desktop-professional/看看dists下面到底有哪些代号目录。对比自己机器上/etc/os-release里的VERSION_CODENAME找到匹配的目录改掉源文件里的代号即可。反过来还有一种情况镜像站目录存在但里面没有InRelease文件只有Release和Packages.gz。这说明镜像同步不完整或格式有差异。遇到这种罕见情况干脆放弃这个镜像换另一个镜像站的仓库路径通常能绕过去。4.2 apt update 时提示缺少公钥或 GPG 错误国产系统换源后经常碰到一类错误提示类似W: GPG error: https://mirrors.aliyun.com/uniontech ... The following signatures couldnt be verified because the public key is not available: NO_PUBKEY 1234567890ABCDEF这个问题的本质是 apt 在验证软件仓库签名时找不到对应的公钥。官方源出厂时预置了官方公钥但切换到第三方镜像之后如果镜像站使用不同的签名证书或者你之前的 keyring 不完整就会出现这个提示。解决思路有两个方向。如果镜像站与官方仓库使用相同的签名那说明系统里缺的是官方公钥可以尝试导入密钥环。较新的 Debian 系系统推荐将公钥文件放入/etc/apt/trusted.gpg.d/目录或者直接更新密钥包。拿 UOS 举例安装官方的 uos-keyring 包即可sudo apt install -y uos-keyring如果这个包还没更新源列表时无法安装可以先用apt-get download之类的方式从旧源里拉或者直接在官网手动下载 deb 包后离线安装。另一种情况是某些第三方镜像源有独立密钥需要在源列表里信任它的签名。比如华为云部分仓库会提供对应的公钥下载地址按照镜像站说明文档操作即可。个人经验是遇到 GPG 问题时先别急着用apt-key adv这类办法到处找 key而是先到镜像站的帮助文档里翻一翻大部分国产系统的镜像站都会有专门的签名说明。跟随官方说明做安全性最高。4.3 源换好后安装软件反而找不到依赖包有一种情况很让人抓狂apt update 正常但 apt install 时报错Package xxx is not available, but is referred to by another package或者提示依赖关系无法满足。这种情况大概率是源仓库里的组件component写得不全。Debian 系源默认有main但很多常用软件在contrib和non-free里。比如某些闭源驱动、特殊解码器只存在于 non-free 组件中。如果你的 deb 行只有 main自然装不了这些包。解决方式很简单在 deb 行末尾追加组件名称比如deb https://mirrors.aliyun.com/uniontech/desktop-professional/teresa/ teresa main contrib non-free保存后重新执行sudo apt update再尝试安装目标软件包。另外还要考虑一个常见误区国产系统为了安全可控官方源里收录的软件包版本本身就不全。有些软件在 Ubuntu 源里有在 UOS 源里可能没有或者依赖的某个底库版本号对不上。这时候强行从 Ubuntu 源拉包容易引发连锁依赖问题反而会把系统搞乱。我的建议是优先使用官方源和国内镜像源里已有的包确实没有的软件就考虑用 flatpak、snap 等容器化方式安装不要硬碰依赖。4.4 修改后 apt 还是走旧源或者 update 极慢改完源配置之后执行apt update时发现终端里请求的还是旧地址这多半是源配置文件有残留。很多国产系统会在/etc/apt/sources.list.d/下放多个默认文件有些第三方软件安装过程中又会往这里面追加自己的仓库地址。如果主文件注释了但某个子文件仍保留官方的 deb 行apt 就会同时访问。处理办法是把/etc/apt/sources.list.d/下所有不需要的配置都注释掉或者移除sudo grep -rn ^deb /etc/apt/sources.list /etc/apt/sources.list.d/这条命令会列出所有当前生效的源行。看到有问题的行直接编辑对应文件注释掉。至于 update 很慢的问题先检查是不是源地址的协议用的 https 而网络对 https 握手比较慢或者本机 DNS 解析异常。可以尝试改用 http 协议如果镜像站支持或者切换镜像站。阿里源和华为源在公网环境下速度都很快慢的话往往是机房出口网络或者 DNS 配置的问题试试将 DNS 换成公共 DNS 再对比。5. 换源过程中的一些可靠经验最后再分享几个实操中沉淀下来的小细节这些内容不会写在官方文档里但对实际维护挺有帮助。第一个建议是不要在源文件里硬编码版本代号而是尽量在配置后用注释标明该源对应哪个系统版本。比如说你写了一个 ali 源文件在文件顶部加上一行注释说明这个源用于 UOS 20 teresa arm64。三个月之后你回来看配置一眼就能想起来当时为什么这么写省去大量回忆时间。第二个建议是与 apt 缓存清理相结合。每次切换软件源后最好执行一次sudo apt clean sudo apt update不清理缓存的话有时候 apt 会拿旧的索引文件和新的仓库数据对比出现奇怪的Hash Sum mismatch错误。这个问题在老机器上尤其容易碰到因为网络波动大索引文件下载一半就断掉的情况非常多。遇到这种错误不要慌先 clean 再 update往往一次就好。第三点是平时养成检查服务状态的习惯。修改源文件之后如果不知道改的是否正确可以先运行apt-get -o Acquire::http::Timeout10 update这种方式能快速测试当前源地址是否可达超时时间设置为 10 秒不会因为网络问题挂在那里太久。如果返回连接超时很大概率是源地址不可达这时候用浏览器手动访问源地址路径看看是否正常。还有一个细节是关于国产系统双源问题的。统信 UOS 和麒麟系统为了兼容性考虑可能在配置中同时启用多个官方源比如一个用于系统更新一个用于应用商店。应用商店的源通常由厂商内部机制管理不会体现在 sources.list 里。所以在改源后如果应用商店还能正常下载软件并不代表 apt 源已经生效调试时要把两套机制的日志分开看不要在应用商店里反复点下载来验证 apt 源的改动。结合我自己操作过的一台飞腾 FT-2000 处理器的设备来说在统信 UOS 桌面专业版上换成阿里源之后apt update 的时间从原来的十几分钟缩短到不到半分钟安装常用开发工具的速度基本和普通 Ubuntu 设备没有明显差别。这个体验上的改善是实打实的尤其在企业批量部署场景中几十台设备同时更新软件包换源前后的时间成本差距非常可观。如果你手里正好放着 arm64 的国产设备不妨按照上面步骤操作一遍。改之前做好备份改之后用 apt update 验证遇到问题按第 4 节的排查思路走剩下的交给时间就完了。等哪天你会想起来去观察一下源文件里的发行版代号和镜像路径的对应关系恭喜你你已经彻底搞清楚 Linux 软件源这套机制了。