定制rpm包(百度加老师)

目  录

一键定制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/



你可能感兴趣的:(rpm,包定制)