软件源与国内镜像:apk 与 opkg 分开,别混 release/target/ABI
先记住一句话:apk 与 opkg 的区别首先是固件版本,不是“哪个源更快”。25.12 用 apk,24.10 用 opkg;包格式、源路径和校验方式都不同,不能互换。
完成后你能确认什么
Section titled “完成后你能确认什么”- 你的固件用
apk还是opkg,以及对应的源文件在哪里; release、target、架构、kmods 内核 hash 必须怎么匹配;- 国内镜像替换的是哪一段 URL,哪些路径不能改;
- 为什么“换源后插件装不上/依赖不匹配”,以及怎么恢复;
- 为什么
apk upgrade/opkg upgrade不是固件升级。
先识别包管理器和源
Section titled “先识别包管理器和源”ubus call system boardcat /etc/openwrt_releaseuname -mcat /etc/apk/arch 2>/dev/nullopkg print-architecture 2>/dev/null关键字段:release.version、release.target、DISTRIB_ARCH、release.revision。换源时这些必须和镜像目录一致。
预期你能写出完整的 release/target/arch 组合。
OpenWrt 25.12(apk):
cat /etc/apk/repositories.d/distfeeds.listOpenWrt 24.10(opkg):
cat /etc/opkg/distfeeds.confcat /etc/opkg/customfeeds.conf先备份再改:
cp /etc/apk/repositories.d/distfeeds.list /etc/apk/repositories.d/distfeeds.list.bak.$(date +%F) 2>/dev/null || truecp /etc/opkg/distfeeds.conf /etc/opkg/distfeeds.conf.bak.$(date +%F) 2>/dev/null || true预期知道每个 feed 指向哪里,以及是 apk 还是 opkg。
25.12 的 apk 结构
Section titled “25.12 的 apk 结构”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 updateapk search <name>apk add <name>apk info -e <name>不要用 opkg 命令,也不要把 24.10 的 .ipk 改名成 .apk。
24.10 的 opkg 结构
Section titled “24.10 的 opkg 结构”24.10 使用 opkg,索引是 Packages.gz,包是 .ipk:
opkg updateopkg list | grep <name>opkg install <name>opkg list-installed | grep <name>不要用 apk 命令,也不要把 25.12 的 .apk 塞给 opkg。
OpenWrt 国内镜像怎么替换
Section titled “OpenWrt 国内镜像怎么替换”如果你搜的是“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。
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 一致。
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目录混了。
签名/校验失败
Section titled “签名/校验失败”- 镜像索引损坏或不是同一 release;
- 系统时间/证书错误;
- 混入了别的源;
- 不要长期用
--allow-untrusted绕过;先修源和校验。
依赖/ABI 不匹配
Section titled “依赖/ABI 不匹配”- kmods 的内核 hash 不匹配;
- 包是为另一个 target/架构构建的;
- 混用了 ImmortalWrt/iStoreOS/官方源;
- 需要同源、同版本、同架构的包,或自行编译。
- 25.12 没有
opkg,24.10 没有apk; - 不要为了“用某个命令”去装错的包管理器;先确认固件版本和来源。
装完 LuCI 里看不到
Section titled “装完 LuCI 里看不到”- 只装了核心包,没装
luci-app-*; - 语言包没装;
- 浏览器缓存/需要刷新;
- 包版本与 LuCI 不匹配。
# apkcp /etc/apk/repositories.d/distfeeds.list.bak.YYYY-MM-DD /etc/apk/repositories.d/distfeeds.listapk update
# opkgcp /etc/opkg/distfeeds.conf.bak.YYYY-MM-DD /etc/opkg/distfeeds.confopkg update如果换源后完全无法更新,先恢复官方源,确认 DNS/时间/证书正常,再尝试镜像;不要连续换多个源。
E2 实测记录(2026-10-20)
Section titled “E2 实测记录(2026-10-20)”- 环境: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 状态与来源
Section titled “E2 状态与来源”- 本页是 E2 partial:25.12
apk的官方源/TUNA/安装/恢复已实测;opkg和错误源分支仍是文档步骤。 - 镜像路径会随 release 变化;发布前在目标 release/target/arch 上再跑一次
update/search。 - 不要混用官方、ImmortalWrt、iStoreOS 的源;ABI/内核/签名都可能不匹配。