opkg

义项:嵌入式 Linux 软件包管理器
opkg

opkg(Open PacKaGe management)是一种面向嵌入式 Linux 设备的轻量级软件包管理器,处理 .ipk 格式软件包的下载、安装、升级、卸载与查询,并递归解析软件包依赖关系。它源自 Itsy Package Management System(ipkg),长期作为 OpenWrt 路由器固件的默认包管理器,也被 OpenEmbedded 等项目采用,其设计参照 Debian 的 dpkg 与 APT。由于 OpenWrt 使用的 opkg 分支停止维护,OpenWrt 从 25.12 版本起改用 apk(Alpine Package Keeper)。

目录
  1. 定义
  2. 原理
  3. 发展历程
  4. 应用
  5. 局限
  6. 参见

定义

opkg 是一种运行在嵌入式 Linux 系统上的软件包管理工具,名称意为开放软件包管理,处理的对象是后缀为 .ipk 的二进制软件包。它面向存储与内存资源都很紧张的设备,程序体积和运行时占用都远小于桌面发行版常用的包管理器[1][2]。

在功能定位上,opkg 与 Debian 系统的 dpkg、Red Hat 系统的 rpm 属于同类工具,负责把软件包释放到根文件系统中,除普通应用外也能安装内核模块与驱动程序[3][1]。项目以 GPL 第 2 版许可发布,主体用 C 语言写成[4][1]。

原理

opkg 的一次操作通常围绕三类数据展开:全局配置文件 /etc/opkg.conf 及其目录下的软件源配置,描述已安装软件包状态的数据库,以及从软件源下载的软件包索引。执行 opkg update 时,程序按配置中的地址取回压缩的索引文件,索引里列出源中每个软件包的名字、版本、依赖、大小与校验和[3]。

安装某个软件包时,opkg 依据索引找到对应的 .ipk 文件,并递归查找它依赖的其他包,把它们一并下载并按顺序安装;依赖无法满足时安装会报错中止。安装记录写入本地状态文件,后续查询、卸载和升级都依赖这些记录判断版本与文件归属[3]。

索引与软件包之间的完整性依赖软件源机制保障。软件源目录中除索引本身外通常还有一个对索引的签名文件,opkg 可借助已导入的信任密钥校验签名,再依据索引中记录的 SHA-256 校验和核对下载的软件包是否被篡改[5]。

在 OpenWrt 这类系统上,opkg 还受文件系统布局限制:根文件系统由只读的压缩镜像与可写的覆盖层叠加而成,新装的软件包落在覆盖层里,可用空间取决于闪存剩余容量[6]。

发展历程

opkg 的前身是 Itsy Package Management System(ipkg),那套系统为资源受限的手持设备设计,软件包格式借鉴了 Debian 的 deb 格式并以 .ipk 为后缀。ipkg 的独立开发在 2013 年停止[7]。

作为 ipkg 分支出现的 opkg,早期在 Openmoko 项目中从 ipkg 分出,随后成为 OpenWrt 采用的包管理器;按开发者的说法,opkg 项目本身始于 2007 年前后,而不是 2001 年[4]。其后代码托管从早期的项目仓库迁至 Yocto Project 名下,与 OpenWrt 自行维护的分支并列存在,两者都源于已停止维护的 ipkg[4][1]。

2020 年 1 月,OpenWrt 披露了影响 opkg 分支的安全问题 CVE-2020-7982:解析签名索引中的校验和时存在缺陷,导致下载的 .ipk 未被真正校验,中间人可借机投放伪造软件包。修复后的 opkg 版本标记为 2020-01-25,并入 OpenWrt 18.06.7 与 19.07.1 等版本[5][8]。

由于 OpenWrt 所维护的 opkg 分支不再继续开发,该项目在 25.12 版本中把默认包管理器换成 apk,官方给出的理由是 apk 仍在积极维护,且支持 opkg 的大部分功能,只有少量软件包更名、部分命令行参数不同,并提供了命令对照表供迁移[9][10]。

应用

opkg 主要用于路由器、交换机、住宅网关、网络摄像头等嵌入式网络设备,承担软件功能的安装、升级与卸载。OpenWrt 及其衍生系统是它最典型的部署环境,用户可通过命令行或网页管理界面操作软件源与软件包[2][11]。

在 OpenEmbedded 构建体系中,opkg 被用作默认的软件包管理器之一,与 deb、rpm 并列作为二进制包输出格式,供构建系统生成软件源并组装最终镜像[1][12]。

实际使用中,opkg 支持只下载不安装、指定安装到外接存储、跳过依赖检查、强制重装与覆盖文件等选项,也支持通过通配符或配合 grep 等工具筛选软件包列表。含有大量已装软件包的设备在整机升级后未必保留这些包,因此常需先导出已安装清单再逐项重装[2][13][11]。

此外,opkg 也能在无外网的环境中工作:只要把本地目录配置为软件源,设备即可从局域网或本机路径完成安装,这一方式常见于开发板的调试流程[14][2]。

局限

opkg 的依赖处理能力有限。当某个依赖库的内容已更新而版本号未变时,它缺乏机制识别并重新安装依赖,上层程序可能因此报错或出现文件冲突,用户往往要借助强制安装或覆盖文件的选项手工绕过[2]。

资源占用与执行效率方面,opkg 的程序体积虽小,但相比后期出现的同类工具仍有差距:有对比测量显示其主程序约 148 kB,大于 apk 主程序的约 56 kB,不过考虑配套库后两者总占用差别不大。整机批量升级被官方明确列为不推荐操作,因为可能使设备无法正常启动[2]。

安全方面,opkg 在 OpenWrt 上以 root 身份运行,对全部文件系统拥有写权限,一旦校验环节失效,注入的软件包即可取得系统控制权;CVE-2020-7982 正是此类风险的具体体现[5][15]。

环境层面的限制同样明显:软件包索引在不少系统上默认放在内存文件系统中,重启后丢失,必须先重新执行更新才能安装;运行期安装的软件包写入有限的覆盖分区,消费级路由器闪存往往只有数 MB 到十余 MB,安装大包容易空间不足[6][11]。此外,OpenWrt 所用的 opkg 分支已停止开发,这也是该发行版转向 apk 的直接原因[9]。

参见

  • OpenWrt —— 长期以 opkg 为默认包管理器的开源路由器固件项目

  • Yocto Project —— 托管 opkg 代码仓库并为 OpenEmbedded 提供构建工具的項目

  • ipkg —— opkg 所源自的轻量包管理系统

  • dpkg —— opkg 在命令设计与包格式上参照的 Debian 包管理工具

  • apk —— OpenWrt 25.12 起取代 opkg 的包管理器

参考资料

  1. README.md - Opkg lightweight package management system [引用日期2026-10-29]
  2. [OpenWrt Wiki] Opkg package manager [引用日期2026-10-29]
  3. OperWrt 包管理系统 [引用日期2026-10-29]
  4. opkg – Wikipedie [引用日期2026-10-29]
  5. [OpenWrt Wiki] Security Advisory 2020-01-31-1 [引用日期2026-10-29]
  6. opkg — Package Manager [引用日期2026-10-29]
  7. iPKG – Wikipedia [引用日期2026-10-29]
  8. CVE-2020-7982 [引用日期2026-10-29]
  9. openwrt/openwrt v25.12.0 on GitHub [引用日期2026-10-29]
  10. [OpenWrt Wiki] apk package manager [引用日期2026-10-29]
  11. Package Manager (opkg) [引用日期2026-10-29]
  12. yoctoproject.org 上的网页 [引用日期2026-10-29]
  13. opkg man | Linux Command Library [引用日期2026-10-29]
  14. 页面历史记录 [引用日期2026-10-29]
  15. gov.py 上的网页 [引用日期2026-10-29]
词条评价
词条统计

浏览次数:0 次

阅读量:0 次 · 阅读完成量:0 次

最近更新:2026-10-28T18:34:33Z

历史版本

本条目引用的词条
OpenWrt Yocto Project ipkg dpkg apk