引言

OpenWrt 社区正在经历一次重要的技术转型:从传统的 opkg 包管理器迁移到 Alpine Linux 使用的 apk (Alpine Package Keeper)。这一变化带来了更强大的功能和更好的依赖处理,但也意味着习惯了 opkg 的用户需要学习新的命令和使用方式。

⚠️ 重要警告

在开始之前,请务必注意:
禁止直接使用 apk upgrade

当前 OpenWrt 的软件包仓库中,多个软件包存在缺失的冲突声明、不完整的依赖关系或配置错误(例如 hostapd-, wpad-, ucode-mod-* 等)。直接升级可能导致系统不可用甚至变砖。

正确的升级方式:
使用 ASU(Attended SysUpgrade)客户端:

  • LuCI 界面中的 Attended Sysupgrade

  • 命令行工具 owut

  • 或者 Firmware Selector 在线工具

基础命令对比

获取帮助

命令

描述

apk -h

显示所有子命令及其简要说明

apk subcmd -h

显示特定子命令的详细帮助信息

apk update

更新本地软件包索引(同 opkg)

包安装与卸载

apk 命令

opkg 命令

描述

apk update

opkg update

刷新软件源

apk add pkg

opkg install pkg

安装软件包

apk del pkg

opkg remove pkg

卸载软件包

注意签名验证: apk 严格要求所有软件包必须有有效签名。安装本地构建的软件包时:

bash

# 会报错 UNTRUSTED signature
apk add ./mypackage.ipk

# 需要使用 --allow-untrusted
apk add --allow-untrusted ./mypackage.ipk

实用技巧

1. 自动更新缓存后安装
传统 opkg 方式:

bash

opkg update && opkg install dnsmasq-full

新 apk 方式(一步到位):

bash

apk --update-cache add dnsmasq-full

2. 模拟运行
预览命令执行结果而不实际修改系统:

bash

apk del --simulate nmap

3. 离线环境使用
如果只想安装本地 .apk 文件而不联网更新索引:

bash

# 临时禁用
apk add --repositories-file /dev/null ./local-package.apk

# 永久禁用(需要备份后删除目录)
mv /etc/apk/repositories.d /etc/apk/repositories.d-disabled

包查询与信息

基本查询命令

apk 命令

opkg 命令

描述

apk list

opkg list

列出所有可用软件包

apk list P

opkg list P

列出匹配模式的包(支持通配符 *)

apk list --installed [P]

opkg list-installed

列出已安装的包

apk list --upgradeable [P]

opkg list-upgradable

列出可升级的包

apk list --providers [P]

opkg -A whatprovides P

列出提供特定功能的包

变体命令:

  • apk list --installed --manifest - 生成"包名 版本号"格式的列表,便于脚本处理

  • apk info - 仅列出已安装包名,无需额外解析

  • apk list --orphaned - 显示可能被遗弃的依赖包

实际示例:查找 DNS 服务器软件

使用 opkg:

bash

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

使用 apk:

bash

$ 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]

查看已安装的提供者:

apk 命令

opkg 命令

apk list --installed --providers dnsmasq

opkg whatprovides dnsmasq

软件包详细信息

apk 命令

opkg 命令

描述

apk info

无对应命令

仅显示已安装的包名

apk info P

opkg info P

显示包的基本信息

apk info --all P

无对应命令

显示包的详细信息

apk info --contents P

opkg files P

列出包安装的所有文件

apk info --who-owns <file>

opkg search <file>

查找文件属于哪个包

apk info --depends P

opkg depends P

列出包的依赖关系

apk info --rdepends P

opkg whatdepends P

列出依赖该包的所有包

高级操作

apk 命令

opkg 命令

描述

apk extract --allow-untrusted P

tar -xvf P

解压包文件内容

apk -p /path/to/root

opkg -d <dest>

安装到指定根目录(如 ramdisk)

apk adbdump file

无对应命令

解析并显示 APK v3 格式文件内容

迁移注意事项总结

  1. 永远不要直接 apk upgrade - 使用 ASU 工具进行系统升级

  2. 签名验证 - apk 默认要求有效签名,安装自制包需加 --allow-untrusted

  3. 网络访问 - apk 默认会尝试更新所有配置的源,离线环境需要特殊处理

  4. 依赖关系 - apk 的依赖处理更严格,可能暴露之前 opkg 未发现的问题

  5. 软件源配置 - 配置文件位置从 /etc/opkg/*.conf 变为 /etc/apk/repositories.d/

结语

从 opkg 到 apk 的迁移不仅改变了命令的使用方式,也带来了更现代的包管理理念。虽然初期可能需要一些适应时间,但 apk 提供的更好依赖处理、更快的查询速度和更严格的安全验证,将使 OpenWrt 系统更加稳定可靠。

建议在正式迁移前,先在测试设备上熟悉这些新命令,并使用 --simulate 参数预览操作结果。当需要升级系统时,务必使用 ASU 相关工具,确保升级过程安全可控。

参考资源:


本文基于 OpenWrt 23.05 及后续版本的 apk 实现编写,如有更新请参考官方文档。