opkg 安装包管理

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

依赖的包(如libc, librt

Source

源代码来源(通常是下载链接或代码仓库地址)

License

【推荐填写,避免法律风险】许可证类型(开源协议)

Section

分类(如net,utils

Architecture

【必须】支持的架构(如all(通用包),x86_64,arm

Maintainer

【必须】维护者信息

Installed-Size

【自动生成】包安装后占用的磁盘空间(单位:​KB​​)。

Description

【必须】包的描述

Installed-Size 通常由 OpenWrt 编译系统自动计算,无需手动填写,

计算逻辑:统计data.tar.gz中所有文件的总大小。

如果手动编写control文件,需自行计算并填写,实际安装大小可能略高于该值(因为文件系统开销)

2 opkg使用

2.1 常见命令行

命令行

说明

opkg update

从配置的软件源下载最新的软件包列表(类似apt 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

强制运行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"