# 打包OpenWrt的ipk安装包注意事项

以程序名 linker 为例,你可以替换成你自己的

1、创建目录

my-package
├── control
│   ├── control  //控制文件
│   ├── postinst //安装后脚本
│   ├── prerm    //卸载前脚本
├── data
    └── usr
        └── bin
            └──linker //这里文件夹名随意,一般是你的程序名
               └──//下面放你的程序文件
        etc
        └── init.d
            └──linker //服务文件,名称随意,一般是你的程序名

2、编写control文件内容

Depends 是你的程序依赖那些包,多个包使用逗号+空格间隔

特别注意,control文件必须是LF格式,且文件内容最后必须有一个空行

windows下编辑默认是CRLF格式,可以用vscode什么的修改为LF,也可以在linux下使用sed -i ‘s/\r$//’ control 将control文件修改为LF

Package: linker
Version: 版本
Architecture: all
Maintainer: 你的名字 <邮箱>
Section: utils
Description: linker
Depends: libc, libstdcpp, zlib, bash, libopenssl, libopenssl-legacy, iptables

3、编写postinst文件内容

#!/bin/sh
# 安装后执行的脚本
/etc/init.d/linker enable
/etc/init.d/linker start
echo "linker installed successfully!"
exit 0

4、编写prerm文件内容

#!/bin/sh
# 卸载前执行的脚本
echo "removing linker..."
/etc/init.d/linker stop
/etc/init.d/linker disable
exit 0

5、编写服务文件

就是 data/etc/init.d/linker 这个文件

#!/bin/sh /etc/rc.common

START=99 #服务启动优先级数字越大启动越晚
STOP=10 #服务停止优先级数字越小停止越早

USE_PROCD=1
PROG=/usr/bin/linker/linker #程序就是创建的那个目录不包含data文件夹
WORKDIR=/usr/bin/linker  # 指定工作目录

start_service() {
    procd_open_instance
    procd_set_param command "$PROG"
    procd_set_param respawn  # 自动重启
    procd_set_param stdout 0 # 重定向标准输出到日志
    procd_set_param stderr 1 # 重定向标准错误到日志
    procd_set_param cwd "$WORKDIR"  # 设置工作目录
    procd_close_instance
}

stop_service() {
    killall linker
}

restart() {
    stop
    start
}

status() {
    if pgrep -f "$PROG" > /dev/null; then
        echo "linker is running."
        return 0
    else
        echo "linker is not running."
        return 1
    fi
}

6、打包ipk

大概就是将 control目录下的所有文件打一个包,将data目录下的所有文件打一个包,然后创建一个debian-binary文件,内容为2.0,然后将这几个打包成一个ipk就可以了

cd my-package
tar -czf data.tar.gz -C data/ .
tar -czf control.tar.gz -C control/ .
echo "2.0" > debian-binary
tar -czf linker.ipk debian-binary data.tar.gz control.tar.gz