跳转到内容

软件源与国内镜像:apk 与 opkg 分开,别混 release/target/ABI

先记住一句话:apk 与 opkg 的区别首先是固件版本,不是“哪个源更快”。25.12 用 apk,24.10 用 opkg;包格式、源路径和校验方式都不同,不能互换。

  • 你的固件用 apk 还是 opkg,以及对应的源文件在哪里;
  • release、target、架构、kmods 内核 hash 必须怎么匹配;
  • 国内镜像替换的是哪一段 URL,哪些路径不能改;
  • 为什么“换源后插件装不上/依赖不匹配”,以及怎么恢复;
  • 为什么 apk upgrade/opkg upgrade 不是固件升级。
路由器 Shell读取版本、target 和架构
终端窗口
ubus call system board
cat /etc/openwrt_release
uname -m
cat /etc/apk/arch 2>/dev/null
opkg print-architecture 2>/dev/null

关键字段:release.version、release.target、DISTRIB_ARCH、release.revision。换源时这些必须和镜像目录一致。

预期你能写出完整的 release/target/arch 组合。

路由器 Shell看当前源文件

OpenWrt 25.12(apk):

终端窗口
cat /etc/apk/repositories.d/distfeeds.list

OpenWrt 24.10(opkg):

终端窗口
cat /etc/opkg/distfeeds.conf
cat /etc/opkg/customfeeds.conf

先备份再改:

终端窗口
cp /etc/apk/repositories.d/distfeeds.list /etc/apk/repositories.d/distfeeds.list.bak.$(date +%F) 2>/dev/null || true
cp /etc/opkg/distfeeds.conf /etc/opkg/distfeeds.conf.bak.$(date +%F) 2>/dev/null || true

预期知道每个 feed 指向哪里,以及是 apk 还是 opkg。

25.12 使用 apk,feed 索引是 .adb,包是 .apk。典型 feed 包括:

  • targets/<target>/packages/packages.adb:目标设备包;
  • packages/<arch>/base/packages.adb:base;
  • packages/<arch>/luci/packages.adb:LuCI;
  • packages/<arch>/packages/packages.adb:普通软件包;
  • packages/<arch>/routing|telephony|video/packages.adb:分类 feed;
  • targets/<target>/kmods/<kernel-hash>/packages.adb:内核模块,hash 必须匹配当前内核。

常用命令:

终端窗口
apk update
apk search <name>
apk add <name>
apk info -e <name>

不要用 opkg 命令,也不要把 24.10 的 .ipk 改名成 .apk。

24.10 使用 opkg,索引是 Packages.gz,包是 .ipk:

终端窗口
opkg update
opkg list | grep <name>
opkg install <name>
opkg list-installed | grep <name>

不要用 apk 命令,也不要把 25.12 的 .apk 塞给 opkg。

如果你搜的是“OpenWrt 国内镜像”或“OpenWrt 软件源国内镜像”,先确认 release/target/架构;下面以清华 TUNA 为例。

这里的“镜像”指软件源镜像站(mirror),不是固件系统镜像;国内镜像只改变下载地址,不改变包内容。

以清华 TUNA 为例,镜像根是:

https://mirrors.tuna.tsinghua.edu.cn/openwrt/

替换时只把 https://downloads.openwrt.org 换成上面的根,保留后面的完整路径:

https://downloads.openwrt.org/releases/25.12.6/targets/x86/64/packages/packages.adb
→ https://mirrors.tuna.tsinghua.edu.cn/openwrt/releases/25.12.6/targets/x86/64/packages/packages.adb

不要只保留 .../openwrt/ 或删掉 releases/25.12.6/targets/x86/64/...;路径不完整就会 404。

路由器 Shell先验证镜像路径,再改源
终端窗口
curl -I https://mirrors.tuna.tsinghua.edu.cn/openwrt/releases/25.12.6/targets/x86/64/packages/packages.adb

把 URL 换成你的 release/target;如果是 kmods,还要确认内核 hash 一致。镜像站没有对应路径时,不要硬改。

预期curl 返回 200,路径与当前 release/target 一致。

路由器 Shell替换后只更新索引,不升级全系统
终端窗口
apk update
# 或
opkg update

先 apk search/opkg list 确认能读到包,再安装你真正需要的包。不要把 apk upgrade/opkg upgrade 当成固件升级;固件升级用 sysupgrade/ASU/owut,见 019。

预期apk/opkg update 成功,现有包不被批量升级。

  • release 版本写错(25.12.6 vs 24.10.8);
  • target 写错(x86/64 不是 x86_64 目录);
  • 架构写错(x86_64、aarch64);
  • 镜像没有同步该路径;
  • 把 packages 和 targets 目录混了。
  • 镜像索引损坏或不是同一 release;
  • 系统时间/证书错误;
  • 混入了别的源;
  • 不要长期用 --allow-untrusted 绕过;先修源和校验。
  • kmods 的内核 hash 不匹配;
  • 包是为另一个 target/架构构建的;
  • 混用了 ImmortalWrt/iStoreOS/官方源;
  • 需要同源、同版本、同架构的包,或自行编译。
  • 25.12 没有 opkg,24.10 没有 apk;
  • 不要为了“用某个命令”去装错的包管理器;先确认固件版本和来源。
  • 只装了核心包,没装 luci-app-*;
  • 语言包没装;
  • 浏览器缓存/需要刷新;
  • 包版本与 LuCI 不匹配。
终端窗口
# apk
cp /etc/apk/repositories.d/distfeeds.list.bak.YYYY-MM-DD /etc/apk/repositories.d/distfeeds.list
apk update
# opkg
cp /etc/opkg/distfeeds.conf.bak.YYYY-MM-DD /etc/opkg/distfeeds.conf
opkg update

如果换源后完全无法更新,先恢复官方源,确认 DNS/时间/证书正常,再尝试镜像;不要连续换多个源。

  • 环境:OpenWrt 25.12.6 x86 VM 200;apk;官方源与 TUNA 镜像。
  • 官方源 apk update:OK: 11220 distinct packages available;apk search -x sqm-scripts 找到 sqm-scripts-1.7.2-r1。
  • 切 TUNA:apk update 同样 11220;apk add sqm-scripts 成功安装 1.7.2-r1。
  • 恢复官方源:apk update 正常,最终 feed 回到 downloads.openwrt.org。
  • 未测:24.10 的 opkg、签名错误、混源/ABI 不匹配、镜像索引损坏。
  • 配方:tests/recipes/package-sources.md。
  • 本页是 E2 partial:25.12 apk 的官方源/TUNA/安装/恢复已实测;opkg 和错误源分支仍是文档步骤。
  • 镜像路径会随 release 变化;发布前在目标 release/target/arch 上再跑一次 update/search。
  • 不要混用官方、ImmortalWrt、iStoreOS 的源;ABI/内核/签名都可能不匹配。

来源

Router.Homes

独立的 OpenWrt 实操笔记。每页写明固件、设备、包管理器与恢复路径。

图标:Solar by 480 Design, CC BY 4.0