openwrt下ipk生成过程及原理

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

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

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

linux下生成ipk

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

找到了一篇文章:http://ftp.nluug.nl/ibiblio/distributions/pdaxrom/download/contrib/docs/making_ipkg_howto.html

标题为: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格式,只是改了个名字而已!


本文章由作者:佐须之男 整理编辑,原文地址: openwrt下ipk生成过程及原理
本站的文章和资源来自互联网或者站长的原创,按照 CC BY -NC -SA 3.0 CN协议发布和共享,转载或引用本站文章应遵循相同协议。如果有侵犯版权的资 源请尽快联系站长,我们会在24h内删除有争议的资源。欢迎大家多多交流,期待共同学习进步。

相关推荐