|
这里有5个文件夹,按照做菜原理可以理解为 SPEC:核心配置文件,菜谱 SOURCES:源文件存放,原料 BUILD,/var/tmp/foo-root/:生成编译文件,模拟系统环境,炒锅 RPMS:封装完成的rpm包 ,装盘  规划: 其实作为运维都知道,解决问题不算本事,能避免问题,把复杂的事做的简单才是水平。你若想制作属于自己的RPM,而且在本公司推下去一定回遵循以下几点: 1、标准化, 软件安装目录,输出文件统一路径,配置文件规范,你不可能软件东一个,西一个,日志输出的到处都是吧,万一哪天磁盘空间满了,还得担责任是不? 2、完整,尽量使功能完整,但不可把程序做的太死 比如一套Tomcat代码,我就分成了3个包,环境包、代码包、java包。 以下是lnmp架构的规划目录: 
干货: 重点就是SPEC的编辑,这里我用了不同的方法,没有使用rpmbuild的“锅”,因为安装软件也只是生成文件罢了,只要自己在测试环境可以编译安装成功那为什么还要扔给”锅”再炒一下,笔者写过多个spec也查过很多资料,在安装某些文件特别多的软件时,rpmbuild就会读取失败 而且还不报错,所以自己判断 它真的是一个”锅”,不能背! 所以很佩服红帽官方的大神,不知道他们怎么实现的,也不想为此投入太多精力, 其实完全可以先在自己的测试环境把软件装好,打包成tar.gz格式,再加上一些软件的配置文件 打包到rpm内,在安装端解压释放执行,就完成了!
/ j% E6 O5 @" U实例: 测试环境: 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}#创建工作目录
: {4 W& x/ w/ U! r 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目录
# k: ~5 \# X1 \9 M$ S& u* O' \5 c 软件调优,可根据环境调试: #配置文件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
3 E) _: D1 x* u) N 完成之后你就可以启动下你的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#把原料准备好) A' T- u# M& d' q; t
编写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.gz8 F: T! {/ }" M- P4 A4 O
执行打包命令 rpmbuild -ba php56.spec#到SPECS目录下执行,如果没有报错会在RPMS/x86_64/目录下生成你打好的包cd /home/dabao/rpmbuild/RPMS/x86_64/ t-php-5.6.30-2.x86_64.rpm$ ]1 F( u7 i d3 k
到此你的第一个rpm包制作完成,拿到测试机上装下试试吧! 分析: 什么?稀里糊涂的根本不懂SPEC里写的什么,其实它只是个模板,摘录一段各位看了一目了然: ----------------------------------分割线--------------------------------------------------------------------------------- SPEC配置文件讲解& s& D" V) d# p: u: z+ [/ e
#/** 定义宏段 **/) C: e, Z! B! m. Y( n
%define name nginx <==定义name宏伟nginx,后面可以调用这个宏%{name}
; R9 _) }' ], f, u- e& Y& X& ^4 F, i%define version 1.2.4 <==定义version宏为1.2.4
5 w* a4 Y7 o ^%define _prefix /application/nginx
* E% e9 F8 N$ U
5 }! c7 j: K+ s1 v+ U% z% A: g2 m$ Y#/** 简介段 **/1 r0 Q5 y' \5 c6 I* |+ P5 o3 G
Summary: information <==软件包的概要信息,不要超过50个字符) K1 a8 X" M2 g Q5 E( N6 l
Name: %{name} <==软件包的名称,调用上面的宏+ S6 ]: u0 B$ t
Version: %{version} <==软件包的版本,调用上面的宏/ Y/ G V6 Y4 l: a
Release: 1 <==软件包发布序列号,表明第几次打包! y; J) c. c9 E, B
License: GPL <==软件授权方式,通常是GPL
0 f; u6 ]" A/ E1 d" F. bGroup: System Environment/Daemons <==软件包分组,属于哪个组包建议使用标准分组,查看/usr/share/doc/<wiz_tmp_highlight_tag>rpm-4.4.2.3/GROUPS
; L F7 g3 l* C+ z1 k9 g% o1 XURL: http://nginx.org/ <==源代码软件包的官方地址或源码包下载地址9 Z& l" h+ X% V- v6 z; v
0 ^9 L& } w9 F$ w8 B# `
Packager: coral <919953500@qq.com> <==软件包的作者及联系方式3 O9 M0 n6 P% G; |
Vendor: coral <==软件包开发者的名字3 O# S; c9 d0 \- Q, ?
Source0: %{name}-%{version}.tar.gz <==源代码软件包的名字,如nginx-1.2.4-tar.gz- q8 o1 ?0 G$ M7 z; |- m7 l& s( R
Source1: nginx.init <==如果需要需要安装多个源码软件包,可指定多个Source
- c/ i& v& b) {5 G比如Source0 Sourcel Source100等,数字可以不连续,后面使用%{Source0}来调用/ U1 l0 f' b8 e1 q6 G+ j( B' G1 V
6 ~5 d2 J1 ]) [9 O
Patch1: httpd-2.2.22-pcre830.patch <==指定补丁文件% j; i* H c& n" K' M7 ?0 X. G
Patch2: httpd-2.2.21-mod_proxy-change-state.patch
( ]) V* c" c. O2 w
3 N ~5 p9 C6 ?! {BuildRoot: %{_tmppath}/%{name}-%{version}-root <==这是make install 使用的虚拟目录,安装后打包,就将该目录下打,通常是/var/tmp/软件名-版本号-发布序列号,该虚拟目录是自动创建的
4 H/ ]; p- x# _& j说明:引用buildRoot这个宏时,可以写成$<wiz_tmp_highlight_tag>RPM_BUILD_ROOT,也可以鞋厂%{buildroot}方式来引用, Z+ X$ M$ P9 `% @) @
2 v3 M. X3 x9 |) Z4 ^BuildRequires: gcc,make <==制作<wiz_tmp_highlight_tag>RPM包过程所依赖的软件包,多个包依赖用逗号分隔
, c; e3 y2 Y2 Y2 r1 z3 v6 D3 y- GRequires: pcre,pcre-devel,openssl,openssl-devel,zlib,zlib-devel,chkconfig <==安装过程中所依赖的软件包
/ j. Z# O5 f: w9 X2 Z5 ~$ o+ w提示:可以使用>=或<=表示大于或小于某一特定版本,如:libpng-devel >= 1.0.20 zlib不同的软件名使用空格分块
! k- ^2 k* v' y7 A/ W& Y* X7 q提示:还有PreReq、Requires(pre)、Requires(post)、Requires(preun)、Requires(postun)、BuildRequires等都是针对不同阶段的依赖包指定
0 l' s9 E. v' \; X
4 H3 |' q2 G8 M%description <==软件包详细描述信息,一行不要超过50个字符,回车换行,尅使用多行/ U7 i. z6 W. C, V0 r2 f$ z
This is an open-source software,bulk distribution ...) m/ f; d# n2 \1 Q6 ^3 \
- 强制换行+ n- d+ M3 @3 j5 E# ?
7 n7 Y* D( t7 _; ]
#/** 准备段 **/
" B* h1 n5 `; i- o% C$ M1 l%prep <==安装前的准备工作,一般用于解压源码包
+ W3 V) O% g, u, x% }4 y%setup -q <==%setup是宏命令,可自动完成解包工作
! Q- E6 ~1 c3 X1 h: c9 V说明:预处理一般是将源码包解压,有两种情况:一就是同事编译多个源码包,二就是源码的tar包的名称于解压出来的目录不一致,此时需要-n参数指定一下,如:%setup -q -n %{Source0},有时候解压出来的tar.gz与包名不符合,这时候需要指定-n参数,如%setup -q -n nagios,后面不加版本号
; B" i0 w: _* W( k
( U1 b0 v+ g9 V% u+ u5 h%path1 <==打补丁
! ]3 |' ^ z5 _8 K. f: | 8 p! j1 N1 M$ u2 b& |4 e. G
#/** 编译段 **/+ E1 ^7 C0 C, r7 X: \
%build <==源码编译,如: ./configure && make 命令0 c, h) Q! u) }' x. e: U, y
./confingure \# {7 X% L& `& u
--prefix=%{_prefix} \$ ^4 B5 t: Z2 f" D9 o
--user=nginx \
8 N8 Q( k+ D- \/ n* S2 s --group=nginx \
$ n7 M& |7 o% _2 Q) ~4 U! I --with-http_stub_status_module \. `/ k7 u, L, Q" g' ~
--with-http_ssl_module \
, c# L& Z: t; d8 U5 M! O, P: W" ? --with-pcre7 k5 h$ G, @5 p( V5 @, d
make
3 F# \0 ~4 t4 H2 x6 N& W$ p#make %{?_smp_mflags} <==使用多核CPU加速编译过程,相当于命令行中的make -j1 m* E5 |/ [8 X# @- [# \. f# _
8 |1 W) M) `! [3 N, q' ]- j; v+ ]- Z#/** 安装段 **/+ Y! S0 B& N, y* i
%install <==源码安装,如:make install 命令! L( h$ J) V. n% G" ? V- t
rm -rf %{buildroot} <==在此处设置删除buildroot虚拟根目录是为方式以前打包留下的文件,防止安装出错,才删除该目录2 i8 A2 W) X+ V% m U( f5 v/ f
make install DESTDIR="%{buildroot}" <==指定编译安装的路径到buildroot,而不是安装到系统中! d' l0 P' _* p/ P# G3 w
%{__install} -p -d -m 0755 %{buildroot}/var/log/nginx <==在虚拟根目录下创建目录,并授予权限
d8 Y* n" C, p: G6 J& }%{__install} -p -D -m 0755 %{SOURCE1} %{buildroot}/etc/init.d/nginx <==安装启动脚本到init.d目录
* w* c. t; b+ I3 n3 |注意:无论上面定义的SOURCE1是不是大写,这里调用必须为大写7 h0 J2 c* J/ H/ A8 ~ o
说明:%prep %build %install段,除了可以执行<wiz_tmp_highlight_tag>rpm所定义的宏命令(以%开头),还可以换行执行shell命令,比如直接写tar -zxf xxx.tar.gz命令,而不使用%setup -q宏
' c/ j z ^( [" k$ [8 g6 c% l7 @' K; v. X1 n
#/** 脚本段 **/
! ^+ b) b: @# }- m0 a2 k%pre <==<wiz_tmp_highlight_tag>rpm安装前执行的脚本,比如创建用户,设置变量等等操作/ I( k, C5 t; z: Q& x+ [* ]1 v' {
if [ $1 == 1 ];then: O$ A9 b! e7 l9 e
/usr/sbin/groupadd nginx 2>/dev/null
8 G$ v+ U/ d ?- x' e7 J$ E2 p /usr/sbin/useradd -g nginx -s /sbin/nologin -M nginx 2>/dev/null ^. ~9 l9 n: U
fi0 p% `! Y/ }" F4 n
说明:$1等于1就是安装
+ K- n' u! Z% |: `%post <==<wiz_tmp_highlight_tag>rpm安装完成后执行的脚本,比如加载ldconfig函数库,加入开机自动启动等等5 q% f5 w- {" B: a+ E4 t
if [ $1 == 1 ];then
. d9 {; x0 B1 j9 y* U echo "/usr/local/lib" >>/etc/ld.so.conf.d/nginx.conf <==如果安装 lib库到/usr/local/lib中,需要配置该段2 Y3 k8 i. U6 k, f* C5 A- p* K
/sbin/ldconfig 2>/dev/null: A8 W* \0 |) P
chkconfig --add %{name}. ^! j& D9 {' o# r2 d; r
fi) D4 [) w. N! x2 y1 ~5 Y
说明 :$1等于1就是安装" n8 Y5 K( ] Y! D! A- X
%preun <==<wiz_tmp_highlight_tag>rpm 卸载前执行的脚本1 g- H2 g) Z: U
if [ $1 ==0 ];then- n: ~, P3 g5 ]$ e4 C3 [( {
/sbin/service %{name} stop >/dev/null 2>&10 a1 }( f. C- Q. T7 j1 \; x4 l% o
/sbin/chkconfig -del %{name}
) q! |) Y$ c2 Q) |fi
! ^' ^' x C) c: m& i' X$ Z5 v5 w0 N说明: $1等于0就是卸载
% @* t5 L/ B. D2 }! g( u%postun <==<wiz_tmp_highlight_tag>rpm卸载完成后执行的脚本
4 _. R: Z N0 p( h( r# `/ \% L$ N- m |9 X% I% |0 C: R
说明%preun在升级的时候会执行,%postun在升级<wiz_tmp_highlight_tag>rpm包的时候不会执行
7 {# }3 }- k, t* T* Y5 k
4 M# P" ^' V7 ` d( H$ w) q% a \<wiz_tmp_highlight_tag>rpm还提供了一种信号机制:不同的操作会返回不同的信息,并放到默认变量$1中! J% P0 x; v. U
信号 说明
2 _8 S2 \5 ~( b' P- z0 卸载; @+ V$ y' c4 O* H3 [, [
1 安装
' |+ n' J: D/ J( l9 g1 C( P/ \2 h2 升级0 m0 ^' Q6 r1 X, o
* w9 t" j0 F: D- ~1 @
) N& [. F5 P% i# b) N- d#/** 清理段 **/
( ~0 N7 p" N) Y+ O%clean <==清理临时文件,通常为如下
' j, y+ p5 }" d, I( x3 ^rm -rf "%{buildroot}" <==删除虚拟目录) C) _6 [6 E; L, Y
rm -rf %_topdir/BUILD/%{name}-%{version} <==将解压的源码包删除掉
" i: f8 j2 P, F- N: g* G1 P6 h0 E7 F
$ t% k9 I+ s! t$ d7 p, g3 d0 w l& o
#/** 文件段 **/
+ M) ~* A5 |7 ?/ T3 u/ v1 C2 Z2 i%file <==定义哪些文件或目录放入到<wiz_tmp_highlight_tag>rpm中- D8 u' U3 z" t n& U) ?+ a
/usr/sbin/nginx <==指定包含的文件目录) e* b' @, x5 a$ f4 N7 W! h- @
/etc/nginx/ <==指定包含的目录(文件后面有个/表示目录,目录里的所有文件)
0 @/ U3 t e; ~- J2 T# r%dir /var/run/nginx <==指定包含的文件,如果前面是%dir ,那么该nginx是一个空目录$ [) v/ p! [& |/ V( g# V$ C
说明:用于定义软件包所包含的文件,分为三类:说明文档(doc),配置文件(conf),一级执行程序(sbin)
# m. b8 i, C% P& b注意:%files这里会在虚拟根目录下进行,千万不要写绝对路径,应该使用宏或变量表示相对路径& C9 e2 v R+ J, }# L( {+ p; G, o+ E
%doc LICENSE CHANGES README <==要打包的文档文件,如果不知道路径,默认是/usr/share下
, X. X) g/ c6 Y%defattr (-,root,root,0755) <==定义默认权限
% C5 l7 K9 y: F4 Q8 Z5 D, M: C5 M%{_prefix} <==调用上面的定义宏,使用%defattr对/application/nginx目录设置安装文件的属性,第一个“-”表示默认文件权限(文件0644,目录0755),第二个"root"表示属主,第三个“root”表示属组,第四个“0755”设置的权限
& m1 _/ Q4 B- g$ r6 E说明:%defattr和%attr宏作用基本一样,%defattr可以对目录进行递归授权,%attr针对单个文件9 V1 ~7 {: K* _. X2 W
它俩的区别参考资料:http://stackoverflow.com/questions/6952384/what-the-defattr-means-in-<wiz_tmp_highlight_tag>rpm-spec-files2 H! B M5 I# @: r1 n) f# K
- p. z. v- \. e- _+ C%config(noreplace) %{_prefix}/conf/nginx.conf <==nginx.conf配置文件放置到/application/nginx/conf目录下,config的文件为配置文件,noreplace表示升级<wiz_tmp_highlight_tag>rpm包的时候不替换该文件- G* f: \# x/ U
%config(noreplace) %{_prefix}/conf/fastcgi.conf <==fastcgi.conf 配置文件放置到/application/nginx/conf 目录下
+ ]& _8 S, y4 z5 x8 B%config(noreplace) %{_prefix}/conf/fastcgi_params
) u( g; O5 S' @8 v%attr(0755,root,root) /etc.init.d/nginx <==对单个文件授权,权限为"-"表示保留原有属性3 I# f9 _" g# g# Y7 B: O
注意:如果%exclude指定的文件不存在,也会报错
9 {" `- [5 u0 g- M #/** 改变日志段 **/
. F: X% ~, @" h- Q% R x- X$ u7 s%changelog <==把<wiz_tmp_highlight_tag>rpm包软件的每次修改记录到这里,保存到发布的<wiz_tmp_highlight_tag>rpm包中一般减号开始,以便查询
# k: {) h! f9 B5 x* Wed Apr 11 2012 coral <919953500> -1.2.4-1 <==以*开头,什么时间改的,什么人改的
' G; z; r* M" u3 n( U+ k- Initial version <==以-开头,干了什么事(初始版本)+ L8 l( e% {2 n6 \, {' Y, b
注意:此地方用中文会报错
0 M2 K! Q6 V$ y8 x0 q! {( R& V特别注意:%install 宏使用的是绝对路径,而%file部分使用相对路径9 B" i/ @# C" \. V0 j
----------------------------------分割线---------------------------------------------------------------------------------& I" w9 w7 f& P* S5 D' r# P
. r- x0 w- M3 V% P6 g _总结与启发: 各位看到php的spec根本就没有经过解压与编译,而是直接将tar.gz复制到系统中,执行安装完成后命令。 执行结束后为什么执行一次echo呢?因为这样才能让if的$?返回0,如果最后一条不是成功执行的命令,rpm就会安装报错。 rpm机制是在系统子bsah下执行,不是当前bash,设置系统环境变量的重新登录才生效。 %file段至关重要,因为这里记录了你要装盘的文件。
6 e* H; G) Z o 通过rpm的学习,觉得它可以做很多事,可以让小弟不在为安装文档抓头,而且可以配合yum机制定制自己的软件仓库,实现快速部署。甚至可以用rpm做代码包版本控制,当足够了解自己公司的业务也可以将程序打在一套软件组内,这样是不是更像docker呢? # } w- m) `4 m2 D8 i4 k8 [' G
) n: M" \8 i+ W; d
|