1 ipk安装包说明
IPK 是 OpenWrt/LEDE 系统的软件包格式,类似于 Debian 的.deb或 Red Hat 的.rpm。它用于嵌入式设备上安装、升级或卸载软件。
1.1 ipk 文件架构
一个标准的 .ipk 文件包含以下部分(tar 解压查看):
control.tar.gz # 包的控制信息(依赖、版本、描述等)
data.tar.gz # 实际要安装的文件(二进制、脚本、配置文件等)
debian-binary # 包格式版本(通常是 "2.0")
1.2 IPK 包的控制信息
control.tar.gz解压后通常包含:
control(包的基本信息)
preinst(安装前执行的脚本)
postinst(安装后执行的脚本)
prerm(卸载前执行的脚本)
postrm(卸载后执行的脚本)
control文件示例
Package: iperf3
Version: 3.17-1
Source: package/iperf3
License: GPL-2.0
Section: net
Maintainer: wangkai <lihe.Hex@org>
Architecture: all
Installed-Size: 574342
Description: Provides support for iperf3
字段 | 说明 |
Package | 【必须】包名(必须唯一) |
Version | 【必须】版本号 |
Depends | 依赖的包(如 |
Source | 源代码来源(通常是下载链接或代码仓库地址) |
License | 【推荐填写,避免法律风险】许可证类型(开源协议) |
Section | 分类(如 |
Architecture | 【必须】支持的架构(如 |
Maintainer | 【必须】维护者信息 |
Installed-Size | 【自动生成】包安装后占用的磁盘空间(单位:KB)。 |
Description | 【必须】包的描述 |
Installed-Size 通常由 OpenWrt 编译系统自动计算,无需手动填写,
计算逻辑:统计data.tar.gz中所有文件的总大小。
如果手动编写control文件,需自行计算并填写,实际安装大小可能略高于该值(因为文件系统开销)
2 opkg使用
2.1 常见命令行
命令行 | 说明 |
opkg update | 从配置的软件源下载最新的软件包列表(类似 |
opkg install <包名> | 安装软件包 |
opkg remove <包名> | 卸载安装包 |
opkg list-installed | 显示所有已安装的软件包。 |
opkg list | grep <关键词> | 搜索可用软件包 |
opkg info <包名> | 显示包的版本、依赖、描述等信息。 |
opkg upgrade | 升级所有的安装包 |
opkg download <包名> | 将软件包下载到当前目录(不安装) |
opkg clean | 清除下载的临时包文件 |
opkg print_architecture | 显示系统支持的架构列表 |
2.2 安装强制选项
命令行 | 说明 |
--force-reinstall | 强制重新安装 |
--force-overwrite | 强制覆盖冲突文件 |
--force-depends | 忽略依赖检查 |
--force-space | 忽略可用空间检查 |
--force-downgrade | 允许降级安装 |
--force-postinstall | 强制运行 |
3、ipk打包脚本
#!/bin/sh # 验证参数个数 if [ $# -lt 3 ]; then echo "参数错误: <程序名称> <版本号> <架构类型>" exit 1 fi PKG_NAME="$1" # 程序名称 VERSION="$2" # 版本号 ARCH="$3" # 架构类型 # 显示参数值(调试用) echo "程序名称: $PKG_NAME" echo "版本号: $VERSION" echo "架构类型: $ARCH" # 当前脚本路径 cur_dir=$(dirname "$(readlink -f "$0")") data_dir="data" ctrl_dir="control" ctrl_file="control/control" # 切换到当前目录 cd ${cur_dir} # 清理旧文件 rm -f ${PKG_NAME}_*.ipk rm -f ${data_dir}.tar.gz ${ctrl_dir}.tar.gz debian-binary # 检查data目录是否存在 if [ ! -d "$data_dir" ]; then echo "错误:$data_dir 目录不存在" exit 1 fi # 检查control目录是否存在 if [ ! -d "$ctrl_dir" ]; then echo "错误:$ctrl_dir 目录不存在" exit 1 fi # 检查control文件是否存在 if [ ! -f "$ctrl_file" ]; then echo "错误:$ctrl_file 文件不存在" exit 1 fi # 打包数据 if ! tar -czf ${data_dir}.tar.gz -C ${data_dir} .; then echo "错误:$data_dir 打包失败!" exit 1 fi # 计算安装包占用空间 installed_size=$(du -sk $data_dir | awk '{print $1}') # 修改control文件信息 sed -i \ -e "s/^Package:.*/Package: $PKG_NAME/" \ -e "s/^Version:.*/Version: $VERSION/" \ -e "s/^Architecture:.*/Architecture: $ARCH/" \ -e "s/^Installed-Size:.*/Installed-Size: $installed_size/" \ $ctrl_file # 打包信息 if ! tar -czf "${ctrl_dir}.tar.gz" -C ${ctrl_dir} .; then echo "错误:$ctrl_dir打包失败!" exit 1 fi # 创建 debian-binary echo "2.0" > debian-binary # 生成IPK包(关键修复:检查ar命令) if ! tar -czf ${PKG_NAME}_${VERSION}_${ARCH}.ipk debian-binary ${ctrl_dir}.tar.gz ${data_dir}.tar.gz ; then echo "错误:生成ipk失败"; exit 1; fi # 清理临时文件 rm -f ${ctrl_dir}.tar.gz ${data_dir}.tar.gz debian-binary echo "成功: 生成安装包${PKG_NAME}_${VERSION}_${ARCH}.ipk"