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

来源:互联网 发布:淘宝千里眼插件 编辑:程序博客网 时间:2024/05/04 18:53

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/下

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

nginxtar包制作为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可以查看到包的信息。

如:

Centos下使用rpmbuild以及checkinstall制作RPM包 - zhuzhu - 五事九思  (大连Linux主机维护)

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包了


0 0
原创粉丝点击