如何安装ipk包

如何安装ipk包,第1张

ipk文件实际上是用ar命令打包的一个归档包。没有数字签名的ipk中一般包含control.tar.gz、data.tar.gz和debian-binary这三个文件。

其中debian-binary里面是固定的亩升。

control.tar.gz中包含了control、md5sums、preinst、postinst、prerm、postrm这几个文件,其中control是必须的,其它都是可选的。

data.tar.gz中包含了要安装的程序和数据。

ipk的安装对于大多数用户来说都是使用preware、WebOS Quick Install、Internalz Pro来安装程序的。如果不考虑postinst脚本,那么使用这些工具安装的文件都是相对于/media/cryptofs/apps目录进行安装的。如果直接使用不带-o参数的ipkg install命令安装的话,那么安装的文件都是相对于/目录的。也就是说ipk包中实际上并不包含相对于那个路径进行安装的信息。安装到哪儿只跟安装的方式有关。

rootfs.tar.gz中那些预先安装好的包都是相对于/目录安装的。相对于/目录安装的程序,用户通过preware、WebOS Quick Install和系统自带的软件包管理器都是无法卸载的,但并不是说就真的无法卸载,实际上只要你愿意,这些包都可以在root帐号下用ipkg remove命令来卸载掉。

我们在上一节中有一个<carrier>.tar没有介绍(<carrier>表示att、wr、verizon等),之所以没介绍主要原因就是我们需要先了解上面的这些内容,然后才比较容易解释这个<carrier>.tar。

这个<carrier>.tar中的主要内容就是一些ipk包,另外,还有一个installer.xml。这个installer.xml如果不凳穗是要做跨运营商或跨机型移植,是不需要修改的。那么剩下的就是运营商定制的一些ipk包了。这些包是在刷机程序把rootfs.tar.gz写入设备之后,进行安装的。他们都是相对于/目录进行安装的。因此这些包从本质上来讲,跟rootfs.tar.gz中预先安装的包是没有区别的。唯一的区别就是rootfs.tar.gz中的包是预先安装好的,<carrier>.tar中的包是在刷机过程中进行安装的。而ROM验证md5sums的过程是在<carrier>.tar中的所有ipk安装之后才进行的。因此,枣耐卜<carrier>.tar中的包也是需要进行md5sums验证的。

既然<carrier>.tar中的包也需要验证,所以对于放在<carrier>.tar中的包来说,它的control.tar.gz中的md5sums不是可选的,而是必须的。如果缺少了这个md5sums,那么刷机到82%时,同样会因为无法通过md5sums验证而终止刷机,无法重启。

要生成一个带md5sums的ipk,如果靠手工来计算编写md5sums,并自己通过tar、gzip、ar等命令来打包实在是麻烦的很。实际上前人早在10年前就做好了这样的打包脚本,叫ipkg-build。我们可以直接拿来用。

下面是这个脚本的完整内容:

#!/bin/sh

# ipkg-build -- construct a .ipk from a directory

# Carl Worth [email protected]>

# based on a script by Steve Redler IV, [email protected] 5-21-2001

set -e

ipkg_extract_value() {

sed -e "s/^[^:]*:[[:space:]]*//"

}

required_field() {

field=$1

value=`grep "^$field:" <$CONTROL/control | ipkg_extract_value`

if [ -z "$value" ]then

echo "*** Error: $CONTROL/control is missing field $field" >&2

return 1

fi

echo $value

return 0

}

pkg_appears_sane() {

local pkg_dir=$1

local owd=`pwd`

cd $pkg_dir

PKG_ERROR=0

large_uid_files=`find . -uid +99`

if [ -n "$large_uid_files" ]then

echo "*** Warning: The following files have a UID greater than 99.

You probably want to chown these to a system user: " >&2

ls -ld $large_uid_files

echo >&2

fi

if [ ! -f "$CONTROL/control" ]then

echo "*** Error: Control file $pkg_dir/$CONTROL/control not found." >&2

cd $owd

return 1

fi

pkg=`required_field Package`

[ "$?" -ne 0 ] &&PKG_ERROR=1

version=`required_field Version | sed 's/.*://'`

[ "$?" -ne 0 ] &&PKG_ERROR=1

arch=`required_field Architecture`

[ "$?" -ne 0 ] &&PKG_ERROR=1

required_field Maintainer >/dev/null

[ "$?" -ne 0 ] &&PKG_ERROR=1

required_field Description >/dev/null

[ "$?" -ne 0 ] &&PKG_ERROR=1

section=`required_field Section`

[ "$?" -ne 0 ] &&PKG_ERROR=1

if [ -z "$section" ]then

echo "The Section field should have one of the following values:" >&2

echo "Games, Multimedia, Communications, Settings, Utilies, Applications, Console, Misc" >&2

fi

priority=`required_field Priority`

[ "$?" -ne 0 ] &&PKG_ERROR=1

if [ -z "$priority" ]then

echo "The Priority field should have one of the following values:" >&2

echo "required, important, standard, optional, extra." >&2

echo "If you don't know which priority value you should be using, then use \`optional'" >&2

fi

if echo $pkg | grep '[^a-z0-9.+-]'then

echo "*** Error: Package name $name contains illegal characters, (other than [a-z0-9.+-])" >&2

PKG_ERROR=1

fi

local bad_fields=`sed -ne 's/^\([^[:space:]][^:[:space:]]\+[[:space:]]\+\)[^:].*/\1/p' <$CONTROL/control | sed -e 's/\\n//'`

if [ -n "$bad_fields" ]then

bad_fields=`echo $bad_fields`

echo "*** Error: The following fields in $CONTROL/control are missing a ':'" >&2

echo " $bad_fields" >&2

echo "ipkg-build: This may be due to a missing initial space for a multi-line field value" >&2

PKG_ERROR=1

fi

for script in $CONTROL/preinst $CONTROL/postinst $CONTROL/prerm $CONTROL/postrmdo

if [ -f $script -a ! -x $script ]then

echo "*** Error: package script $script is not executable" >&2

PKG_ERROR=1

fi

done

if [ -f $CONTROL/conffiles ]then

for cf in `cat $CONTROL/conffiles`do

if [ ! -f ./$cf ]then

echo "*** Error: $CONTROL/conffiles mentions conffile $cf which does not exist" >&2

PKG_ERROR=1

fi

done

fi

cd $owd

return $PKG_ERROR

}

###

# ipkg-build "main"

###

case $# in

1)

dest_dir=.

2)

dest_dir=$2

*)

echo "Usage: ipkg-build <pkg_directory>[<destination_directory>]" >&2

exit 1

esac

pkg_dir=$1

if [ ! -d $pkg_dir ]then

echo "*** Error: Directory $pkg_dir does not exist" >&2

exit 1

fi

# CONTROL is second so that it takes precedence

CONTROL=

[ -d $pkg_dir/DEBIAN ] &&CONTROL=DEBIAN

[ -d $pkg_dir/CONTROL ] &&CONTROL=CONTROL

if [ -z "$CONTROL" ]then

echo "*** Error: Directory $pkg_dir has no CONTROL subdirectory." >&2

exit 1

fi

if ! pkg_appears_sane $pkg_dirthen

echo >&2

echo "ipkg-build: Please fix the above errors and try again." >&2

exit 1

fi

tmp_dir=$dest_dir/IPKG_BUILD.$$

mkdir $tmp_dir

(cd $pkg_dir/datafind . -type f -print0 | xargs -0 md5sum ) >$pkg_dir/$CONTROL/md5sums

if [ ! -f "$pkg_dir/files.txt" ]then

(cd $pkg_dir/datafind . -type f -print0 |xargs -0 grep '' -l) >$pkg_dir/files.txt

fi

# tar -C $pkg_dir/data -cf $tmp_dir/data.tar -T $pkg_dir/files.txt -h --verify

tar -C $pkg_dir/data -cf $tmp_dir/data.tar . --verify

gzip -f $tmp_dir/data.tar

tar -C $pkg_dir/$CONTROL -czf $tmp_dir/control.tar.gz .

echo "2.0" >$tmp_dir/debian-binary

pkg_file=$dest_dir/${pkg}_${version}_${arch}.ipk

#tar -C $tmp_dir -czf $pkg_file ./debian-binary ./data.tar.gz ./control.tar.gz

(cd $tmp_dir ar -qc $pkg_file ./debian-binary ./data.tar.gz ./control.tar.gz mv $pkg_file ../)

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"

这个脚本我对它作过一处非常细微的修改,旧的脚本中在打包data.tar.gz时,对软连接和硬连接是将连接指向的文件进行打包的。而实际上我们没有必要这样做,我们可以直接将连接以原始方式打包到ipk的data.tar.gz中,这是ipk包允许的。而且实际上webOS系统中原本有好多包本来就是带有软连接的,如果不做这个修改,后面我们就不能正确的将系统全部打包回ipk。

好了,有了这个脚本,我们就可以自制ipk包了。首先建立一个包的目录,通常我们以包名来命名,然后在其下建立两个目录,分别为CONTROL和data,注意大小写。

CONTROL目录下放control.tar.gz解压之后的内容。其中不必包含md5sums,即使包含在打包时也会重新生成,因此不必担心md5sums的正确性。

data目录下放data.tar.gz解压之后的内容。注意它是相对于/的,里面的内容要包含相对于/的路径。另外,即使你希望这些内容被安装到/media/cryptofs/apps,也不要把这个路径建立到data目录下,这个路径是在安装时才决定的。

之后你可以对这两个目录下的内容进行修改编辑,添加删除内容都可以。修改完毕之后,退回到这个包目录的上级目录下,然后将其拥有者和用户组都改为root(对于普通包是这样的,对于系统包来说,我们应该在解压系统包时就保留系统包的用户组,在修改时不要变更原来文件的用户组)。最后执行ipkg-build 包名,就可以重新打包生成修改之后的ipk了。

.ipk 文件是可以通过 OpenWrt 的包管理软件 opkg 直接安装,好比 .deb 文件与 apt 的关系。虽然官方的软件仓库已经很丰富了,但是有时仍然需要从源码编译一些第三方的软件使用,例如锐捷认证等

但是由于路由器平台通常与常用的服务器或者个人 PC 的处理器架构不同,并且路由器的处理器本身性能较弱,几乎不雹迅链可能直接在路由器上进行编译生成 .ipk 文件,因此需要交叉编译来实现

而官方的 OpenWrt 仓库就提供了一个方便使用的交叉编译环境

以 Debian / Ubuntu 为例,参考 官网给出的要求 ,可以通过下面命令来进行安装依赖包

安装/更新好这些依赖之后,就可以通过 git 拉取 OpenWrt 仓库了

通常由于仓库较大以及网速问题,可能会需要很久,其实可以通过 --depth 来限制拉取的仓库深度,或者通过镜像站来加速拉取,当然也可以两者同时采用

进入 openwrt 仓库后,首先需要更新软件包列表 feeds ,它是在 OpenWrt 中共用位置的包的集合。运昌宴行以下命令即可更新内置软件包列表并链接到编译工具中:

通常使用图形化菜单界面来进行配置编译选项,依次配置处理器架构、具体的处理器型号以及设备

以小米 mini 路由器为例,应该将他们配置成如下图所示

这一步就是获取对应设备交叉编译所需的编译链

可以先搜索有没有已经配置好的含有 Makefile 的仓库,有了适配过的 Makefile 文件就可以很方便的来编译源码生成 .ipk 文件了

以 minieap 为例, github 上有已经完成的仓库,依次可以直接拉取来编译

在拉取完成仓库后,就可以再次配置编译选项,将需要编译成 .ipk 的功能配置成模块编译,也就是标记成 M

对于 minieap 来说,在 Network 找到对应选项并配置成 M 即可,如下图

配置完成后就可以进行源孙编译了,编译命令也很简单,以 minieap 为例如下所示

编译完成后, .ipk 文件会生成在 ./bin/packages/<YourArchitecture>/base 目录下,将其拷贝到路由器上就可以通过 opkg 进行安装使用了

有两种方式安装:

登录路由web界面(一般是192.168.1.1),在openwrt的软件安装界面上选择上传安装。

登录openwrt控制台,可用ssh登录或通过路由的TTL接口在控制台用命令进行安装:用winscp将下载的ipk安装包上传到路由器中,用命令opkg install xxx.ipk安装即可。

很多新手对linux下的软件安装存在误解,现在简单解释一下:

这类源代码包需要解压后(tar.gz的用tarzxvf解压,tar.bz2的用tarjxvf解压),进入解压目录,一般都有一个INSTALL的文本文件,里面一般都是安装的详细说明,可以用vi、nano、pico或X下面的文本编辑器(如gedit,gvim,kedit等)打开查禅弊看,安装一般就是三个步骤:

1、configure,这一步一般用来生成Makefile,为下一步的编译做准备,你可以通过在configure后加上参数来对安装进行控制,比如代码:

./configure--prefix=/usr

上面的意思是将该软件安装在/usr下面,执行文件就会安装在/usr/bin(而不是默认的/usr/local/bin),资源文件就会安装在贺丛族/usr/share(而不是默认的/usr/local/share)。同时一些软件的配置文件你可以通过指定--sys-config=参数进行设定。有一些软件还可以加上--with、--enable、--without、--disable等等参数对编译加以控制,你可以通过允许./configure--help察看详细的说明帮助。

2、make,这一步就是编译,大多数的源代码包都经过这一步进行编译(当然有些perl或python编写的软件需要调用perl或python来进行编译)。如果在make过程中出现error,你就要记下错误代码(注意不仅仅是最后一行),然后你可以向开发者提交bugreport(一般在INSTALL里有提交地址),或者你的系统少了一些依赖库等,这些需要自己仔细研究错误代码。

3、makeinsatll,这条命令来进行安装(当然有些软件需要先运行makecheck或maketest来进行一些测试),这一步一般需要你有root权限(因为要向系统写入文件)。

安装完毕后你就可以删除解压目录了。采用源代码编译方式来安装软件是Linux系统下最常见的安装软件方法,而且这种方法使你可以更加自由地控制安装细节,所以提倡大家多使用该方法安装软件郑茄。

PS:对于bin类型的安装文件,一般给该文件加上可执行权限,再运行之即可


欢迎分享,转载请注明来源:内存溢出

原文地址: https://outofmemory.cn/tougao/12400465.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-05-25
下一篇 2023-05-25

发表评论

登录后才能评论

评论列表(0条)

保存