您的位置:首页 > 运维架构 > Linux

Centos下使用rpmbuild以及checkinstall制作RPM包

2014-05-17 14:39 417 查看
1 使用rpmbuild命令制作rpm包

制作rpm包最重要的工作就是要编写一个spec脚本,spec的编写比较复杂,本文只用最基本的流程制作了rpm包,想要深入了解spec脚本的朋友可以参考其他资料。

** 注意rpm只认tar.gz格式,所以需要先将要打包的目录压缩成tar.gz格式。

首先我们将下载来的tar.gz包放到/usr/src/redhat/SOURCES/下面,然后编辑一个spec文件,本文以nginx-1.0.5.tar.gz为例:

mv nginx-1.0.5.tar.gz /usr/src/redhat/SOURCES

vi nginx.spec

#最前面的一段主要定义一些关键字和变量

#name用来定义软件包的名称,后面可以使用%{name}的方式引用

Name: nginx

#version用来定义软件的实际版本号,后面可以使用%{version}使用

Version: 1.0.5

#release用来定义发布序列号,后面可以使用%{release}使用

Release: 1

#summary软件包的内容摘要

Summary: Test

#group定义软件分组

Group: System Enviroment/Daemons

#license定义软件授权方式

License: BSD

#buildroot定义了安装或者编译时的虚拟目录,通常为如下定下,后面可以使用%{buildroot}引用

BuildRoot: %{_tmppath}/%{name}-%{version}-%{release}-root-%(%{__id_u} -n)

#source制定源代码包,后面可以用%{source1}引用

Source0: nginx-1.0.5.tar.gz

#下面定义了nginx的安装目录,后面使用%{nginx_datadir}引用

%define nginx_datadir /usr/local/nginx

#%description用来定义描述软件的详细说明

%description

This is a test for nginx.spec

#另外还有其他诸如:

#URL:软件的主页

#Vendor:发行商或打包组织的信息

#Disstribution:发行版标识

#Patch:补丁源码,可使用Patch1、Patch2等标识多个补丁,使用%patch0或%{patch0}引用

#Prefix: %{_prefix} 指/usr

#Prefix: %{_sysconfdir} 指/etc

#Requires:该rpm包所依赖的软件包名称,例如libpng-devel >= 1.0.20 zlib

#Provides:指明本软件一些特定的功能,以便其他rpm识别

#Packager:打包者的信息

#####

#####

#%prep段后定义脚本预处理的一些操作,如解包打补丁等

%prep

#%setup -q 将tar.gz包解压出来

%setup -q

#%patch打补丁例如:

#%patch0 -p0 %patch0中0指定前面关键字段定义的补丁包

#%patch1 -p0

#%build段开始构建包

%build

#一下为编译nginx时使用的参数

export DESTDIR=%{buildroot}

./configure --user=nobody --group=nobody --prefix=%{nginx_datadir} --conf-path=%{nginx_datadir}/conf/nginx.conf --error-log-path=%{n

ginx_datadir}/logs/error.log --http-log-path=%{nginx_datadir}/logs/access.log

make

#%install段开始把软件安装到虚拟的根目录中

%install

rm -rf %{buildroot}

make install DESTDIR=%{buildroot} INSTALLDIRS=vendor

#%clean清理临时文件

%clean

rm -rf %{buildroot}

##其他的操作还有:

#%pre rpm安装前执行的脚本

#%post rpm安装后执行的脚本

#%preun rpm卸载前执行的脚本

#%postun rpm卸载后执行的脚本

#%preun %postun 的区别是前者在升级的时候会执行,后者在升级rpm包的时候不会执行

#%file段定义哪些文件和目录会放入rpm中

%files

#%defattr指定包装文件的属性

%defattr(-,root,root,-)

%{nginx_datadir}

#%exclude 列出不想打包到rpm中的文件

#%changelog 变更日志

以上是整个spec文件的内容,以及一些解释。

编写完之后,使用rpmbuild命令生成rpm包

rpmbuild -ba nginx.spec

命令完成后rpm包会在/usr/src/redhat/RPMS/下生成。

PS:

rpm软件包系统的标准分组:/usr/share/doc/rpm-4.3.3/GROUPS

各种宏定义: /usr/lib/rpm/macros

已经安装的rpm包数据库: /var/lib/rpm

避免生成debuginfo包:echo '%debug_package %{nil}' >> ~/.rpmmacros

修改rpm默认安装路径的方法:

rpm -ivh --prefix=/opt/usr xxx.rpm

rpm xxx.rpm --relocate=/usr=/opt/usr --relocate=/etc=/usr/etc

wget http://www.1kwen.com/linux_doc/nginx.spec 此处为例子的源文件。

2 使用软件checkinstall生成rpm包

安装checkinstall,使用源码包安装checkinstall

wget http://www.1kwen.com/linux_package/checkinstall-1.6.2.tar.gz -O
/tmp/checkinstall-1.6.2.tar.gz

cd /tmp

tar xf checkinstall-1.6.2.tar.gz

cd checkinstall-1.6.2

./configure && make && make install

安装完后使用checkinstall命令将本身打成rpm包

checkinstall

运行后会产生交互式的shell,只要选择打包方式RPM,其他全默认即可。

完成后包会在/usr/src/redhat/RPMS目录下。

参考:http://hlee.javaeye.com/blog/343499

-----------------------------------------------------------------------


利用rpmbuild制作MySQL的rpm包

1、配置环境

yum -y install rpmbuild

2、下载源代码rpm包

mkdir /root/download

cd /root/download

wget http://www.percona.com/redir/downloads/Percona-Server-5.1/Percona-Server-5.1.58-12.9/source/Percona-Server-51-5.1.58-rel12.9.271.rhel6.src.rpm

3、安装打包MySQL时依赖的包

yum -y install perl readline-devel gcc-c++ ncurses-devel zlib-devel libtool automake autoconf time ccache bison

4、安装percona的源代码

rpm -ivh Percona-Server-51-5.1.58-rel12.9.271.rhel6.src.rpm

安装了2个文件,它们的位置是

/root/rpmbuild/SOURCES/Percona-Server-5.1.58.tar.gz

/root/rpmbuild/SPECS/percona-server.spec

5、修改percona-server.spec

加入我们自己的编译参数

vi percona-server.spec



# The --enable-assembler simply does nothing on systems that does not

# support assembler speedups.



%if %{YASSL_BUILD}

之间的一段修改成这样

# The --enable-assembler simply does nothing on systems that does not

# support assembler speedups.

sh -c "CFLAGS=\"$CFLAGS\" \

CXXFLAGS=\"$CXXFLAGS\" \

AM_CPPFLAGS=\"$AM_CPPFLAGS\" \

LDFLAGS=\"$LDFLAGS\" \

./configure \

$* \

--with-comment=MC-DB \

--with-server-suffix=-MC-DB-Server \

--with-charset=utf8 \

--with-plugins=blackhole,csv,innodb_plugin \

--enable-assembler \

--enable-local-infile \

--with-mysqld-user=%{mysqld_user} \

--with-unix-socket-path=/tmp/mysql.sock \

--with-pic \

-prefix=/usr \

--with-extra-charsets=gbk,gb2312,utf8 \

--without-debug \

--with-pthread \

--enable-thread-safe-client \

--with-client-ldflags=-all-static \

--without-ndb-debug \

%if %{YASSL_BUILD}

保存退出

6、定义在打包过程中不进行测试

export MYSQL_RPMBUILD_TEST="no"

7、开始打包

cd /root/rpmbuild/SPECS/

rpmbuild -bb percona-server.spec

等待一段时间就可以看到编译好的软件包

/root/rpmbuild/RPMS/x86_64

Percona-Server-client-51-5.1.58-rel12.9.rhel6.x86_64.rpm

Percona-Server-devel-51-5.1.58-rel12.9.rhel6.x86_64.rpm

Percona-Server-server-51-5.1.58-rel12.9.rhel6.x86_64.rpm

Percona-Server-shared-51-5.1.58-rel12.9.rhel6.x86_64.rpm

Percona-Server-test-51-5.1.58-rel12.9.rhel6.x86_64.rpm

7、安装顺序

先安装这个

Percona-Server-shared-51-5.1.58-rel12.9.rhel6.x86_64.rpm

再安装其他软件包

8、已知问题:

无法打包为一个包

无法将所有问题安装到一个目录,例如我们之前一直安装的目录/usr/local/mysql

9、题外话

一般MySQL源代码包都有包含打包所需要的spec文件,一般存放在support-files/下

-------------------------------------------------------------

将nginx的tar包制作为RPM包

1. 下载nginx的源码包

2. 将文件放到/usr/src/redhat/SOURCES/目录下

3. 编写SPEC文件

[root@mail SPECS]# vi nginx-0.8.35.spec

Summary:the first rpm package

Name:nginx

Version:0.8

Release:35

Vendor:chenwei01@corp.the9.com

License:Share

Group:Applications/Text

Source0:nginx-0.8.35.tar.gz

%description

my test nginx

%prep

tar -zxvf $RPM_SOURCES_DIR/nginx-0.8.35.tar.gz

%build

cd $RPM_BUILD_DIR/nginx-0.8.35

./configure

make

%install

cd $RPM_BUILD_DIR/nginx-0.8.35

make install

%clean

rm -rf $RPM_BUILD_DIR/nginx-0.8.35

%files

%defattr(-,root,root)

/usr/local/nginx/sbin/nginx

%doc $RPM_BUILD_DIR/nginx-0.8.35/README

4. 制作RPM包

[root@mail SPECS]# rpmbuild -ba nginx-0.8.35.spec

若运行没有错误,则产生/usr/src/redhat/RPMS/i386/nginx-0.8-35.i386.rpm 和/usr/src/redhat/SRPMS/nginx-0.8-35.src.rpm 两个文件。

rpmbuild 生成rpm包。

包有两种,binary包和source包。

rpm包有包信息和内容组成。rpm -qpi nginx.rpm可以查看到包的信息。

如:



relocations:如果非空,表示包可以安装到新的目录。在安装包的时候,使用--relocate=/usr/loca/=/home/cyx/ 这样来修改包的安装位置。

不过可能不能使用,因为包是二进制的,可能程序编译的时候使用了绝对路径。

rpm包制作由rpmbuild来生成。rpmbuild用到了几个目录:

BUILD BUILDROOT RPMS SOURCES SPECS SRPMS

BUILD:build过程执行的目录

RPMS:最后生成的RPM包的位置

SOURCES:源文件位置

SPECS:spec文件的位置,rpmbuild使用spec文件的描述信息来build包

SRPMS:源代码rpm包的位置

rpm宏文件定义了rpmbuild使用的一些参数和变量。

如上面几个目录(rpmbuild的基地)在哪儿。默认是在/usr/local/....下面。

在自己的家目录下面建立.rpmmacros文件,可以在里面设置自己的

%_tmppath /home/admin/tmp build建立包的时候,install到的目录。

%_topdir /home/admin/rpm 上面6个目录的位置。默认是/usr/...

%_prefix /home/admin/install 前缀

spec文件是指导rpmbuild生成包的关键文件。放在SPECS目录下面:

----------------------------------example------------------------------------------------------------------

[root@v092019 SPECS]# cat nginx-0.8.54.spec

Name:nginx 包名

Summary:nginx-server! 摘要

Version:0.8.54 版本

Release:1 发行

Group:taobao.com 组织

License:GPL 许可

URL:http://www.nginx.com/ 官网

BuildRoot:%{_tmppath}/%{name}-%{version}-%{release}-root build的目录,会在这里build出二进制

Source:%{name}-%{version}.tar.gz 源码文件的名称,放在SOURCES目录下

Prefix:%{_prefix} 前缀,有这个值,包生成时候就有relocations。

Packager:nginx 包名称

%description 下面是对包的描述

nginx-httpd-server

%prep 下面是准备工作

%setup -q 这里使用了内建命令,解开源码包到BUILD目录

%build 开始建立包,对应于configure和make,在BUILD目录

CFLAGS="-g" ./configure

make -j `cat /proc/cpuinfo | grep processor | wc -l`

%install 安装包到Buildroot

make DESTDIR=$RPM_BUILD_ROOT install

%files 最后,把文件打包进rpm包,这里指定要打包进去的文件,权限和属主,这里的目录是相对于Buildroot的目录,但是要以'/'开头。

%defattr(755,daemon,daemon)

/usr/local/%{name}

%pre 在用rpm命令安装包前执行这里的动作

echo nginx,preinstall

%post 在用rpm命令安装完后执行这里的动作

echo nginx,afterinstall,done

%preun 在卸载前执行这里的动作

echo nginx,uninstall

%postun 在卸载后执行这里的动作

echo nginx,uninstall,done

---------------------------------------------end-----------------------------------------------------------------

这样我们就可以定制自己的rpm包了
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: