2017年(8)
分类: LINUX
2017-03-22 14:33:52
原文地址:rpm和pkg安装包的制作方法 作者:zhm_sunboy
RPM安装包的制做方法
RPM(RPM Package Manager)是一个开放的包管理器,它使用户可以从源码构建一个二进制的软件发行包和利用补丁包给软件打补丁。RPM包非常灵活易用,因此被作为很多linux发行版的默认软件安装包。
创建一个RPM安装包是件很容易的事,特别是当你可以获得软件的源代码包的时候。下面介绍怎么制做一个RPM软件安装包,在继续之前,我们假设你已经知道怎么从源代码安装一个软件包。
制做一个RPM软件安装包有以下几个步骤:
(1)获得软件的源代码包
(2)如果你自己修改了软件,那么给它做一个补丁
(3)编写一个包含软件包信息的spec文件
(4)确保软件被正确的安装到适当的位置
(5)创建RPM安装包
从上面的几步我们可以看到,制做一个RPM包最主要的就是第三步编写一个spec文件,下面介绍怎么编写这个spec文件。一个spec文件分成下面几个小节
一、前言(preamble)
当用户查询软件包信息的时候,RPM程序会打印出前言包含的信息。这一小节包含的信息有软件包的名称、功能描述、版本号、发行号和类型等信息。
二、准备(preparation)
从prep节开始是创建一个软件包要做的实际工作。故名思意,这一小节所做的都是一些必须的准备工作,它的内容就像一个普通的shell脚,为了使工作更容易,这一小节提供了两个可以使用的宏,一个是解压tar文件,并把当前工作目录设置为源代码目录,另一个是给源码打补丁。
三、创建(build)
就像prep小节一样,build的内容也是一个普通脚本,这一小节包含的是怎么编译源代码,它可以是一个简单的make命令或者一些更复杂的编译命令。因为现在的大多数软件都使用make编译,所以这一小节没有提供宏。
四、安装(install)
install小节同样也是一个脚本,它提供一些安装软件包的命令,如果源代码的makefile文件提供有make install命令,这一节你可以简单的包含一个make install命令,否则你就得提供一些像cp, mv或者install之类的命令集。
五、验证(verify script)
这一小节包含一个验证软件包的脚本,验证软件包不属于RPM的能力范围。
六、清除(clean)
这一小节包含一个编译好以后用于清除无用信息的脚本。这一脚本很少会用到,因为在大多数环境下,RPM会做好这些工作。
七、文件列表(file list)
这一小节包含一份文件列表,它们是组成RPM包的所有文件,当你用rpm -qpl 命令查看软件包的时候就会得到这一份文件列表。在这一小节也有几个宏可以用,它们指出哪些文件是文档,哪些是配置文件,哪里是目录等。
八、维护日志(changelog)
这一小节记录了软件包的维护日志。
spec文件有一个命名规则,其文件名由以下几部份组成:
软件包名-版本号-发行号.spec
下面我们举一个简单的spec文件,然后再来说明各部分的意思。文件如下:
Summary: GNU readline library
Name: readline
Version: 5.1
Release: 1
Copyright: GPL
Group: Library
Source: ftp://172.16.100.81/soft/readline-5.1.tar.gz
URL:
Distribution: GNU Project
Vendor: GNU
Packager: Yan Dingcheng
%description
The GNU readline library gets a line from user with editing.
%prep
%setup
%build
./configure --prefix=/opt/%{name}
make
%install
make install
%files
/opt/%{name}/lib/libhistory.a
/opt/%{name}/lib/libhistory.so
/opt/%{name}/lib/libhistory.so.5
/opt/%{name}/lib/libhistory.so.5.1
/opt/%{name}/lib/libreadline.a
/opt/%{name}/lib/libreadline.so
/opt/%{name}/lib/libreadline.so.5
/opt/%{name}/lib/libreadline.so.5.1
/opt/%{name}/include/readline/chardefs.h
/opt/%{name}/include/readline/history.h
/opt/%{name}/include/readline/keymaps.h
/opt/%{name}/include/readline/readline.h
/opt/%{name}/include/readline/rlconf.h
/opt/%{name}/include/readline/rlstdc.h
/opt/%{name}/include/readline/rltypedefs.h
/opt/%{name}/include/readline/tilde.h
/opt/%{name}/info/dir
/opt/%{name}/info/history.info
/opt/%{name}/info/readline.info
/opt/%{name}/info/rluserman.info
/opt/%{name}/man/man3/history.3
/opt/%{name}/man/man3/readline.3
%changelog
* Wed Jan 31 2007
+ create package
前言
Summary:这一行文字对软件包进行简短描述
Name:软件包的名字
Version:软件包的版本号,这里必须是你计划要使用的RPM文件版本号
Release:软件包的发行号,这里必须是你计划要使用的RPM文件发行号
Copyright:软件包的版权
Group:软件包的分组,这里定义怎么打包软件包
Source:软件包的来源,当你想再次获取该软件包或者查看它是不是有更新的版本的时候,这一行就很有用了。
URL:URL与Source不一样的地方就是,Source提供的是源代码的文件名,URL提供的是指向软件包文档的链接。
Distribution:指明软件包是属于哪个产品的一部份。
Vendor:软件包的生产厂商。
Packager:打包的组织或者个人。
discription:软件包功能的一个详细描述。
准备(prep)
%setup宏:解压源代码包并把当前工作目录设置到源代码目录。%setup宏做的主要工作类似于下面两条命令:
tar zxvf 源代码包文件名
cd RPM包名-版本号
所以如果你的源代码包解压以后的目录组成不是“RPM包名-版本号”的话,在这里使用%setup宏就会出问题。
创建(build)
这里使用了一个configure和make命令组合
安装(install)
这里使用了make install命令,因为makefile里有install标签了,所以就用它,简便。
文件列表(files)
这里是一个文件列表,列出的文件就是创建以后的RPM包将要包含的文件,文件路径要求是一个绝对路径,利用RPM命令安装这个软件包以后,这些文件将会按照这里指定的路径安装到系统中。在创建RPM包之前必须保证这里指定的文件在系统中都能找到,不然创建RPM包将会出错。所以如果是为了学习怎么编写一个spec文件的话,就像我上面那样,把软件安装到一个干净目录下(比如/opt),这样不会影响系统的正常工作。
这个文件列表目前还没有什么好的工具能够自动生成,因为RPM没法知道执行make install的时候到底安装了哪些文件。有的人建议用一个find命令来查找到底安装了哪些文件,但是我觉得这未必会有用。我一般是在configure的时候使用configure --prefix=/opt/package_name指定一个干净目录,先把软件安装到该目录下,然后查看软件包安装后都有哪些文件,通过这些文件生成一个文件列表,然后再使用configure命令重新安装一次软件包,这次把软件包安装到系统中,比如是/usr或者/usr/local目录下,然后把文件列表中的目录前辍改成相应的目录前辍(比如/usr或者/usr/local)就可以了。
维护日志(changelog)
维护日志是一些对软件包维护的日志记录,其中包含有一个时间信息,它有指定的格式:Wed Jan 31 2007。按顺序是 星期 月 日 年。
编写好spec文件以后在redhat linux下把软件源码包放到/usr/src/redhat/SOURCE目录下(如果是suse linux把软件源码包放到/usr/src/packages/SOURCE目录下),然后把spec文件放到/usr/src/redhat/SPECS目录下(如果是suse linux放到/usr/src/packages/SPECS目录下),最后转到/usr/src/redhat/SPECS目录下执行如下命令:
rpmbuild -ba spec文件名
执行成功以后会生成三个RPM文件并打印信息如下:
Wrote: /usr/src/redhat/SRPMS/readline-5.1-1.src.rpm
Wrote: /usr/src/redhat/RPMS/i386/readline-5.1-1.i386.rpm
Wrote: /usr/src/redhat/RPMS/i386/readline-debuginfo-5.1-1.i386.rpm
我们可以看到在RedHat系统下生成的RPM文件被放到/usr/src/redhat/RPMS/i386和/usr/src/redhat/SRPMS目录下,如果打包的RPM包是为了i586架构打的,那么RPM包会被放到i586目录下。其中readline-5.1-1.src.rpm是源码包,可以通过命令
rpmbuild --rebuild readline-5.1-1.src.rpm
重新生成二进制的RPM包。
Solaris系统下制做软件安装包的步骤
1、下载软件源码包
2、编译、安装软件,在configure的时候通过—prefix选项把软件安装到一个干净目录(空目录,比如/opt/mysoft)下,下面的步骤假设已经把软件安装到/opt/mysoft目录下。
3、#cd /opt/mysoft
4、#find . -print | pkgproto > prototype
这个命令会在你的当前目录下建立一个prototype文件,在这个文件里加入下面一行
i pkginfo=./pkginfo
并将文件里的用户名和组名(比如root)改成bin,不然在用pkgadd安装时将无法正常安装软件包。下面是一个完成的prototype文件例子。
i pkginfo=./pkginfo
d none include 0755 bin bin
d none include/libnet 0755 bin bin
f none include/libnet/libnet-asn1.h 0644 bin bin
f none include/libnet/libnet-functions.h 0644 bin bin
f none include/libnet/libnet-headers.h 0644 bin bin
f none include/libnet/libnet-macros.h 0644 bin bin
f none include/libnet/libnet-structures.h 0644 bin bin
f none include/libnet/libnet-types.h 0644 bin bin
f none include/libnet.h 0644 bin bin
d none lib 0755 bin bin
f none lib/libnet.a 0644 bin bin
5、在/opt/mysoft下建立pkginfo文件,格式如下
PKG="libnet"
NAME="libnet"
ARCH="i386"
VERSION="1.00"
CATEGORY="library"
VENDOR="Guangdong linux technology center"
EMAIL="dingcheng_yan@yahoo.com.cn"
PSTAMP="gdlc"
BASEDIR="/usr/local"
CLASSES="none"
这个文件的各项含义如下:
PKG=你所选择 package 目录的名称 (软件包的名称)
NAME=程序名称
ARCH=作业系统的版本(如sparc, i386等)
VERSION=软件的版本编号
CATEGORY= 这个软件的类型(如library,application)
VENDOR=开发这个软件的公司
EMAIL=e-mail 地址
PSTAMP=是谁作这个软体
BASEDIR=软件要安装到的目录(如/usr/local)
CLASSES=只要写 none 就好了
6、执行下面的命令
#pkgmk -r `pwd`
执行这个命令之后,会在/var/spool/pkg目录下建立一个package的目录(按上面的例子会建立一个libnet目录),可以把这个用tar和gzip打包压缩起来,安装时只要解压成libnet目录,到libnet目录执行命令
#pkgadd -d .
就可以了。这样一个软件安装包的制做就完成了。
7、也可以把软件安装包转换成datastream格式。步骤如下
(1)#cd /var/spool/pkg
(2)#pkgtrans -s `pwd` /tmp/libnet-1.00
执行上面的命令后会在/tmp目录下产生libnet-1.00这个datastream格式的软件安装包,可以用下面的命令来安装datastream格式的安装包:
#pkgadd -d libnet-1.00
下面是对pkgtrams的补充说明
所谓的file system格式,就是一般的档案格式,如果同时有好几个package在该目录下,使用”pkgadd -d .”就会列出所有的package。而datastream的格式,则是将整个file system做成一个档案,有点类似tar的作用。使用datastream格式的package来安装时必须指定文件名,不能用“.”来指定,而且每次只能安装一个package,但好处是只需要一个文件而己。要把file system的格式转换成datastream的格式可以用下面的命令:
#pkgtrans -s `pwd` dest
要把datastream格式转换成file system格式可以用下面的命令:
#pkgtrans source dest