linux ipk,openwrt下ipk生成过程及原理

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

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

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

linux下生成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:

Shell

1

2

3

4

5

6

7

8

9

10

11

12

13

ipkg

-

temp

/

|

--

CONTROL

|

`

--

control

|

--

etc

|

`

--

foo

.conf

`

--

usr

|

--

bin

|

`

--

foo

`

--

share

|

--

applications

|

`

--

foo

.desktop

`

--

pixmaps

`

--

foo

.png

just do:

Shell

1

mkipkg

ipkg

-

temp

and the ipk will be created for you.

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

openwrt上ipkg的实现

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

Shell

1

2

3

4

5

6

7

8

9

10

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生成过程

Shell

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值