将设为首页浏览此站
开启辅助访问 天气与日历 收藏本站联系我们切换到窄版

易陆发现论坛

 找回密码
 开始注册
查看: 72|回复: 0
收起左侧

linux之使用rpmbuild打rpm包

[复制链接]
发表于 2021-3-24 19:09:46 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有帐号?开始注册

x

  这里有5个文件夹,按照做菜原理可以理解为

    SPEC:核心配置文件,菜谱

    SOURCES:源文件存放,原料

    BUILD,/var/tmp/foo-root/:生成编译文件,模拟系统环境,炒锅

    RPMS:封装完成的rpm包 ,装盘

     http://image.bubuko.com/info/201707/20180111000215066057.png

规划:

     其实作为运维都知道,解决问题不算本事,能避免问题,把复杂的事做的简单才是水平。你若想制作属于自己的RPM,而且在本公司推下去一定回遵循以下几点:

     1、标准化, 软件安装目录,输出文件统一路径,配置文件规范,你不可能软件东一个,西一个,日志输出的到处都是吧,万一哪天磁盘空间满了,还得担责任是不?

     2、完整,尽量使功能完整,但不可把程序做的太死 比如一套Tomcat代码,我就分成了3个包,环境包、代码包、java包。

     以下是lnmp架构的规划目录:

http://image.bubuko.com/info/201707/20180111000215072893.png

干货:

重点就是SPEC的编辑,这里我用了不同的方法,没有使用rpmbuild的“锅”,因为安装软件也只是生成文件罢了,只要自己在测试环境可以编译安装成功那为什么还要扔给”锅”再炒一下,笔者写过多个spec也查过很多资料,在安装某些文件特别多的软件时,rpmbuild就会读取失败 而且还不报错,所以自己判断 它真的是一个”锅”,不能背!

      所以很佩服红帽官方的大神,不知道他们怎么实现的,也不想为此投入太多精力, 其实完全可以先在自己的测试环境把软件装好,打包成tar.gz格式,再加上一些软件的配置文件 打包到rpm内,在安装端解压释放执行,就完成了!


+ D( Y' O: ^& ?+ v% s+ t

实例:

    测试环境:

        centos6_x86-64

        php5.6

        163.repo

    1、rpmbuild打包环境准备

yum install -y rpm-build rpmdevtools redhat-rpm-config#安装打包环境useradd dabao#创建工作用户,不建议使用root因为root有无限大权限,封包时会可能会影响自身系统vim .rpmmacros%_topdir /home/dabao/rpmbuild#设置%_topdir宏,这个宏是定义打包目录的路径,默认是在/usr/src/redhatmkdir -p rpmbuild/{BUILD,RPMS,SOURCES,SPECS,SRPMS}#创建工作目录7 g6 Q! N: k" p7 o2 w- |

    2、在测试机中安装php

yum install zlib-devel libxml2-devel libjpeg-devel libjpeg-turbo-devel freetype-devel libpng-devel gd-devel libcurl-devel libxslt-devel libxslt-devel libmcrypt-devel mhash mcrypt openssl-devel bzip2-devel#php依赖要记下一会要写到spec中mkdir -p /data/app/tar xf libiconv-1.14.tar.gzcd libiconv-1.14./configure --prefix=/data/app/libiconv11make && make install#安装./configure --prefix=/data/app/php53 --with-config-file-path=/data/app/php53/etc --with-config-file-scan-dir=/data/app/php53/etc/php.d --with-mysql=mysqlnd --with-iconv-dir=/data/app/libiconv11 --with-freetype-dir --with-jpeg-dir --with-png-dir --with-zlib --with-bz2 --with-libxml-dir=/usr --enable-xml --disable-rpath --enable-safe-mode --enable-bcmath --enable-shmop --enable-sysvsem --enable-inline-optimization --with-curl --with-curlwrappers --enable-mbregex --enable-fpm --enable-mbstring --with-mcrypt --with-gd --enable-gd-native-ttf --with-openssl --with-mhash --enable-pcntl --enable-sockets --with-xmlrpc --enable-zip --enable-soap --enable-short-tags --enable-zend-multibyte --enable-static --with-xsl --with-fpm-user=www --with-fpm-group=www --enable-ftp makemake installuseradd www -s /sbin/nologin -Mmkdir -p /data/logs/#创建php用户及log目录( v- w6 N7 J! H( P, ?7 X

  软件调优,可根据环境调试:

#配置文件cp /root/tools/php-5.5.29/php.ini-production /etc/php.ini sed -i ‘910s#;date.timezone = #date.timezone = "Asia/Shanghai"#g‘ /etc/php.ini#901行修改 date.timezone = "Asia/Shanghai"cp /data/app/php55/etc/php-fpm.conf.default /data/app/php55/etc/php-fpm.confsed -i ‘32s#;error_log = log/php-fpm.log#error_log = /data/logs/php-fpm56.log#g‘ /data/app/php56/etc/php-fpm.confsed -i ‘50s#;log_level = notice#log_level = error#g‘ /data/app/php56/etc/php-fpm.confsed -i ‘458s#;rlimit_files = 1024#rlimit_files = 32768#g‘ /data/app/php56/etc/php-fpm.confsed -i ‘164s#listen = 127.0.0.1:9000#listen = 127.0.0.1:9056#g‘ /data/app/php56/etc/php-fpm.confsed -i ‘235s#pm.max_children = 5#pm.max_children = 1024#g‘ /data/app/php56/etc/php-fpm.confsed -i ‘240s#pm.start_servers = 2#pm.start_servers = 16#g‘ /data/app/php56/etc/php-fpm.confsed -i ‘245s#pm.min_spare_servers = 1#pm.min_spare_servers = 5#g‘ /data/app/php56/etc/php-fpm.confsed -i ‘250s#pm.max_spare_servers = 3#pm.max_spare_servers = 20#g‘ /data/app/php56/etc/php-fpm.confsed -i ‘255s#;pm.process_idle_timeout = 10s;#pm.process_idle_timeout = 15s;#g‘ /data/app/php56/etc/php-fpm.confsed -i ‘261s#;pm.max_requests = 500#pm.max_requests = 2048#g‘ /data/app/php56/etc/php-fpm.confsed -i ‘441s#;slowlog = log/$pool.log.slow#slowlog = /data/logs/$pool56.log.slow#g‘ /data/app/php56/etc/php-fpm.conf#启动文件cat /etc/init.d/php-fpm56#! /bin/sh### BEGIN INIT INFO# Provides:          php-fpm# Required-Start:    $remote_fs $network# Required-Stop:     $remote_fs $network# Default-Start:     2 3 4 5# Default-Stop:      0 1 6# Short-Description: starts php-fpm# Description:       starts the PHP FastCGI Process Manager daemon### END INIT INFOprefix=/data/app/php56exec_prefix=${prefix}php_fpm_BIN=${exec_prefix}/sbin/php-fpmphp_fpm_CONF=${prefix}/etc/php-fpm.confphp_fpm_PID=${prefix}/var/run/php-fpm.pidphp_opts="--fpm-config $php_fpm_CONF --pid $php_fpm_PID"wait_for_pid () {        try=0        while test $try -lt 35 ; do                case "$1" in                        ‘created‘)                        if [ -f "$2" ] ; then                                try=‘‘                                break                        fi                        ;;                        ‘removed‘)                        if [ ! -f "$2" ] ; then                                try=‘‘                                break                        fi                        ;;                esac                echo -n .                try=`expr $try + 1`                sleep 1        done}case "$1" in        start)                echo -n "Starting php-fpm "                $php_fpm_BIN --daemonize $php_opts                if [ "$?" != 0 ] ; then                        echo " failed"                        exit 1                fi                wait_for_pid created $php_fpm_PID                if [ -n "$try" ] ; then                        echo " failed"                        exit 1                else                        echo " done"                fi        ;;        stop)                echo -n "Gracefully shutting down php-fpm "                if [ ! -r $php_fpm_PID ] ; then                        echo "warning, no pid file found - php-fpm is not running ?"                        exit 1                fi                kill -QUIT `cat $php_fpm_PID`                wait_for_pid removed $php_fpm_PID                if [ -n "$try" ] ; then                        echo " failed. Use force-quit"                        exit 1                else                        echo " done"                fi        ;;        status)                if [ ! -r $php_fpm_PID ] ; then                        echo "php-fpm is stopped"                        exit 0                fi                PID=`cat $php_fpm_PID`                if ps -p $PID | grep -q $PID; then                        echo "php-fpm (pid $PID) is running..."                else                        echo "php-fpm dead but pid file exists"                fi        ;;        force-quit)                echo -n "Terminating php-fpm "                if [ ! -r $php_fpm_PID ] ; then                        echo "warning, no pid file found - php-fpm is not running ?"                        exit 1                fi                kill -TERM `cat $php_fpm_PID`                wait_for_pid removed $php_fpm_PID                if [ -n "$try" ] ; then                        echo " failed"                        exit 1                else                        echo " done"                fi        ;;        restart)                $0 stop                $0 start        ;;        reload)                echo -n "Reload service php-fpm "                if [ ! -r $php_fpm_PID ] ; then                        echo "warning, no pid file found - php-fpm is not running ?"                        exit 1                fi                kill -USR2 `cat $php_fpm_PID`                echo " done"        ;;        *)                echo "Usage: $0 {start|stop|force-quit|restart|reload|status}"                exit 1        ;;esac
0 V# ?& }" n% ~/ f+ v0 C

  完成之后你就可以启动下你的php试试了,启动测试成功后,请关闭服务正式开始我们打RPM包

    2、开始制作rpm包

cd /data/apptar zcvf php56.tar.gz php56tar zcvf libiconv11.tar.gz libiconv11cp php56.tar.gz /home/dabao/rpmbuild/SOURCEScp libiconv11.tar.gz /home/dabao/rpmbuild/SOURCEScp /etc/init.d/php-fpm56 /home/dabao/rpmbuild/SOURCES#把原料准备好: I! `8 `% c+ B* j% s

  编写spec文件

vim /home/dabao/rpmbuid/SPECS/php56.spec%define name t-php%define version 5.6.30%define _prefile /appSummary:        t-phpName:           %{name}Version:        %{version}Release:        2Group:          System Environment/DaemonsLicense:        GPLURL:            www.php.orgPackager:       tajZhangVendor:         tajZhangSource0:        php56.tar.gzSource1:        php-fpm56Source2:        libiconv11.tar.gzBuildRoot:      %{_tmppath}/%{name}-%{version}-root#BuildRequires: Requires:       zlib-devel libxml2-devel libjpeg-devel libjpeg-turbo-devel freetype-devel libpng-devel gd-devel libcurl-devel libxslt-devel libxslt-devel libmcrypt-devel mhash mcrypt openssl-devel bzip2-devel%descriptionphp5.6.30 copy install.basedir /data/app/php56 /data/app/php56/etc%prep#%setup -q%build#mkdir -p %{buildroot}/usr/java/jdk1.6.0_22#cp -r * /usr/java/jdk1.6.0_22%installrm -rf %{buildroot}mkdir -p %{buildroot}/data/appmkdir -p %{buildroot}/etc/init.dcp -i %{SOURCE0} %{buildroot}/data/appcp -i %{SOURCE2} %{buildroot}/data/appcp -i %{SOURCE1} %{buildroot}/etc/init.d#cp -i %{SOURCE1} %{buildroot}/etc/init.d/ && chmod +x %{buildroot}/etc/init.d/mysqld#cp -i %{SOURCE2} %{buildroot}/etc/%pre#if [ $1 == 1 ];then#fi%postif [ $1 == 1 ];thentar xf /data/app/php56.tar.gz -C /data/app/tar xf /data/app/libiconv11.tar.gz -C /data/app/rm -f /data/app/php56.tar.gz /data/app/libiconv11.tar.gzmkdir -p /data/logsuseradd www -s /sbin/nologin -Mchmod +x /etc/init.d/php-fpm56/etc/init.d/php-fpm56 startchkconfig php-fpm56 onecho "install over"fi%preunif [ $1 == 0 ];then/etc/init.d/php-fpm56 stoprm -rf /data/app/php56rm -f /etc/init.d/php-fpm56echo "remove over"fi%postun%cleanrm -rf "%{buildroot}"rm -rf %_topdir/BUILD/%{name}-%{version}%files%defattr (-,root,root,0755)/etc/init.d/php-fpm56/data/app/php56.tar.gz/data/app/libiconv11.tar.gz
. s5 a: g# M# g

  执行打包命令

rpmbuild -ba php56.spec#到SPECS目录下执行,如果没有报错会在RPMS/x86_64/目录下生成你打好的包cd /home/dabao/rpmbuild/RPMS/x86_64/   t-php-5.6.30-2.x86_64.rpm! {* f- v0 n' ^2 {

  到此你的第一个rpm包制作完成,拿到测试机上装下试试吧!

分析:

什么?稀里糊涂的根本不懂SPEC里写的什么,其实它只是个模板,摘录一段各位看了一目了然:

----------------------------------分割线---------------------------------------------------------------------------------

SPEC配置文件讲解
; Z3 ?7 C* t! z/ Y* q#/** 定义宏段 **/
- Y' j$ \8 ^/ ~, u* q' r%define name nginx  <==定义name宏伟nginx,后面可以调用这个宏%{name}% k- S7 q' H' }% j: l9 x2 J
%define version 1.2.4 <==定义version宏为1.2.4
8 ]0 ^1 h; g  t1 t8 ]1 D%define _prefix /application/nginx
* {7 Y8 |1 Z  S' e7 [* d9 A  ]8 n& R, b! v. t, m$ j& _
#/** 简介段 **/
! v+ _+ O' D$ T" s: [Summary:    information <==软件包的概要信息,不要超过50个字符4 G2 h! v: H' \' i4 n$ `  v  G
Name:    %{name}   <==软件包的名称,调用上面的宏7 I) I+ E( H" @# v2 C
Version:    %{version} <==软件包的版本,调用上面的宏( t# q: O* h; e7 }8 U. p% Y5 i" H& }
Release:    1    <==软件包发布序列号,表明第几次打包8 b, I  K4 }/ [. Q
License:    GPL <==软件授权方式,通常是GPL
" h, h. _& U6 S1 LGroup:       System Environment/Daemons <==软件包分组,属于哪个组包建议使用标准分组,查看/usr/share/doc/<wiz_tmp_highlight_tag>rpm-4.4.2.3/GROUPS
  {! r  H  T. M4 e9 MURL:    http://nginx.org/    <==源代码软件包的官方地址或源码包下载地址
" Z/ |% ~" I/ _- }1 t 9 C- @( l5 I" ?4 ^) d$ q6 k$ z, k
Packager:    coral <919953500@qq.com>  <==软件包的作者及联系方式
- k" y) x: \$ I$ h- Z) YVendor:    coral                   <==软件包开发者的名字8 Y/ Y; P' c# |1 {4 |1 f
Source0:    %{name}-%{version}.tar.gz <==源代码软件包的名字,如nginx-1.2.4-tar.gz
1 i& W. x4 x7 z  L  HSource1:    nginx.init           <==如果需要需要安装多个源码软件包,可指定多个Source
3 _, O1 d& ^+ Y% I3 a1 @比如Source0 Sourcel Source100等,数字可以不连续,后面使用%{Source0}来调用( B/ D" ]& B# g; ~! s8 k& [/ r; L
. I/ n+ k5 F5 b3 d3 Y: t
Patch1:      httpd-2.2.22-pcre830.patch  <==指定补丁文件
7 d$ s0 ?8 \# F9 m4 kPatch2:      httpd-2.2.21-mod_proxy-change-state.patch
$ ~% c9 p. s/ m, ]& J; v8 ^& M) Z5 q# p9 a1 ^
BuildRoot: %{_tmppath}/%{name}-%{version}-root  <==这是make install 使用的虚拟目录,安装后打包,就将该目录下打,通常是/var/tmp/软件名-版本号-发布序列号,该虚拟目录是自动创建的( [, X1 e$ r8 w  K/ H
说明:引用buildRoot这个宏时,可以写成$<wiz_tmp_highlight_tag>RPM_BUILD_ROOT,也可以鞋厂%{buildroot}方式来引用
, `% ^4 N/ V0 v  l( g" t% h
/ V- w+ P/ W3 f  s1 R, l; I, JBuildRequires:  gcc,make  <==制作<wiz_tmp_highlight_tag>RPM包过程所依赖的软件包,多个包依赖用逗号分隔5 w, }2 I- L! Z. t6 y' `6 y
Requires:        pcre,pcre-devel,openssl,openssl-devel,zlib,zlib-devel,chkconfig <==安装过程中所依赖的软件包
! _* @9 A* y" l* }7 ?7 \提示:可以使用>=或<=表示大于或小于某一特定版本,如:libpng-devel >= 1.0.20 zlib不同的软件名使用空格分块
) Q' g$ Z! @/ S" T0 j提示:还有PreReq、Requires(pre)、Requires(post)、Requires(preun)、Requires(postun)、BuildRequires等都是针对不同阶段的依赖包指定
0 n7 s7 g0 t# `, b! d# t# F* l* N0 i! o% g
%description  <==软件包详细描述信息,一行不要超过50个字符,回车换行,尅使用多行
1 Q7 o% ~# s/ n) zThis is an open-source software,bulk distribution ...0 {% e* @! X% u% ?
- 强制换行
% o) N, Z  `; z- i3 ]' u( K$ a
5 b' H$ r5 Z# X$ q( ]#/** 准备段 **/
4 k* m% ?7 J0 R1 a: _/ U( W%prep   <==安装前的准备工作,一般用于解压源码包7 C2 ^! V' f) z1 C0 F! ^- t, w
%setup -q    <==%setup是宏命令,可自动完成解包工作
9 y+ [% x6 B  ~1 K8 t2 Q说明:预处理一般是将源码包解压,有两种情况:一就是同事编译多个源码包,二就是源码的tar包的名称于解压出来的目录不一致,此时需要-n参数指定一下,如:%setup -q -n %{Source0},有时候解压出来的tar.gz与包名不符合,这时候需要指定-n参数,如%setup -q -n nagios,后面不加版本号* R# `2 e( X, Y9 S$ S+ ^

) i3 \2 |+ q8 `+ A%path1          <==打补丁   
* V1 c0 h4 t/ @  Q( D3 l* r. x6 P. `3 ] ; J% C2 }5 y$ Q" w
#/** 编译段 **/
+ T" ^! B( L0 k1 A%build      <==源码编译,如: ./configure && make 命令4 e9 b0 x! r$ W, r! o5 Q$ p
./confingure \
9 M( Y& b6 k* ]. l: w: w/ x0 I     --prefix=%{_prefix} \; ?1 f* g+ _& K* D( G2 y
     --user=nginx \
$ f% z9 W8 X6 ?' F" ~$ R5 O     --group=nginx \
% i4 d( O; \* d; `     --with-http_stub_status_module \: b, V# U8 E5 b0 ~1 _% V, w+ G
     --with-http_ssl_module \2 Y  c6 y0 a0 \& L! d, L/ I# `9 j1 }
     --with-pcre1 I  u3 ~4 U7 f% H- p4 v! ^
make# p8 }! j/ m4 b& {# \1 B
#make %{?_smp_mflags}  <==使用多核CPU加速编译过程,相当于命令行中的make -j
4 l, r* [1 M& X8 Z
* V/ E& M! F+ C. p# B#/** 安装段 **/
6 ]; h7 }- N! j5 s: P%install    <==源码安装,如:make install 命令) W" U4 T; @4 d# }' k8 g* v3 o
rm -rf %{buildroot}   <==在此处设置删除buildroot虚拟根目录是为方式以前打包留下的文件,防止安装出错,才删除该目录
2 e. a6 P2 p2 v: nmake install DESTDIR="%{buildroot}"     <==指定编译安装的路径到buildroot,而不是安装到系统中; E  o. K# ]6 t5 T; R: v% z) ~
%{__install} -p -d -m 0755 %{buildroot}/var/log/nginx   <==在虚拟根目录下创建目录,并授予权限
) a+ m7 y3 y4 P3 F" y8 X%{__install} -p -D -m 0755 %{SOURCE1} %{buildroot}/etc/init.d/nginx  <==安装启动脚本到init.d目录
* {1 Q6 m7 k2 F7 _: P注意:无论上面定义的SOURCE1是不是大写,这里调用必须为大写3 ~$ J1 I- V2 r4 _/ a$ n9 i8 q
说明:%prep  %build %install段,除了可以执行<wiz_tmp_highlight_tag>rpm所定义的宏命令(以%开头),还可以换行执行shell命令,比如直接写tar -zxf xxx.tar.gz命令,而不使用%setup -q宏
4 ?. d/ x9 v  l6 ~2 g7 G
- Z  P1 z, G8 Y+ [4 ]6 y#/** 脚本段 **/) R% O+ X* e3 u) e) E) E
%pre    <==<wiz_tmp_highlight_tag>rpm安装前执行的脚本,比如创建用户,设置变量等等操作
3 _, w  h. y) m, aif [ $1 == 1 ];then
& v6 \! v, j6 a/ \$ d: L    /usr/sbin/groupadd nginx 2>/dev/null* U6 ~! p, m% @% U1 n1 {
    /usr/sbin/useradd -g nginx -s /sbin/nologin -M nginx 2>/dev/null1 q& D) `" E3 r. y( {
fi
. E. E& K6 }0 v说明:$1等于1就是安装' @5 i; u* M; h+ a* ?- ^$ W, E
%post    <==<wiz_tmp_highlight_tag>rpm安装完成后执行的脚本,比如加载ldconfig函数库,加入开机自动启动等等$ x$ P% @' r" y/ u0 g
if [ $1 == 1 ];then) ]% E9 a4 J5 v) H5 Q6 q' ^6 f
   echo "/usr/local/lib" >>/etc/ld.so.conf.d/nginx.conf <==如果安装 lib库到/usr/local/lib中,需要配置该段
  ]  u; S7 u; [% q   /sbin/ldconfig 2>/dev/null
2 y4 h) B% q! p, ]# ], y   chkconfig --add %{name}
( S) n9 l2 O# o" J1 kfi
7 b2 j2 {! l4 _4 T2 \2 I说明 :$1等于1就是安装& g! Y* Y6 {, q7 @9 N9 c" G
%preun  <==<wiz_tmp_highlight_tag>rpm 卸载前执行的脚本
/ L: `2 r) d. [4 t, }+ k4 s1 ?if [ $1 ==0 ];then
0 r$ m% x5 y4 V& r+ x    /sbin/service %{name} stop >/dev/null 2>&1
, J' M& h6 S7 L: j% W. s    /sbin/chkconfig -del %{name}
- P) t( D% j' h$ w8 c6 dfi
; U6 T$ P4 f1 Z" i# U+ }# f说明: $1等于0就是卸载
+ ?! y5 V- h$ Y2 [%postun  <==<wiz_tmp_highlight_tag>rpm卸载完成后执行的脚本
0 i2 ^& T  `4 u2 T) n* p7 R# k/ ?* |, M. L9 T0 p' b, C% ^6 B3 }; r, h
说明%preun在升级的时候会执行,%postun在升级<wiz_tmp_highlight_tag>rpm包的时候不会执行
$ A; ~5 s( H- r- I( d. _3 \
8 l$ Z2 t" E& d+ p0 \8 n<wiz_tmp_highlight_tag>rpm还提供了一种信号机制:不同的操作会返回不同的信息,并放到默认变量$1中9 p7 |+ m& C1 @3 u( D# A$ k% S( t6 q: `
信号    说明
9 k4 w  c* ^9 u4 m- T0        卸载
% l' A4 Z( H. E& M  R1 ~1        安装
7 y& L/ z& _2 j8 W, @! o+ l, T2        升级6 S. N1 ~" S/ @0 e9 Z3 P4 Z- M) a

. E. o* ~6 H3 t5 l
. Q8 L- b9 s6 c4 n+ J#/** 清理段  **/% b' r" u3 V1 a# V* a
%clean      <==清理临时文件,通常为如下/ b3 f# E$ E0 v1 U$ a
rm -rf  "%{buildroot}"    <==删除虚拟目录
2 r- |/ T+ [6 H8 Z. Q) urm -rf   %_topdir/BUILD/%{name}-%{version}   <==将解压的源码包删除掉7 t' ~# i" h  [+ V

5 m& I2 L2 m: k* [. m0 T% p
0 Y6 {4 ~4 e( o7 r5 @#/** 文件段 **/6 @6 k( `: A- U" p7 X$ K7 K
%file     <==定义哪些文件或目录放入到<wiz_tmp_highlight_tag>rpm中
. ^* q0 M) `! h$ r. @7 W; N/usr/sbin/nginx <==指定包含的文件目录
# K8 a4 ?3 b2 |( v% j/etc/nginx/   <==指定包含的目录(文件后面有个/表示目录,目录里的所有文件)
" I. P0 l; G: Y1 D9 G  W; [%dir  /var/run/nginx    <==指定包含的文件,如果前面是%dir ,那么该nginx是一个空目录
) Z- d( z5 k5 O3 B2 S说明:用于定义软件包所包含的文件,分为三类:说明文档(doc),配置文件(conf),一级执行程序(sbin)
% {$ U) A: a1 _5 u! r注意:%files这里会在虚拟根目录下进行,千万不要写绝对路径,应该使用宏或变量表示相对路径
2 |$ F' j! ]5 E1 a: D  T%doc LICENSE CHANGES README    <==要打包的文档文件,如果不知道路径,默认是/usr/share下+ q! P) u% x; b9 h, ^7 l/ B
%defattr (-,root,root,0755)      <==定义默认权限0 X; c% a& @; Z; M% g3 r1 k
%{_prefix}     <==调用上面的定义宏,使用%defattr对/application/nginx目录设置安装文件的属性,第一个“-”表示默认文件权限(文件0644,目录0755),第二个"root"表示属主,第三个“root”表示属组,第四个“0755”设置的权限
7 y" f/ h  c! }- x  e. J, l/ i说明:%defattr和%attr宏作用基本一样,%defattr可以对目录进行递归授权,%attr针对单个文件# l0 L: T* T4 I+ S
它俩的区别参考资料:http://stackoverflow.com/questions/6952384/what-the-defattr-means-in-<wiz_tmp_highlight_tag>rpm-spec-files
- w- _% G- D2 g9 Y' \. I+ A
" ]$ c- a1 b6 p' `8 c4 p( U2 o" [%config(noreplace) %{_prefix}/conf/nginx.conf    <==nginx.conf配置文件放置到/application/nginx/conf目录下,config的文件为配置文件,noreplace表示升级<wiz_tmp_highlight_tag>rpm包的时候不替换该文件! }# j* g6 k4 k+ o
%config(noreplace) %{_prefix}/conf/fastcgi.conf   <==fastcgi.conf 配置文件放置到/application/nginx/conf 目录下
( o2 u1 W% j/ ~2 i4 |1 `, Z%config(noreplace) %{_prefix}/conf/fastcgi_params
- o6 ~5 P! t3 I/ o% ^%attr(0755,root,root) /etc.init.d/nginx  <==对单个文件授权,权限为"-"表示保留原有属性
- T' `" |# @5 A5 ?2 X3 Y8 `! Y注意:如果%exclude指定的文件不存在,也会报错
* ~# k, V! B- V4 q/ y. S #/** 改变日志段  **// R2 c1 b' u; h# |/ y% W
%changelog  <==把<wiz_tmp_highlight_tag>rpm包软件的每次修改记录到这里,保存到发布的<wiz_tmp_highlight_tag>rpm包中一般减号开始,以便查询
: a: m/ Z7 e2 T$ ~1 H' q% n- R* Wed Apr  11 2012 coral <919953500>  -1.2.4-1  <==以*开头,什么时间改的,什么人改的2 {, i- G6 s0 s7 Z7 b5 }9 H4 h
-  Initial  version       <==以-开头,干了什么事(初始版本)# u1 @5 W* f1 V1 [( z1 i
注意:此地方用中文会报错
! }4 e6 x# y* H: R/ x特别注意:%install 宏使用的是绝对路径,而%file部分使用相对路径
! M) Y' I- |$ I+ |1 E% e7 ]----------------------------------分割线---------------------------------------------------------------------------------
" A$ k0 l, l5 B- x& X: O5 ?0 z
5 ?$ j& s+ r5 W5 k. e! s2 w! r$ m0 ^

总结与启发:

    各位看到php的spec根本就没有经过解压与编译,而是直接将tar.gz复制到系统中,执行安装完成后命令。

    执行结束后为什么执行一次echo呢?因为这样才能让if的$?返回0,如果最后一条不是成功执行的命令,rpm就会安装报错。

    rpm机制是在系统子bsah下执行,不是当前bash,设置系统环境变量的重新登录才生效。

    %file段至关重要,因为这里记录了你要装盘的文件。


! Z6 A# j; n+ R, G" x. d; l9 y

    通过rpm的学习,觉得它可以做很多事,可以让小弟不在为安装文档抓头,而且可以配合yum机制定制自己的软件仓库,实现快速部署。甚至可以用rpm做代码包版本控制,当足够了解自己公司的业务也可以将程序打在一套软件组内,这样是不是更像docker呢?


* Q5 m* O; c1 T* K/ O# a
7 x* J+ i' b( m; H' B
您需要登录后才可以回帖 登录 | 开始注册

本版积分规则

关闭

站长推荐上一条 /4 下一条

如有购买积分卡请联系497906712

QQ|返回首页|Archiver|手机版|小黑屋|易陆发现 点击这里给我发消息

GMT+8, 2021-4-13 08:40 , Processed in 0.206692 second(s), 23 queries .

Powered by 龙睿 bbs168x X3.2

© 2001-2020 Comsenz Inc.

快速回复 返回顶部 返回列表