通知 爱刷机 路由器教程 →→《省钱助手

openwrt固件生成ipk的过程ipk是如何生成的?ipk文件本质是什么?

2022-10-07
0评论
/
阅读
爱搜啊

大家都知道OpenWRT的软件包是ipk格式的,使用opkg命令来安装软件包

那么请问ipk是如何生成的?ipk文件本质是什么?

不过不知道也无妨,因为我们一般开发的无需知道这个,只要知道怎么使用即可!但是。。。我蛋疼,必须追根究底的看下!

openwrt固件生成ipk的过程ipk是如何生成的?

图文无关

linux下生成ipk

用百度搜索基本都是没用的,没有人点到问题上!于是谷歌。。

找到了一篇文章:openwrt固件生成ipk的过程ipk文件到底是什么?

标题为:How to create an ipk,着太有用了,虽然不是说openwrt上如何实现的,但是会有很多提示,也讲解了ipk如何生成的。

重要的东西在最后

8. Finally: the ipk

8.1 Creating the package

Don’t try to make the ipk by hand. Use the mkipkg provided here. The script is also provided in both the cross and native sdk but it is not compatible some recent versions of tar.

mkipkg will uncover the possible errors in your control file or elsewhere. If mkipkg fails double-check your control file.

When you have a tree structure like:

ipkg-temp/
|-- CONTROL
|   `-- control
|-- etc
|   `-- foo.conf
`-- usr
    |-- bin
    |   `-- foo
    `-- share
        |-- applications
        |   `-- foo.desktop
        `-- pixmaps
            `-- foo.png

just do:

mkipkg ipkg-temp

and the ipk will be created for you.

ok!从上面可以看出生成ipk需要的文件和文件夹,以及需要的命令mkipkg,有兴趣的同学可以在linux试试!

openwrt上ipkg的实现

那么在openwrt的sdk里面怎么实现的呢,顺着上面的思路,find搜索下ipkg相关的文件

jack@openwrtdl:~/10G/cc$ find -name "*ipkg*"
./feeds/luci/modules/luci-base/luasrc/model/ipkg.lua
./feeds/luci/modules/luci-base/luasrc/model/ipkg.luadoc
./feeds/luci/modules/luci-mod-admin-full/luasrc/model/cbi/admin_system/ipkg.lua
./feeds/luci/modules/luci-mod-admin-full/luasrc/view/admin_system/ipkg.htm
./include/package-ipkg.mk
./scripts/ipkg-build
./scripts/ipkg-make-index.sh
./scripts/make-ipkg-dir.sh
./scripts/.ipkg-build.swp

从上面一部分的搜索结果看到一个特殊的,./scripts/ipkg-build这个文件,查看下这个文件的内容,发现正是这个bash脚本文件生成相关的ipk

文件内容太长,我就不贴出来了,仅仅贴出最后几行重要的命令,里面echo中带有jack:的都是自己加入的打印,更好的了解点ipk生成过程

tmp_dir=$dest_dir/IPKG_BUILD.$$
mkdir $tmp_dir
#加入自己的打印,确定一些变量值
echo "jack:tmpdir=$tmp_dir"
echo $CONTROL > $tmp_dir/tarX
# Preserve permissions (-p) when creating data.tar.gz as non-root user
#生成data.tar.gz的压缩包
( cd $pkg_dir && $TAR $ogargs -X $tmp_dir/tarX --format=gnu -czpf $tmp_dir/data.tar.gz . )
 
installed_size=`stat -c "%s" $tmp_dir/data.tar.gz`
sed -i -e "s/^Installed-Size: .*/Installed-Size: $installed_size/" \
        $pkg_dir/$CONTROL/control
#生成control.tar.gz压缩包
( cd $pkg_dir/$CONTROL && $TAR $ogargs --format=gnu -czf $tmp_dir/control.tar.gz . )
rm $tmp_dir/tarX
#生成debian-binary
echo "2.0" > $tmp_dir/debian-binary
 
pkg_file=$dest_dir/${pkg}_${version}_${arch}.ipk
echo "jack:pkg_file=$pkg_file,pwd=$PWD"
rm -f $pkg_file
#重要的命令:生成最后的ipk文件
( cd $tmp_dir && $TAR --format=gnu -zcf $pkg_file ./debian-binary ./data.tar.gz ./control.tar.gz )
[ -f $pkg_file ] && echo "jack:${pkg}_${version}_${arch}.ipk is ok!!"
#删除中间文件
rm $tmp_dir/debian-binary $tmp_dir/data.tar.gz $tmp_dir/control.tar.gz
rmdir $tmp_dir
 
echo "Packaged contents of $pkg_dir into $pkg_file"

从上面的脚本可以看出,生成ipk之前先生成了几个重要的文件debian-binary data.tar.gz control.tar.gz,分别保存版本信息、数据内容、ipk的信息,安装方法等

从最后的生成ipk的过程看,其实ipk格式就是tar.gz格式,只是改了个名字而已!


点击链接加入群聊三群:751529538

点击链接加入群聊二群:376877156

点击链接加入群聊【路由器交流群:622891808已满】

本站附件分享,如果附件失效,可以去找找看

诚通网盘附件百度网盘附件


饿了么红包

饿了么红包

于2022-10-07发布