尧图网站设计 尧图网站设计YAOTU DESIGN
ARTICLE DETAIL

资讯详情

深耕网站设计与一线实操的经验洞察。

arm64 Ubuntu 20.04 换清华源实测:绕过 ports 路径坑

arm64 Ubuntu 20.04 换清华源实测:绕过 ports 路径坑 用一块 arm64 开发板折腾 Ubuntu 20.04 系统时我第一次换清华源就翻车了。网上搜到的教程几乎全是在 x86_64 电脑上操作直接复制过来后apt update 报出一堆 404 和“架构不匹配”的警告。后来才明白arm64 的 Ubuntu 源和普通 PC 用的源根本不在同一条路径上——官方镜像仓库里对应的是ports.ubuntu.com而清华镜像站里对应的目录是ubuntu-ports/不是ubuntu/。这篇文章就把我换源的全过程、需要提前确认的事项、以及换完之后容易踩的坑完整记录下来给你一份可直接照做的参考。1. 为什么 arm64 设备换源比 x86 更容易踩坑1.1 ports 源和普通源到底差在哪Ubuntu 官方把软件源按架构分成了两类一类是archive.ubuntu.com主要服务 amd64 和 i386 这类“主流”架构另一类是ports.ubuntu.com服务 arm64、armhf、ppc64el、riscv64、s390x 这些“非主流”架构。这里的 “ports” 不是“端口”的意思而是官方对“移植架构”的称呼。你可以把它理解成两条不同的生产线产品版本都是 Ubuntu 20.04代号 focal但打包出来的二进制可执行文件面向的是不同 CPU 指令集。很多教程里只让你把archive.ubuntu.com替换成mirrors.tuna.tsinghua.edu.cn如果原样照搬用在 arm64 设备上apt 会去清华的ubuntu/目录下找 arm64 的包结果自然是找不到因为清华镜像站的ubuntu/目录只同步了 amd64 等架构arm64 的内容在ubuntu-ports/目录里。这是 arm64 换源最容易踩的第一个坑也是我一开始翻车的直接原因。还有一个细节官方源的域名和路径是“配对”的。http://ports.ubuntu.com/ubuntu-ports表示从 ports 服务器下载ubuntu-ports路径下的内容。换成清华源时域名和路径要一起换变成https://mirrors.tuna.tsinghua.edu.cn/ubuntu-ports少换一个都不行。有些文章只让你换域名但原来的路径仍然是archive.ubuntu.com/ubuntu这种写法在 sources.list 里看着像换了实际不成立。1.2 为什么我推荐清华源而不是其他镜像国内可用的 Ubuntu 镜像源有好几个清华、阿里云、中科大、华为云都有。清华源的优势在于同步频率高、带宽稳定而且在 arm64 这种非主流架构上ubuntu-ports目录的历史包袱少、目录结构清晰出问题的时候容易排查。阿里云的源同样有 arm64 支持路径是mirrors.aliyun.com/ubuntu-ports如果你对清华的访问速度不理想可以作为备选。但是你选哪个镜像源都应该遵循一个原则只在一个 sources.list 里保留一个镜像站的全部条目不要混写。我见过有人把focal、focal-updates、focal-security分别指向不同的镜像站这样做虽然偶尔也能用但是遇到依赖版本不一致时排查起来非常痛苦。比如focal-updates里某个包已经升级了而focal-security里还是旧版apt 的依赖解析器可能会在两者之间反复横跳。稳妥的做法是四个套件全部指向同一个镜像站的同一个基础路径。另外如果你用的是树莓派上的 Ubuntu Server或者是在 QEMU 里跑 arm64 虚拟机同样适用这套逻辑。只要是 arm64 架构无论你是物理机、虚拟机还是容器源路径都应该是ubuntu-ports。这一点和硬件型号无关只和架构有关。2. 动笔之前确认架构、版本和当前源状态2.1 三条命令确认硬件和系统版本更换源之前先用三条命令确认自己所在的系统环境。不要觉得多余我遇到过很多次“明明换好了却报错”的情况结果发现系统根本不是 Ubuntu 20.04或者机器实际跑的是 armhf 32 位。第一条命令dpkg --print-architecture如果是 arm64 架构输出就是arm64如果是旧版 32 位 ARM 设备输出可能是armhf。不同架构对应不同的源路径armhf 也可以使用ubuntu-ports但安装的软件包体系不同。第二条命令lsb_release -a这个命令会显示发行版版本和代号。Ubuntu 20.04 的代号是focal源路径里的版本号就要写focal。如果你装的是 22.04代号是jammy24.04 是noble。写错版本代号会导致 apt update 大范围 404因为镜像站里根本没有对应目录。第三条命令cat /etc/apt/sources.list看看当前源是什么状态。如果是官方默认源大概率是http://ports.ubuntu.com/ubuntu-ports开头的四行如果已经被别人改过了你至少要知道现在改成什么样方便回滚。2.2 备份 sources.list 的正确姿势改系统配置文件前一定要备份这是老生常谈但真正做到的人不多。我见过直接在源文件里删删改改改坏了又不知道原始内容是什么最后只能重装系统的惨案。备份命令很简单sudo cp /etc/apt/sources.list /etc/apt/sources.list.bak.$(date %Y%m%d)$(date %Y%m%d)会自动拼上日期比如sources.list.bak.20250401。这样就算改坏了也能轻松回滚。回滚方法是最简单的恢复文件sudo cp /etc/apt/sources.list.bak.20250401 /etc/apt/sources.list注意备份文件不要放在/etc/apt/之外也不要放在系统临时目录以免被清理工具误删。直接在/etc/apt/下加后缀名是最稳妥的。2.3 看看还有什么隐藏的源文件Ubuntu 系统里除了/etc/apt/sources.list还有一个/etc/apt/sources.list.d/目录里面可以放额外的.list文件。如果你之前装过第三方软件源比如 Docker、某个 PPA 对应的源它们就躺在那里。换源的时候很多人只改了主文件漏掉了这个目录里的源结果 apt update 的时候仍然有一堆连接超时的报错。检查这个目录ls -l /etc/apt/sources.list.d/ grep -rh ^deb /etc/apt/sources.list.d/ 2/dev/null如果里面有非官方源你要判断当前是否需要保留。比如安装了 Docker CE它的源指向download.docker.com这个源和 Ubuntu 系统源是两码事不需要跟着换。但如果里面有指向ports.ubuntu.com的残留文件就要一并处理。判断标准很简单只要这条源指向的是 Ubuntu 官方仓库就要一并替换成清华源指向第三方软件官方仓库的保持原样。3. 更换清华源的完整操作3.1 方式一直接重写 sources.list推荐我最推荐的方式是直接用 root 权限打开源文件把内容清空后写上以下四行deb https://mirrors.tuna.tsinghua.edu.cn/ubuntu-ports/ focal main restricted universe multiverse deb https://mirrors.tuna.tsinghua.edu.cn/ubuntu-ports/ focal-updates main restricted universe multiverse deb https://mirrors.tuna.tsinghua.edu.cn/ubuntu-ports/ focal-backports main restricted universe multiverse deb https://mirrors.tuna.tsinghua.edu.cn/ubuntu-ports/ focal-security main restricted universe multiverse不用动deb-src那几行除非你确实需要下载源码包来编译。后面我会专门说说我对deb-src的看法。关于main restricted universe multiverse这几个组件解释一下mainUbuntu 官方完全支持的自由软件也是系统核心组件所在。restricted官方支持但许可证不完全自由的软件比如部分显卡驱动。universe社区维护的自由软件数量最大你在 Ubuntu 软件中心里看到的绝大多数应用都来自这里。multiverse带专利或版权限制的非自由软件比如一些解码器。通常情况下一行里把这四个都写上不会有问题。如果你的磁盘空间或网络带宽实在有限只想装最基本的系统组件可以只留main但日常使用不建议这样做因为很多时候装一个软件会依赖universe里的库少一个组件就可能装不上。3.2 方式二用 sed 批量替换如果原来的 sources.list 里已经写好了完整的官方源只是想把域名和路径替换掉用 sed 批量替换是最快的。针对 arm64 设备原文件里的地址基本都是http://ports.ubuntu.com/ubuntu-ports执行sudo sed -i s|http://ports.ubuntu.com/ubuntu-ports|https://mirrors.tuna.tsinghua.edu.cn/ubuntu-ports|g /etc/apt/sources.list这里用了|作为分隔符而不是常见的/因为原地址里带了多个/用|可以避免转义的麻烦。-i参数表示直接修改文件g表示全局替换。替换完成后最好打开文件检查一遍cat /etc/apt/sources.list确保没有残留的ports.ubuntu.com地址也确保没有因为路径拼接错误出现双斜杠或域名错误。我遇到过 sed 没匹配上、结果文件完全没变化的情况所以替换后一定要用 cat 或 grep 确认。3.3 官方源条目逐行解读很多人直接把网上的源条目复制进去但不知道每一行到底在干什么出了问题也不知道怎么改。我拿默认源里的第一条来说明deb http://ports.ubuntu.com/ubuntu-ports focal main restricted universe multiversedeb声明这是一个二进制软件包源也就是 apt 用来下载并安装.deb包的。http://ports.ubuntu.com/ubuntu-ports源的基础 URL。apt 会在这个地址后面拼接dists/focal/main/binary-arm64/Packages.gz这样的索引文件路径。focal发行版代号。main restricted universe multiverse仓库组件。后面的focal-updates是“更新版软件包”一般包含 bug 修复、安全修复之外的功能更新focal-backports是“向后移植”把新版软件移植到旧发行版上默认情况下优先级比较低不会轻易升级系统组件focal-security是安全更新这个和focal-updates有部分重叠但必须保留因为安全补丁是单独发布的。在清华源的完整条目里URL 变成https://mirrors.tuna.tsinghua.edu.cn/ubuntu-ports/后面同样拼接dists/focal/...。你把清华源写好后可以用浏览器或者curl访问一下https://mirrors.tuna.tsinghua.edu.cn/ubuntu-ports/dists/focal/Release如果能返回内容说明路径没问题。4. 更新验证与实测效果4.1 apt update 输出如何判断成功改完源文件后执行更新sudo apt update看到大量Hit表示索引文件从缓存中获取Get表示从源站实际下载了索引文件。只要没有Err、404、Connection failed基本就是成功了。在等待过程中注意观察输出里出现的域名应该全部是mirrors.tuna.tsinghua.edu.cn。如果某个条目仍然显示连接到ports.ubuntu.com说明有残留源文件没改干净。我还见过一种情况换源后 update 输出正常但显示Ign而不是Hit/Get。Ign通常表示忽略某个索引文件比如Translation-en这类本地化语言包缺失。大多数情况下可以忽略但如果数量很多、并且伴随报错需要排查是不是你的组件名写错了。如果 update 结束时有这样的提示W: Target Packages (main/binary-arm64/Packages) is configured multiple times说明同一个源地址被重复写了可能同时存在于sources.list和sources.list.d目录下的文件里。你需要删掉其中一份。4.2 用一个小包做下载测速源换好之后我习惯下载一个小软件包测一下速度和完整性比如sudo apt install -y htophtop 是一个轻量的系统监控工具依赖很少适合测试。下载时观察速度如果速度还是几十 KB/s那可能当前网络环境到清华的链路并不理想可以换阿里云或其他镜像再试。如果下载之后能正常安装说明源没问题。另外apt update只下载了软件包的索引真正从镜像站拉取.deb文件是在apt install时候。所以测速一定要通过实际安装包来测不能只看 update 的速度。注意在apt update之后你可能看到提示“可升级 X 个软件包”不要急着执行apt upgrade。特别是嵌入式开发板或正在用的生产机器软件包升级可能导致内核、驱动或交叉编译工具链发生变化建议确认完源可用后就停止。4.3 如何排查 404、NO_PUBKEY、架构不匹配换源常见的三类报错我分别说下排查思路。404 Not Found如果 update 时出现404 Not Found通常有两种原因一是路径里版本代号写错比如系统是 21.10你却写了focal二是把 arm64 的源路径写成了普通源路径。先确认系统版本cat /etc/os-release然后对照清华镜像站上的目录列表确认你使用的代号和路径是否存在。清华镜像站的网页目录可以直接浏览很方便。NO_PUBKEY如果出现类似The following signatures couldnt be verified because the public key is not available: NO_PUBKEY xxxxxxxx说明 apt 在验证某个源签名时找不到对应的公钥。更换清华源通常不会引发这个问题因为清华大学镜像站会同步 Ubuntu 官方的 Release 签名公钥在ubuntu-keyring包里自带。出现这种情况大概率是系统里ubuntu-keyring太旧或者曾经删除过密钥。简单处理方式是sudo apt-key adv --keyserver keyserver.ubuntu.com --recv-keys xxxxxxxx不过我要提醒一句apt-key在较新版本里已经被标记为 deprecated弃用20.04 上还能用但如果你以后升级到 Ubuntu 22.04 或 24.04建议使用/etc/apt/keyrings加signed-by的方式管理第三方源密钥。针对清华源本身一般不需要额外导入密钥。架构不匹配如果 update 时有提示Skipping acquire of configured file main/binary-arm64/Packages as repository ... doesnt support architecture arm64说明你写的源地址指向的仓库里没有 arm64 的包。这是最典型的“把 amd64 源当成 arm64 源用”的症状。检查 sources.list确认路径是ubuntu-ports而不是ubuntu。5. 换源后的两个隐藏问题基于实际踩坑5.1 别忽略 sources.list.d 下的第三方源前面提到过/etc/apt/sources.list.d/我在实际操作中吃过一次亏一台装了 ROS 的 arm64 板子换完主源后 update 依然非常慢排查了半天才发现/etc/apt/sources.list.d/ros-latest.list里写的是http://packages.ros.org/ros/ubuntu这个源在国外连接不稳定。这个当然不能改成清华 Ubuntu 源因为它是第三方软件源正确的做法是到 ROS 官方或镜像站找对应的国内镜像。所以换完源之后如果 update 还有超时报错别急着怪清华源先确认报错域名到底是什么。一条一条地看是mirrors.tuna.tsinghua.edu.cn还是别的域名。对症下药比一概而论重要得多。5.2 deb-src 要不要保留默认的 sources.list 里通常把deb-src条目注释掉了因为普通用户用不到源码包。如果你只做应用安装和系统维护不需要打开。但如果你是做嵌入式开发或交叉编译的比如安装 PetaLinux 时需要从源码编译某些依赖或者你想自己编译某个库并调试那可以把对应的deb-src打开。打开方法很简单把下面的行解除注释deb-src https://mirrors.tuna.tsinghua.edu.cn/ubuntu-ports/ focal main restricted universe multiversedeb-src用来下载软件的源代码包而不是编译好的二进制包。打开后apt update会额外拉取源码索引时间会变长一些。如果你不确定是否需要建议保持注释状态用到的时候再打开。5.3 混合架构依赖问题提醒arm64 设备上有时会遇到“多架构依赖”问题。比如你想运行某些只提供 32 位 armhf 版本的软件就需要添加 armhf 架构sudo dpkg --add-architecture armhf sudo apt update添加之后dpkg --print-foreign-architectures会输出armhf。这时 apt 会在同一个源里同时寻找 arm64 和 armhf 两种架构的包。清华的ubuntu-ports同时同步这两种架构所以依然适用。但是我不建议在没有任何需求的情况下随便添加多架构支持因为这会让 apt 的依赖解析复杂度大幅增加有时软件包冲突会把你折腾到崩溃。如果你只是普通使用保持单一 arm64 架构即可。6. 针对嵌入式与 arm64 开发场景的额外建议6.1 交叉编译工具链安装示例换好清华源之后最直接的好处是安装交叉编译工具链速度快了很多。在 Ubuntu 20.04 上编译 ARM 程序通常需要安装sudo apt install -y gcc-aarch64-linux-gnu g-aarch64-linux-gnu这两个包提供了名为aarch64-linux-gnu-gcc的交叉编译器可以在 x86_64 电脑上编译出 arm64 架构的可执行程序。如果你还需要模拟运行可以安装qemu-user-staticsudo apt install -y qemu-user-static装完之后可以通过qemu-aarch64-static直接运行 arm64 的程序配合binfmt_misc甚至可以直接在 x86_64 系统上执行 arm64 的二进制文件。这些包在清华源里都有安装速度明显比官方源快。6.2 PetaLinux 与 QEMU 场景下的源配置热词里有人提到 Ubuntu 20.04 安装 PetaLinux 及 Zynq7000 交叉编译工具。PetaLinux 对 Ubuntu 20.04 的依赖要求比较挑剔安装前需要确认系统里有libncurses5-dev、libncursesw5-dev、libssl-dev、libtinfo-dev、zlib1g-dev、build-essential、gcc-multilib等一堆包。这些包大多数都位于main和universe组件里所以换源时一定不要只留main否则安装依赖时会出现一堆 “Unable to locate package” 的错误。我自己的经验是PetaLinux 的依赖装好之后尽量不要执行apt upgrade升级系统级库因为 PetaLinux 对 glibc、gcc 版本非常敏感升级后很可能直接导致构建失败。源用来下载依赖就够了系统版本保持在一个稳定状态更重要。6.3 可以留作备用的其他国内镜像源清华源虽然稳定但不能保证任何时间、任何网络下都是最快的。我通常会在/etc/apt/sources.list里保留一套源然后把其他备选源地址记录在笔记里而不是同时写进去。备选方案包括阿里云https://mirrors.aliyun.com/ubuntu-ports/中科大https://mirrors.ustc.edu.cn/ubuntu-ports/华为云https://mirrors.huaweicloud.com/ubuntu-ports/如果某一天清华源因为网络原因连接不稳定你可以用 sed 把 sources.list 里的域名整体替换成其他镜像站的域名替换后记得apt update。这种方法比手动逐行修改高效得多。最后再分享一个小习惯每次换完源我都不会立刻去装大软件而是先装一个小包比如 htop验证链路然后做一次apt update和apt list --upgradable看看有哪些包可升级但不会贸然upgrade。这样做能最大程度避免换源引发的连锁问题。毕竟换源的目的是让系统更好用而不是为了折腾而折腾。
返回列表