ARTICLE · INTELLIGENCE

战地情报 · 详情页

来自尧图项目组的一线实战观察与深度解析

Ubuntu 22.04 配置 ROS 源报错 Release 文件缺失排查与修复

Ubuntu 22.04 配置 ROS 源报错 Release 文件缺失排查与修复 最近后台收到好几位朋友发来同一条报错都卡在 Ubuntu 22.04 配置 ROS 源这一步E: The repository http://mirrors.ustc.edu.cn/ros/ubuntu jammy Release does not have a Release file。这行字第一次看到很容易慌因为报错里既提到了仓库地址又提到了jammy还扯上Release看起来像是中科大镜像站挂了或者自己的源写错了。但这行字的真正含义是APT 在指定地址下找不到仓库索引文件。这篇文章不打算只给你一个“复制粘贴就能跑”的答案而是把这条报错拆开讲清楚Release 文件是什么、为什么会缺失、怎么一步步定位到你机器上的具体原因最后再给出一套在 Ubuntu 22.04 上装 ROS 2 Humble 的完整可用配置。无论你是刚接触 ROS 的小白还是被 apt 源折磨过几次的老手按这篇文章的思路走一遍基本都能把问题解决。1. 先把报错看明白Release 文件在 APT 源里到底扮演什么角色很多人拿到这个报错第一反应是“网络不通”或者“中科大镜像挂了”然后去 ping 域名、换源折腾半天还是同样的错。问题其实不在网络而在 APT 的工作方式。APT 每次执行sudo apt update时并不直接到服务器上遍历 deb 包而是先去每个源地址下找这个仓库的索引文件。这个索引文件的名字就叫Release。它放在仓库目录的dists/版本代号/下面例如中科大 ROS 源对应的就是http://mirrors.ustc.edu.cn/ros/ubuntu/dists/jammy/ReleaseRelease 文件本身是一个纯文本里面写了这个仓库支持哪些组件比如 main、支持哪些架构amd64、arm64、armhf、每个文件的校验哈希值以及仓库的版本代号。APT 拿到 Release 后会继续下载同目录下的Packages文件把包的元数据在本地建立索引。如果第一步连 Release 都没拿到APT 就会认为这个仓库不可用直接报出 “does not have a Release file”。把它比作去超市购物Release 文件是门口那张“商品分区导览”Packages 文件是按导览整理的“货架清单”真正的 .deb 包才是货架上的商品。你到门口发现连导览都没有自然不会硬着头皮往里走。APT 这种做法其实是为了安全如果一个仓库连最基本的索引都无法完整提供那它后续所有的包都可能是不完整或被篡改的干脆从一开始就拒绝。所以报错信息里出现的jammy Release其实是 APT 把源地址、系统版本代号、Release 文件名拼在一起之后给你的一个提示。真正向你抛出问题的是那个 URL 路径下确实没有 release 文件。搞清楚这一点排查思路就清晰了不是网络问题而是“你配置的这个仓库在服务器上根本没有对应的目录结构”。1.1 缺少 Release 文件的几种常见原因我这些年见过类似报错原因基本跑不出下面四类第一源地址路径写错。最常见的是把 ROS 1 的仓库地址和 ROS 2 的地址搞混。ROS 1 的二进制源通常在/ros/ubuntu下ROS 2 的在/ros2/ubuntu下。如果你在安装 ROS 2 时用了/ros/ubuntuAPT 访问到的就是一个对应关系不同的仓库服务器上或许根本不存在dists/jammy/Release或者存在但内容和 ROS 2 无关。第二系统版本代号和仓库支持的版本对不上。每个 ROS 发行版都只针对特定 Ubuntu 版本发布二进制包比如 ROS 1 Noetic 只面向 Ubuntu 20.04focalROS 2 Humble 面向 Ubuntu 22.04jammy。如果你拿着 Noetic 的安装命令在 22.04 上硬套源地址里写的是 jammy但上游仓库没有 jammy 的 Release 文件自然报错。第三镜像站同步不完整或暂未同步对应目录。国内镜像源和官方源之间是定期同步关系有些目录同步较早有些较晚。如果你恰好赶上同步间隙或者镜像站出于合规、维护等原因暂未同步某个发行版目录也会出现 Release 404。第四系统里残留了多余的旧源文件。/etc/apt/sources.list.d/下可能躺着几个不同时期添加的.list文件比如已经失效的 ROS 1 源、过时的第三方源甚至安装系统时留下的 cdrom 源。APT 会把这些源全部尝试一遍任何一个失效都可能中断你的 update 流程。这四类原因不是每次都独立出现经常叠加。尤其是新人装 ROS往往照着一篇教程写源接着又按另一篇教程改源最后/etc/apt/sources.list.d/下面堆了好几个互相矛盾的源文件。报错就变成“这个源没有 Release那个源没签名还有一个 404”特别劝退。2. 源头排查你的 sources 列表到底哪里出了问题遇到这种报错不建议一上来就删文件重来。先做几个只读检查确认问题出在哪个层面因为不同原因的修复方式完全不同。2.1 第一步确认系统版本代号和架构打开终端依次执行lsb_release -a dpkg --print-architecture第一行输出里的Codename就是当前系统的版本代号。如果显示jammy说明你是 Ubuntu 22.04如果显示focal那是 20.04。第二行会告诉 APT 当前架构通常 x86 电脑输出amd64ARM 开发板输出arm64或armhf。这一步很多人会跳过但它能直接排除版本不匹配问题。ROS 源虽然是同一个域名但不同版本对应的目录完全不一样。官方甚至专门为不同 Ubuntu 版本做了不同目录dists/jammy和dists/focal互不相通。确认好这两个值之后再去看 ROS 版本对应关系就有据可查了。2.2 第二步找出系统里所有 ROS 相关源执行grep -rn ros /etc/apt/sources.list /etc/apt/sources.list.d/这条命令会打印出所有包含ros关键字的源配置行。我见过很多机器上/etc/apt/sources.list.d/下面同时存在ros1.list、ros2.list、ros-latest.list等多个文件有些是教程让他创建的有些是脚本自动生成的。多源并存不是不能运行但前提是每个源都有效。如果其中有失效的源APT 会先报失效源的问题然后中断整个 update 流程看起来就像所有源都坏了。如果 grep 结果里出现了你不认识的文件可以先看一下文件内容再决定是注释还是删除。不要直接rm -rf整个目录万一是系统自带的源删了之后连正常软件都装不了。2.3 第三步直接验证 URL 是否真的不存在这一步能帮你在 10 秒内判断是不是镜像同步问题。拿最开始的报错地址去掉提示信息拼出真实 URLcurl -I http://mirrors.ustc.edu.cn/ros/ubuntu/dists/jammy/Release如果返回200 OK说明服务器上这个文件存在问题出在本地源配置写法如果返回404 Not Found说明服务器上确实没有这个文件那就要考虑换镜像站或者换仓库路径。这个方法同样适用于其他镜像。比如你想确认清华源有没有 ROS 2 的 jammy 目录就把地址改成curl -I https://mirrors.tuna.tsinghua.edu.cn/ros2/ubuntu/dists/jammy/Release看到404也别立刻失望有可能是该镜像把 ROS 2 源放在别的路径下。可以再用浏览器打开镜像站首页看看目录结构。镜像站和官方源的目录不一定完全一样以实看为准。2.4 第四步检查源文件格式是否缺少组件sources.list 的每行格式是deb [选项] 仓库地址 版本代号 组件名其中组件名是必须的ROS 源通常是main。如果你只写了deb http://mirrors.ustc.edu.cn/ros/ubuntu jammy没有mainAPT 虽然也会去尝试读取 Release但后续解析会出问题。更常见的错误是把版本代号和组件写反或者漏掉main导致 APT 请求了一个不存在的目录结构。检查自己的源配置行确认格式完整deb [arch$(dpkg --print-architecture)] http://mirrors.ustc.edu.cn/ros/ubuntu $(lsb_release -cs) main$(lsb_release -cs)是动态获取系统版本代号如果这条命令在终端里能正常输出jammy那源配置行就会自动变成jammy main格式是正确的。3. 修复实操Ubuntu 22.04 ROS 2 Humble 的完整可用配置排查完之后我们来动手修复。下面这套流程我反复用过针对的是最普遍的痛点Ubuntu 22.04 上装 ROS 2 Humble但之前照着 ROS 1 教程或者旧版教程写错了源。整个流程按“备份 → 清理 → 加 key → 写源 → 更新 → 安装 → 验证”展开。3.1 清理旧源做好备份在改任何文件之前先备份这是最基本的习惯。sudo cp /etc/apt/sources.list /etc/apt/sources.list.bak sudo mkdir -p /etc/apt/sources.list.d.bak sudo cp /etc/apt/sources.list.d/*.list /etc/apt/sources.list.d.bak/备份完成之后把之前定位到的 ROS 相关失效源文件清理掉。如果是你自己创建的可以直接删除sudo rm /etc/apt/sources.list.d/ros1.list sudo rm /etc/apt/sources.list.d/ros-latest.list如果只是不确定要不要删也可以注释掉。编辑器打开文件在对应行首加#保存即可。同时检查一下/etc/apt/sources.list里有没有安装系统时留下的 cdrom 源。这类源在系统装完后基本就没用了却经常导致 apt update 时出现版本的 Release 报错。看到cdrom:开头的行同样用#注释掉。3.2 安装依赖工具并导入 ROS 官方 keyROS 源是带签名验证的APT 需要拿到对应的 GPG key 才能校验包。Ubuntu 22.04 推荐把 key 放到/usr/share/keyrings/下然后在源配置里用signed-by指定而不是老的apt-key add方式。先确保基础工具存在sudo apt update sudo apt install -y curl gnupg lsb-release个别机器刚装完系统apt update本身可能也因为源问题报错。如果卡在这里先打开“软件和更新”把下载源切换成国内镜像再回来继续。导入 ROS 2 的官方 keysudo curl -sSL https://raw.githubusercontent.com/ros/rosdistro/master/ros.key -o /usr/share/keyrings/ros-archive-keyring.gpg如果你所在网络访问raw.githubusercontent.com不稳定可以试试用 gitee 上的镜像仓库下载同一个文件或者直接使用下方国内一键脚本帮你完成 key 导入。核心目标是让/usr/share/keyrings/ros-archive-keyring.gpg这个文件存在且内容有效。3.3 写入正确的 ROS 2 源接下来是核心步骤。写源时务必确认路径里有ros2而不是rossudo tee /etc/apt/sources.list.d/ros2.list /dev/null EOF deb [arch$(dpkg --print-architecture) signed-by/usr/share/keyrings/ros-archive-keyring.gpg] http://packages.ros.org/ros2/ubuntu $(lsb_release -cs) main EOF这一行配置了几个关键信息arch限定当前机器架构signed-by指定刚才导入的 key 文件仓库地址是 ROS 2 官方源版本代号动态获取。如果你更习惯国内镜像可以把地址换成中科大或者清华deb [arch$(dpkg --print-architecture) signed-by/usr/share/keyrings/ros-archive-keyring.gpg] http://mirrors.ustc.edu.cn/ros2/ubuntu $(lsb_release -cs) main注意镜像站的路径同样要确认存在。我建议先手动访问一下镜像站的目录页确认有ros2/ubuntu再写入不然换了镜像还是同样报错。3.4 更新索引并安装 ROS 2写完源后正式执行一次更新sudo apt update如果一切正常你会看到 APT 开始读取 ROS 2 仓库的索引不再报 Release 问题。如果系统里之前残留过失败的缓存先清理再更新sudo apt clean sudo rm -rf /var/lib/apt/lists/* sudo apt update接着安装 ROS 2 Humble。想体验完整桌面功能装desktopsudo apt install ros-humble-desktop硬盘或性能受限可以只装基础通信sudo apt install ros-humble-ros-base安装时间取决于网络和机器性能一般几分钟到十几分钟不等。装完之后把环境变量写入 shell 配置echo source /opt/ros/humble/setup.bash ~/.bashrc source ~/.bashrc验证安装是否成功ros2 --help能正常输出命令列表说明核心环境已经没问题。再进一步可以跑一个简单示例ros2 run demo_nodes_cpp talker另一个终端用ros2 run demo_nodes_cpp listener看到双方有来回通信ROS 2 环境就算跑通了。3.5 ROS 1 和 ROS 2 源的版本对应关系顺便给一张版本对应表方便以后查ROS 发行版源路径主要支持的 Ubuntu对应代号Noetic (ROS 1)/ros/ubuntu20.04focalFoxy (ROS 2)/ros2/ubuntu20.04focalHumble (ROS 2)/ros2/ubuntu22.04jammyRolling (ROS 2)/ros2/ubuntu22.04, 滚动更新jammy 等如果你确实需要在 22.04 上运行 ROS 1 Noetic官方二进制源帮不了你因为上游只发布了 focal 版本。这时候要么使用 Docker 镜像跑一个 20.04 容器要么通过源码编译第三方 ROS 1 实现。别指望往源里塞 jammy 就能解决那不是 apt 的锅。4. 高频问题与避坑速查配置 ROS 源这件事很多人不是死在安装而是死在各种边角问题上。我把实际遇到的高频问题列成一个速查表方便你对照定位。现象可能原因处理方式does not have a Release file且地址含/ros/ubuntu使用了 ROS 1 源路径但当前系统或需求是 ROS 2把源路径改成/ros2/ubuntu重新 updatedoes not have a Release file且地址含jammy但你系统是 20.04版本代号写死系统版本与仓库不匹配改用$(lsb_release -cs)或写正确的代号focaldoes not have a Release file地址含cdrom安装系统时留下的原始终端源注释或删除cdrom:行... is not signedkey 未导入或未用signed-by指定重新导入 ros.key并确认源行包含signed-by404 ... Release出现在镜像站镜像尚未同步该 Ubuntu 版本的 ROS 目录换官方源或换另一个镜像站apt update后部分源正常、部分报错/etc/apt/sources.list.d/下有多个失效源文件逐个检查.list文件注释失效项lsb_release -cs返回unknown系统未安装lsb-release或环境异常先安装lsb-release或者手动写版本代号还有一个经常和 apt 报错混淆的问题在执行 git 相关命令时出现了fatal: not a git repository (or any of the parent directories): .git。这和仓库源没有任何关系只是你在一个不是 git 仓库的目录里执行了git pull或git status。先确认当前目录是否已经被git init或者是否应该先cd到目标仓库目录。这类问题虽然不在 apt 范围但很多人装 ROS 时会同时操作代码仓库看到终端里一堆英文就一起拿来问这里顺手说明一下。关于“鱼香ROS一键安装”很多搜到这个词的朋友图省事想用它直接装完 ROS。这个工具确实能帮你自动检测系统版本、配置源、导入 key、安装指定 ROS 版本对初学者的友好度很高。如果你赶时间或者被源折腾烦了用一键脚本是可行的。但我不建议完全黑盒依赖它至少理解它替你做了什么不然以后再遇到 gazebo、cartographer 的第三方源问题还是不会排查。看脚本执行日志你会发现它做的事和上面手动流程几乎一样备份源、删旧源、写新源、导入 key、update、安装。手动走一遍等于给后面避坑打好底子。再补一个容易被忽略的点ROS 源里的signed-by指定的 key 文件路径必须真实存在。有些教程会写成/usr/share/keyrings/ros-archive-keyring.gpg但实际下载时因为网络原因文件没落地APT 更新时就报签名问题。检查文件是否存在ls -l /usr/share/keyrings/ros-archive-keyring.gpg确认文件存在且大小不是 0再跑 update。最后聊聊镜像选择和源残留。国内可用镜像不少中科大、清华、阿里云各有各的同步节奏。不要盲目认定某一个“永远稳定”。我今天写这篇文章时中科大的 ROS 源可能正常过几个月因为维护、迁移或者同步策略调整某个目录就可能暂时不可用。学会用curl -I验证 URL远比背下来一串固定源地址更重要。我在实际配置中发现最坑的其实不是写错一个源而是不知道系统里还留着多少历史遗留的源文件。有一次帮朋友排查他在/etc/apt/sources.list.d/里同时有四个.list文件分别来自四次不同教程其中两个已经失效。平时不跑apt update的时候岁月静好一更新就整屏报错。所以每当我遇到 apt 相关问题时第一件事永远是先看报错第二行里提到的仓库地址再去/etc/apt/sources.list.d/里找到对应的文件而不是全局乱猜。修改源之后也建议先只跑sudo apt update确认所有仓库都正常再放心执行sudo apt install。这样每一步的失败成本都很低报错也能立刻锁定到具体源文件上。把前面这些排查方法养成习惯以后遇到第三方软件源出问题你也能用同样的思路快速定位。ROS 源并不是什么特殊东西它和所有 apt 源遵循同一套规则Release 文件在仓库就正常Release 文件不在就要看路径、版本、架构和同步状态。
RELATED READING

延伸阅读

更多一线实战笔记与深度复盘,助您持续精进