This translation is older than the original page and might be outdated. See what has changed.

opkg 到 apk 对照速查表

opkg 过渡到 apk

禁止使用 apk upgrade !

将会导致设备变砖。当前多个软件包存在缺失的冲突声明、不完整的依赖关系,或其它配置错误 (例如hostapd-*, wpad-*, ucode-mod-*, 各种库文件等)。

正确方式是使用 ASU 客户端: LuCI Attended Sysupgrade、 owut 或 Firmware Selector。

其他参考资料:

  • apk命令的帮助信息仅需运行 apk 即可查看子命令(sub-command);只需要在子命令后加 -h (例如apk add -h)便可以获取到该命令的详细说明。
  • apk-tools 是主流发行版的一部分,其手册页(man pages)在各大常用网站上均有发布。例如:Arch Linux wiki entry

opkg 类似,大多数命令都支持一个可选的软件包名称模式(下文用 [P] 表示)。这些模式使用通配符(glob),例如 *dns* 会匹配名称中包含 dns 的所有软件包。

命令 描述
apk -h 显示所有子命令及其简要说明
apk subcmd -h 显示特定子命令(在 apk-tools 文档中称为“applets”)的帮助信息
apk update 强制更新本地索引,功能与 opkg 中的同名命令一致
apk adbdump file 解析并显示 APK v3 格式文件的内容,包括软件包索引文件 (通常名为 packages.adb) 和软件包文件 (即*.apk)
apk opkg 描述
apk update opkg update 刷新软件源
apk add pkg opkg install pkg 安装 pkg
apk del pkg opkg remove pkg 卸载 pkg

两者在安装操作基本一致。区别在于:apk要求所有软件包都必须具有有效的签名,而 opkg 对本地软件包则忽略签名验证。因此,如果您要安装非标准(如自行构建)的软件包,请使用 --allow-untrusted 选项:

$ apk add ./owut_2024.07.01~189b2721-r1.apk
ERROR: ./owut_2024.07.01~189b2721-r1.apk: UNTRUSTED signature

$ apk add --allow-untrusted ./owut_2024.07.01~189b2721-r1.apk
OK: 2313 MiB in 569 packages

有趣的改变

apk--update-cache 选项允许您在执行 add 操作的同时自动执行 update,从而将传统的 opkg 链式命令简化为一条 apk 命令:

opkg update && opkg install dnsmasq-full

简化为:

apk --update-cache add dnsmasq-full

--simulate 选项可用于模拟执行命令,预览实际效果而不做任何更改:

$ apk del --simulate nmap
(1/1) Purging nmap (7.95-r1)
OK: 47 MiB in 288 packages

默认软件源操作

默认情况下,当首次使用apk add时,apk 会尝试更新 /etc/apk/repositories.d/ 中定义的软件源。在某些离线(或物理隔离)场景中,这可能导致 apk 尝试连接远程软件源以更新本地数据库,即使您只想安装本地 .apk 文件:

$ apk add ./owut_2024.07.01~189b2721-r1.apk 
fetch https://downloads.openwrt.org/snapshots/targets/x86/64/packages/packages.adb
Failed to send request: Operation not permitted
WARNING: updating and opening https://downloads.openwrt.org/snapshots/targets/x86/64/packages/packages.adb: network error (check Internet connection and firewall)
...snip...
OK: 2313 MiB in 569 packages

若要禁用此行为,可使用 --repositories-file /dev/null

$ apk add --repositories-file /dev/null ./owut_2024.07.01~189b2721-r1.apk
...snip...
OK: 2313 MiB in 569 packages

若要永久禁用, 需要移除 /etc/apk/repositories.d 目录,因此运行: mv /etc/apk/repositories.d /etc/apk/repositories.d-disabled

注意: [P] 均为通配符模式。

apk opkg 描述
apk list opkg list 列出所有可用软件包
apk list P opkg list P 列出匹配 P 的软件包(也可通过 grep 使用正则
apk list --installed [P] opkg list-installed 列出所有已安装的软件包,或匹配 P 的已安装包
apk list --upgradeable [P] opkg list-upgradable 列出可升级的软件包
apk list --providers [P] opkg -A whatprovides P 列出所有提供 P 功能的软件包

变体

  • apk list --installed --manifest - 生成易于用 awksed 解析的“软件包名 版本号”列表。
  • apk info - 不带参数 仅列出已安装的软件包名称,无需额外解析。
  • apk list --orphaned - 显示可能被遗弃的依赖包(即没有顶层依赖声明的软件包)。这可能是卸载其他软件包时残留的结果,但也可能是依赖声明有误。如需删除此类软件包,请务必先确认其确实不再被系统所需。

软件包列表对比示例

通过 opkg 列出所有提供 dnsmasq 的候选包:

$ opkg -A whatprovides dnsmasq  
What provides dnsmasq
    dnsmasq-dhcpv6
    dnsmasq
    dnsmasq-full

通过 apk 列出所有提供 dnsmasq 的候选包:

$ apk list --providers dnsmasq
<dnsmasq> dnsmasq-2.90-r3 x86_64 {feeds/base/package/network/services/dnsmasq} (GPL-2.0)
<dnsmasq> dnsmasq-dhcpv6-2.90-r3 x86_64 {feeds/base/package/network/services/dnsmasq} (GPL-2.0)
<dnsmasq> dnsmasq-full-2.90-r3 x86_64 {feeds/base/package/network/services/dnsmasq} (GPL-2.0) [installed]

通过 opkg 查看当前已安装包中 dnsmasq 的提供者:

$ opkg whatprovides dnsmasq
What provides dnsmasq
    dnsmasq-full

通过 apk 查看当前已安装包中 dnsmasq 的提供者:

$ apk list --installed --providers dnsmasq
<dnsmasq> dnsmasq-full-2.90-r3 x86_64 {feeds/base/package/network/services/dnsmasq} (GPL-2.0) [installed]
apk opkg 描述
apk info no equivalent 仅显示已安装的软件包名称
apk info P opkg info P 显示软件包 P 的摘要信息
apk info --all P no equivalent 显示软件包 P 的详细信息
apk info --contents P opkg files P 列出软件包 P 包含的所有文件
apk info --who-owns <file> opkg search <file> 查找安装了 <file> 的软件包
apk info --depends P opkg depends P 列出软件包 P 所依赖的所有软件包
apk info --rdepends P opkg whatdepends P 列出所有依赖于软件包 P 的软件包
apk opkg Description
apk extract --allow-untrusted P tar -xvf P 解压软件包 P
apk -p </path/to/root> opkg -d <dest> 调整包到root以外的位置 (例如:ramdisk)
  • Last modified: 2026/01/31 06:48
  • by starsfall