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.01.2 IPK 包的控制信息control.tar.gz解压后通常包含control包的基本信息preinst安装前执行的脚本postinst安装后执行的脚本prerm卸载前执行的脚本postrm卸载后执行的脚本control文件示例Package: iperf3Version: 3.17-1Source: package/iperf3License: GPL-2.0Section: netMaintainer: wangkai lihe.HexorgArchitecture: allInstalled-Size: 574342Description: Provides support for iperf3字段说明Package【必须】包名必须唯一Version【必须】版本号Depends依赖的包如libc, librtSource源代码来源通常是下载链接或代码仓库地址License【推荐填写避免法律风险】许可证类型开源协议Section分类如net,utilsArchitecture【必须】支持的架构如all通用包,x86_64,armMaintainer【必须】维护者信息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_dirdata ctrl_dircontrol ctrl_filecontrol/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