目 录
一键定制rpm包 1
第1章 Rpmbuild的应用! 2
第2章 fpm包安装 3
2.1 rpm包的组成 3
2.1.1 命名格式 3
2.1.2 功能和分包机制 4
2.2 fpm包安装 4
2.2.1 安装包 4
2.3 安装错误 5
第3章 【fpm参数详解之用法】 6
3.1 fpm 包命令参数详解 6
3.2 【小试牛刀】 7
3.2.1 步骤: 7
3.3 开始使用fpm制作 7
3.3.1 查看制作好的包的结果: 8
第4章 张导博客 8
4.1 使用实例�实战定制nginx的RPM包 8
4.1.1 1. 安装nginx 8
4.1.2 2. 编写脚本 8
4.1.3 3. 打包 9
4.1.4 4. 安装rpm包 9
4.2 注意事项 9
4.2.1 1. 相对路径问题 9
4.2.2 2. 软链接问题 10
4.3 定制LNMP的RPM包思路 10
一键定制rpm包
前提
rpm打包有2个,一个是自己写spec,另外要给是使用ruby的fpm,我个人比较倾向于第二种fpm,这个不需要写spec文件,特简单,不过为了让大家看明白,我分别介绍一下这2款软件是如何进行rpm打包的。
目录
一、使用spec构建rpm
二、使用fpm构建rpm(重点)
第1章 Rpmbuild的应用!
一、使用spec构建rpm
在构架rpm包的时候,需要经过3个过程
1、解压源码包
2、编译环境configure
3、make
然后再使用check install做rpm包
同时如果在安装rpm包的时候,你想查看安装过程可以使用,rpm -qi --scriptsname.rpm查看
如果在构架脚本或者其他非源码包安装的时候,可以使用rpmbild
1、把脚本目录给tar
2、构架spec
3、rpmbuild
注意的完成最终的工作了。请使用根目录用户身份安装rpmbuild命令。在Red Hat中,请用yum install rpm-build完成这项工作。接下来,请确保所有的文件都呆在正确的地方。Tar存档文件必须位于创建软件包的当前用户帐户的~/rpmbuild /SOURCES 目录下,demo.spec文件必须位于~/rpmbuild/SPECS目录下。现在你可以用rpmbuild -ba test.spec命令来创建软件包了。这会在~/rpmbuild/RPMS目录下创建你的RPM文件。
可以参考
http://www.linuxidc.com/Linux/2012-05/60278.htm
http://blog.csdn.net/cybertan/article/details/5972935
我做的测试是创建一个test目录,里有个test.log文件,内容是this is test file
然后给这个文件压缩成tar包,并存放到~/rpmbuild /SOURCES
之后再做个test.spec,内容如下
root@client:~/rpmbuild/SPECS#cat test.spec
Summary: Test package for dl528888 blog
Name: test
Version: 1.0.0
Release: 1
License: GPL
Group: test
Source: test.tar.gz
BuildRoot:%{_tmppath}/%{name}-%{version}-%{release}-root
Url: http://dl528888.blog.51cto.com
Packager: Linuxing
Prefix: %{_prefix}
Prefix: %{_sysconfdir}
%define userpath /tmp/demo
%description
Justa test rpm suite.
%prep
%setup-c
%install
install -d $RPM_BUILD_ROOT%{userpath}
cp-a %{name}* $RPM_BUILD_ROOT%{userpath}
%clean
rm-rf $RPM_BUILD_ROOT
rm-rf $RPM_BUILD_DIR/%{name}-%{version}
%files
%defattr(-,root,root)
%{userpath}
然后再对这个test.spec做安装rpm包,使用rpmbild-ba test.spec,之后就能在~/rpmbuild /RPMS目录下创建你的RPM文件。
第2章 fpm包安装
2.1 rpm包的组成
2.1.1 命名格式
1、RPM的命名格式:name-version-release.arch.rpm
name:这里指的是对应软件的名称,比如httpd,我们的apache服务
version:这里的版本主要指的是对应的源代码的版本号(这其中的version有三部分组成:主版本号、次版本号、发布号)
release:这个是这个RPM的修订的次数,发布商的发布版本号,与源代码的版本号无关
arch:这个是它所支持的硬件平台,有x86_64,i386,ppc,noarch等
例子:httpd-2.2.15-29.el6.x86_64.rpm
上面,我们以httpd服务为例,它的name就是httpd,version为2.2.15,release为29.e16(红帽或者Centos厂商修订发布的第29次),这里,还包含了此包使用的系统,即centos,arch就是x86_64。
说明下常见的el6是代表啥意思:
fcXX,elXX:表示这个软件包的发行商版本,就像这里的fc18,说明这个软件包是在Fedora
18下使用的。而openssl-1.0.0-20.el6.x86_64.rpm表示这个软件包是在RHEL 6.x(Red Hat Enterprise
Linux)/CentOS 6.x下使用。
2.1.2 功能和分包机制
2、RPM的打包功能及其分包机制:
核心包,即主包,它的命名与源程序一样(不是源代码啊)
例子:php-5.3.3-26.el6.x86_64.rpm,上面提到的httpd也是核心包
子包:它在name的后面有个子包名
例子:php-mysql-5.3.3-26.el6.x86_64.rpm,这里的mysql就是子包名
例子:mysql-devel-5.1.52-1.el6.x86_64.rpm
devel:表示这个RPM包是软件的子包开发包
2.2 fpm包安装
系统环境
[root@web01 ~]# cat /etc/redhat-release
CentOS release 6.7 (Final)
[root@web01 ~]# uname -r
2.6.32-573.el6.x86_64
[root@web01 ~]# uname -m
x86_64
安装依赖包
1 yum -y install ruby rubygems ruby-devel gcc
添加国内镜像
[root@ops-rpmbuild01 ~]# gem sources -a http://ruby.taobao.org/
改用
1 gem sources -a https://ruby.taobao.org/
移除默认的
1 gem sources --remove http://rubygems.org/
查看源
1 gem sources -l
2.2.1 安装包
gem install fpm
改用
1 gem install fpm -v 1.4.0
[root@ops-rpmbuild01 ~]# gem install fpm -v 1.4.0
Successfully installed fpm-1.4.0
1 gem installed
Installing ri documentation for fpm-1.4.0...
Installing RDoc documentation for fpm-1.4.0...
参考:
http://www.jianshu.com/p/df61ea673838
结果
成功安装
fpm --version
1.4.0
2.3 安装错误
【错误1 】
[root@ops-rpmbuild01 ~]# gem sources -a http://ruby.taobao.org/
Error fetching http://ruby.taobao.org/:
bad response Not Found 404 (http://ruby.taobao.org/specs.4.8.gz)
原因:淘宝停止基于 HTTP 协议的镜像服务 需要改用https的协议
【错误2】
[root@ops-rpmbuild01 ~]# gem install fpm
Building native extensions. This could take a while...
ERROR: Error installing fpm:
ERROR: Failed to build gem native extension.
/usr/bin/ruby extconf.rb
creating Makefile
原因: 系统没有gcc环境 ,安装yum install gcc
【错误3】
[root@ops-rpmbuild01 ~]# gem install fpm
Building native extensions. This could take a while...
Building native extensions. This could take a while...
ERROR: Error installing fpm:
ruby-xz requires Ruby version >= 1.9.3.
默认安装的是
[root@ops-rpmbuild01 ~]# ruby -v
ruby 1.8.7 (2013-06-27 patchlevel 374) [x86_64-linux]
解决办法: 1 更新ruby
解决办法2: 安装旧版本的fpm
[root@ops-rpmbuild01 ~]# gem install fpm -v 1.4.0
第3章 【fpm参数详解之用法】
3.1 fpm 包命令参数详解
语法:
fpm [OPTIONS] [ARGS] ...
选项:
-t 输出类型,我们是制作rpm包,所以-t rpm
-s 输入类型,一般是输入的目录 -s dir
-f 强制,即使安装的时候覆盖已经存在的源文件
-n 包名
-v 包的版本,默认是1.0
-d, 依赖包关系
-C CHDIR Change directory to here before searching for files(安装所需要文件的目录)
--iteration 1.el6 发行
-p ~/rpmbuild/RPMS/x86_64/ rpm包制作生成后的位置
--description 添加包的描述信息
--category 这个软件属于系统的哪个组
--url 包官方路径
--license License
-m, --maintainer MAINTAINER 默认是主机名
--no-rpm-sign
--workdir WORKDIR 工作目录默认是/tmp
注意:
关于组categroy: 查看linux(centos)上所有软件的分组情况可以查看文件
1 cat /usr/share/doc/rpm-4.8.0/GROUPS
License: 软件授权方式,通常就是GPL
3.2 【小试牛刀】
参考github的说明 nodejs的rpm包制作(和官网有一定的修改看个人习惯和使用的包种类,我使用rpm包)
https://github.com/jordansissel/fpm/wiki/PackageMakeInstall
3.2.1 步骤:
cd /usr/local/src
wget http://nodejs.org/dist/v0.6.0/node-v0.6.0.tar.gz
tar xzf node-v0.6.0.tar.gz
cd node-v0.6.0
./configure --prefix=/usr/local
make
This requires your 'make install' obey DESTDIR or otherwise allows you to install to a specific target directory.
mkdir /data/installdir
make install DESTDIR=/data/installdir
3.2.1.1 此时在/data/installdir这个目录下胡会生成很多目录文件
3.3 开始使用fpm制作
# Create a nodejs deb with only bin and lib directories:
# The 'VERSION' and 'ARCH' strings are automatically filled in for you
# based on the other arguments given.
fpm -s dir -t rpm -n nodejs -v 0.6.0 -C /data/installdir \
-n nodejs \
-p /root \
--epoch 0 \
-d "libssl0.9.8 > 0" \
-d "libstdc++6 >= 4.4.3" \
--verbose \
--iteration 1.el6 \
--category 'Development/Languages' \
--description 'Node.js real-time applications' \
--url 'nodejs.org' \
--license GPL \
usr/local/bin usr/local/lib
3.3.1 查看制作好的包的结果:
rpm -qpi /root/nodejs-0.6.0-1.el6.x86_64.rpm
http://www.zyops.com/ 参考张导博客
4.1 使用实例�实战定制nginx的RPM包
4.1.1 1. 安装nginx
1. yum -y install pcre-devel openssl-devel
2. useradd nginx -M -s /sbin/nologin
3. tar xf nginx-1.6.2.tar.gz
4. cd nginx-1.6.2
5.
6. ./configure --prefix=/application/nginx-1.6.2 --user=nginx --group=nginx --with-http_ssl_module --with-http_stub_status_module
7.
8. make && make install
9. ln -s /application/nginx-1.6.2/ /application/nginx
4.1.2 2. 编写脚本
1. [root@oldboy ~]# cd /server/scripts/
2. [root@oldboy scripts]# vim nginx_rpm.sh # 这是安装完rpm包要执行的脚本
3. #!/bin/bash
4.
5. useradd nginx -M -s /sbin/nologin
6. ln -s /application/nginx-1.6.2/ /application/nginx
4.1.3 3. 打包
1. [root@oldboy ~]# fpm -s dir -t rpm -n nginx -v 1.6.2 -d 'pcre-devel,openssl-devel' --post-install /server/scripts/nginx_rpm.sh -f /application/nginx-1.6.2/
2. no value for epoch is set, defaulting to nil {:level=>:warn}
3. no value for epoch is set, defaulting to nil {:level=>:warn}
4. Created package {:path=>"nginx-1.6.2-1.x86_64.rpm"}
5. [root@oldboy ~]# ll -h nginx-1.6.2-1.x86_64.rpm
6. -rw-r--r-- 1 root root 6.7M Nov 1 10:02 nginx-1.6.2-1.x86_64.rpm
4.1.4 4. 安装rpm包
安装rpm包的三种方法:
rpm命令安装
1. [root@LB-nginx-01 ~]# rpm -ivh nginx-1.6.2-1.x86_64.rpm
2. error: Failed dependencies:
3. pcre-devel is needed by nginx-1.6.2-1.x86_64
4. openssl-devel is needed by nginx-1.6.2-1.x86_64
5. 但会报如上依赖错误,需要先yum安装依赖才能安装rpm包。
yum命令安装rpm包
1. yum -y localinstall nginx-1.6.2-1.x86_64.rpm
2. 这个命令会自动先安装rpm包的依赖,然后再安装rpm包。
搭建内网yum仓库
YUM仓库搭建
4.2 注意事项
4.2.1 1. 相对路径问题
1. # 相对路径
2. [root@oldboy nginx]# fpm -s dir -t rpm -n nginx -v 1.6.2 .
3. no value for epoch is set, defaulting to nil {:level=>:warn}
4. no value for epoch is set, defaulting to nil {:level=>:warn}
5. Created package {:path=>"nginx-1.6.2-1.x86_64.rpm"}
6. [root@oldboy nginx]# rpm -qpl nginx-1.6.2-1.x86_64.rpm
7. /client_body_temp
8. /conf/extra/dynamic_pools
9. /conf/extra/static_pools
10. …………
11. # 绝对路径
12. [root@oldboy ~]# fpm -s dir -t rpm -n nginx -v 1.6.2 /application/nginx-1.6.2/
13. no value for epoch is set, defaulting to nil {:level=>:warn}
14. no value for epoch is set, defaulting to nil {:level=>:warn}
15. Created package {:path=>"nginx-1.6.2-1.x86_64.rpm"}
16. [root@oldboy ~]# rpm -qpl nginx-1.6.2-1.x86_64.rpm
17. /application/nginx-1.6.2/client_body_temp
18. /application/nginx-1.6.2/conf/extra/dynamic_pools
19. /application/nginx-1.6.2/conf/extra/static_pools
20. /application/nginx-1.6.2/conf/fastcgi.conf
21. /application/nginx-1.6.2/conf/fastcgi.conf.default
22. …………
23. 使用rpm -qpl 命令可以查看rpm包的内容。
24. 注:fpm类似tar打包一样,只是fpm打的包能够被yum命令识别而已。
4.2.2 2. 软链接问题
1. [root@oldboy ~]# fpm -s dir -t rpm -n nginx -v 1.6.2 /application/nginx
2. no value for epoch is set, defaulting to nil {:level=>:warn}
3. File already exists, refusing to continue: nginx-1.6.2-1.x86_64.rpm {:level=>:fatal}
4. # 报错是因为当前目录存在同名的rpm包,可以使用-f参数强制覆盖。
5. [root@oldboy ~]# fpm -s dir -t rpm -n nginx -v 1.6.2 -f /application/nginx
6. no value for epoch is set, defaulting to nil {:level=>:warn}
7. Force flag given. Overwriting package at nginx-1.6.2-1.x86_64.rpm {:level=>:warn}
8. no value for epoch is set, defaulting to nil {:level=>:warn}
9. Created package {:path=>"nginx-1.6.2-1.x86_64.rpm"}
10.
11. 打包看似成功,但查看包的内容,只是这一个软链接文件。
12. [root@oldboy ~]# rpm -qpl nginx-1.6.2-1.x86_64.rpm
13. /application/nginx
14. 原因:目录结尾的/问题,类似rm删除软链接目录
4.3 定制LNMP的RPM包思路
编译安装好nginx,mysql,php,此处有个问题,就是php的大部分依赖环境是通过yum安装的,但有一个libiconv-1.14.tar.gz包需要编译安装,安装时已经指定了安装目录,只需一同打包即可。
还有一个问题,就是mysql这个目录比较大,用fpm打包耗时长。平时我们有可能需要对nginx或php做优化,这样又得重新打包。因此我们可以将mysql分离出来,分别打包。只需在制作nginx+php的rpm包时添加mysql的依赖即可。
1. # 参考命令
2. [root@web2 ~]# fpm -s dir -t rpm -n web2 -v 1.1 \
3. --description 'lnmp.cms,bbs.blog' \
4. -d ‘libxslt-devel,nfs-utils,rpcbind,mysql,libmcrypt-devel,mhash,mhash-devel,mcrypt' \
5. --post-install /server/scripts/lnmp-init.sh \
6. /application /usr/local/libiconv/ /app/logs/ /data0/ /server/