opkg 到 apk 对照速查表
禁止使用 apk upgrade !
将会导致设备变砖。当前多个软件包存在缺失的冲突声明、不完整的依赖关系,或其它配置错误 (例如hostapd-*, wpad-*, ucode-mod-*, 各种库文件等)。
正确方式是使用 ASU 客户端: LuCI Attended Sysupgrade、 owut 或 Firmware Selector。
其他参考资料:
apk命令的帮助信息仅需运行apk即可查看子命令(sub-command);只需要在子命令后加-h(例如apk add -h)便可以获取到该命令的详细说明。
- Alpine Linux 使用手册 虽然是根据Alpine写的,但是命令示例对我们有帮助。
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- 生成易于用awk或sed解析的“软件包名 版本号”列表。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) |