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