本文根据马哥教育视频http://mageedu.blog.51cto.com/4265610/919986 总结而来,若是想仔细学习请看该视频。php
一.RPM制做步骤html
咱们在企业中有的软件基本都是编译的,咱们每次安装都得编译,那怎么办呢?那就根据咱们的需求制做RPM安装包吧。先来讲说基本布骤:nginx
1.Planning what you want 计划作什么rpm包。软件的?库的?bash
2.Gathering the software to package 收集原材料,即收集源码包less
3.Patch the software as need 若是须要打补丁,收集补丁文件。此布骤不是必须ide
4.Outling any dependenies 肯定依赖关系包post
------------------ 上述动做可由咱们手动编译一次软件来肯定 -------------------学习
5.Building RPMs 开始动手制做RPM包测试
5.1 Set up the directory stucture 设定好目录结构,咱们在这些目录中制做咱们的RPM包,咱们须要下列目录ui
BUILD 源代码解压后的存放目录
RPMS 制做完成后的RPM包存放目录,里面有与平台相关的子目录
SOURCES 收集的源材料,补丁的存放位置
SPECS SPEC文件存放目录
SRMPS 存放SRMPS生成的目录
5.2 Place the Sources in the right directory 把源材料放到正确的位置
5.3 Create a spec file that tell rpmbuild command what to do 建立spec文件,这是纲领文件,rpmbuild命令根据spec文件来制做合适的rpm包
5.4 Build the source and binary RPMS 制做src或二进制rpm包
6.Test RPMS 测试制做的PRM包
7.Add signature for RPM 为RPM包签名
二.RPM包制做实例
我仍是用连贯的话为你们叙述一遍吧,咱们首先确实咱们要为何作rpm包,一般咱们是为一些软件,好比httpd,nginx等,而后去收集这些软件包的源代码,若是有须要的话也收集这些补丁文件,手动编译安装一下这个软件(固然若是是不须要编译的就不用演练了),肯定依赖的软件包,并记录下来,下面开始准备制做tengine的PRM包吧:
1.创建一个普通用户,有普通用户来制做rpm,用root的可能会由于代码问题致使毁灭的后果
- useradd ibuler
- su - ibuler
2.肯定咱们在哪一个目录下制做RPM,一般这个目录咱们topdir,这个须要在宏配置文件中指定,这个配置文件称为macrofiles,它们一般为 /usr/lib/rpm/macros:/usr/lib/rpm/macros.*:~/.rpmmacros,这个在rhel 5.8中能够经过rpmbuild --showrc | grep macrofiles 查看,6.3的我使用这个找不到,但使用是同样的。你能够经过rpmbuild --showrc | grep topdir 查看你系统默认的工做车间
- rpmbuild --showrc | grep topdir
- -14: _builddir %{_topdir}/BUILD
- -14: _buildrootdir %{_topdir}/BUILDROOT
- -14: _rpmdir %{_topdir}/RPMS
- -14: _sourcedir %{_topdir}/SOURCES
- -14: _specdir %{_topdir}/SPECS
- -14: _srcrpmdir %{_topdir}/SRPMS
- -14: _topdir %{getenv:HOME}/rpmbuild
咱们仍是自定义工做目录(或车间)吧
- vi ~/.rpmmacros
- %_topdir /home/ibuler/rpmbuild ##目录能够自定义
- mkdir ~/rpmbuild
3.在topdir下创建须要的目录
- cd ~/rpmbuild
- mkdir -pv {BUILD,BUILDROOT,RPMS,SOURCES,SPECS,SRPMS}
4.把收集的源码放到SOURCES下
- cp /tmp/tengine-1.4.2.tar.gz SOURCES ##事先放好的
5.在SPECS下创建重要的spec文件
- cd SPECS
- vi tengine.spec ##内容见后讲解,rhel6.3会自动生成模板
6.用rpmbuild命令制做rpm包,rpmbuild命令会根据spec文件来生成rpm包
- rpmbuild
- -ba 既生成src.rpm又生成二进制rpm
- -bs 只生成src的rpm
- -bb 只生二进制的rpm
- -bp 执行到pre
- -bc 执行到 build段
- -bi 执行install段
- -bl 检测有文件没包含
咱们能够一步步试,先rpmbuild -bp ,再-bc 再-bi 若是没问题,rpmbuild -ba 生成src包与二进制包吧
7.安装测试有没有问题,可否正常安装运行,可否正常升级,卸载有没有问题
root用户测试安装:
- cd /tmp
- cp /home/ibuler/rpmbuild/RPMS/x86_64/tengine-1.4.2-1.el6.x86_64.rpm /tmp
- rpm -ivh tengine-1.4.2-1.el6.x86_64.rpm ##测试安装
- rpm -e tengine ##测试卸载,若是版本号比原来的高,升级测试
8.若是没问题为rpm包签名吧,防止有人恶意更改 ##这个先不写了,有点晚了,之后补上
到此整个流程完毕。下面来讲说其中最最重要的spec的格式,先说最简单的,最容易实现的
- vi tengine.spec
- ### 0.define section #自定义宏段,这个不是必须的
- ### %define nginx_user nginx #这是咱们自定义了一个宏,名字为nginx_user值为nginx,%{nginx_user}引用
- ### 1.The introduction section #介绍区域段
- Name: tengine #名字为tar包的名字
- Version: 1.4.2 #版本号,必定要与tar包的一致哦
- Release: 1%{?dist} #释出号,也就是第几回制做rpm
- Summary: tengine from TaoBao #软件包简介,最好不要超过50字符
- Group: System Environment/Daemons #组名,能够经过less /usr/share/doc/rpm-4.8.0/GROUPS 选择合适组
- License: GPLv2 #许可,GPL仍是BSD等
- URL: http://laoguang.blog.51cto.com #能够写一个网址
- Packager: Laoguang <ibuler@qq.com>
- Vendor: TaoBao.com
- Source0: %{name}-%{version}.tar.gz
- #定义用到的source,也就是你收集的,能够用宏来表示,也能够直接写名字,上面定义的内容均可以像上面那样引用
- #patch0: a.patch #若是须要补丁,依次写
- BuildRoot: %_topdir/BUILDROOT
- #这个是软件make install 的测试安装目录,也就是测试中的根,咱们不用默认的,咱们自定义,
- #咱们能够来观察生成了哪此文件,方便写file区域
- BuildRequires: gcc,make #制做过程当中用到的软件包
- Requires: pcre,pcre-devel,openssl,chkconfig #软件运行须要的软件包,也能够指定最低版本如 bash >= 1.1.1
- %description #软件包描述,尽情的写吧
- It is a Nginx from Taobao. #描述内容
- ### 2.The Prep section 准备阶段,主要目的解压source并cd进去
- %prep #这个宏开始
- %setup -q #这个宏的做用静默模式解压并cd
- #%patch0 -p1 #若是须要在这打补丁,依次写
- ### 3.The Build Section 编译制做阶段,主要目的就是编译
- %build
- ./configure \ #./configure 也能够用%configure来替换
- --prefix=/usr \ #下面的我想你们都很熟悉
- --sbin-path=/usr/sbin/nginx \
- --conf-path=/etc/nginx/nginx.conf \
- --error-log-path=/var/log/nginx/error.log \
- --http-log-path=/var/log/nginx/access.log \
- --pid-path=/var/run/nginx/nginx.pid \
- --lock-path=/var/lock/nginx.lock \
- --user=nginx \
- --group=nginx \
- --with-http_ssl_module \
- --with-http_flv_module \
- --with-http_stub_status_module \
- --with-http_gzip_static_module \
- --http-client-body-temp-path=/var/tmp/nginx/client/ \
- --http-proxy-temp-path=/var/tmp/nginx/proxy/ \
- --http-fastcgi-temp-path=/var/tmp/nginx/fcgi/ \
- --http-uwsgi-temp-path=/var/tmp/nginx/uwsgi \
- --http-scgi-temp-path=/var/tmp/nginx/scgi \
- --with-pcre
- make %{?_smp_mflags} #make后面的意思是:若是就多处理器的话make时并行编译
- ### 4.Install section 安装阶段
- %install
- rm -rf %{buildroot} #先删除原来的安装的,若是你不是第一次安装的话
- make install DESTDIR=%{buildroot}
- #DESTDIR指定安装的目录,而不是真实的安装目录,%{buildroot}你应该知道是指的什么了
- ### 4.1 scripts section #不必能够不写
- %pre #rpm安装前制行的脚本
- if [ $1 == 1 ];then #$1==1 表明的是第一次安装,2表明是升级,0表明是卸载
- /usr/sbin/useradd -r nginx 2> /dev/null ##其实这个脚本写的不完整
- fi
- %post #安装后执行的脚本
- %preun #卸载前执行的脚本
- if [ $1 == 0 ];then
- /usr/sbin/userdel -r nginx 2> /dev/null
- fi
- %postun #卸载后执行的脚本
- ### 5.clean section 清理段,删除buildroot
- %clean
- rm -rf %{buildroot}
- ### 6.file section 要包含的文件
- %files
- %defattr (-,root,root,0755) #设定默认权限,若是下面没有指定权限,则继承默认
- /etc/ #下面的内容要根据你在%{rootbuild}下生成的来写
- /usr/
- /var/
- ### 7.chagelog section 改变日志段
- %changelog
- * Fri Dec 29 2012 laoguang <ibuler@qq.com> - 1.0.14-1
- - Initial version
到此一个简单的tengine RPM包制做好了。
三.RPM包制做拓展
下面咱们来拓展一下,好比:咱们想为tengine增长控制脚本,能够经过start|stop控制,咱们还想更换一下默认的首页index.html,默认的fastcgi_params是不能直接链接php的,因此咱们替换为新的配置文件,咱们也能够用设置好的nginx.conf替换原来的nginx.conf。基于上述步骤下面继续
1.把修改后的首页文件index.html,控制脚本init.nginx,fastCGI配置文件fastcgi_params,Nginx配置文件nginx.conf 放到SOURCES中 。
- [ibuler@ng1 rpmbuild]$ ls SOURCES/
- fastcgi_params index.html init.nginx nginx.conf tengine-1.4.2.tar.gz
2 编辑tengine.spec,修改
2.1 介绍区域的SOURCE0下增长以下
- Source0: %{name}-%{version}.tar.gz
- Source1: index.html
- Source2: init.nginx
- Source3: fastcgi_params
- Source4: nginx.conf
2.2 安装区域增长以下
- make install DESTDIR=%{buildroot}
- %{__install} -p -D %{SOURCE1} %{buildroot}/usr/html/index.html #%{__install}这个宏表明install命令
- %{__install} -p -D -m 0755 %{SOURCE2} %{buildroot}/etc/rc.d/init.d/nginx
- %{__install} -p -D %{SOURCE3} %{buildroot}/etc/nginx/fastcgi_params
- %{__install} -p -D %{SOURCE4} %{buildroot}/etc/nginx/nginx.conf
2.3 脚本区域增长以下
- %post
- if [ $1 == 1 ];then
- /sbin/chkconfig --add nginx
- fi
2.4 %file区域增长以下
- %files
- %defattr (-,root,root,0755)
- /etc/
- /usr/
- /var/
- %config(noreplace) /etc/nginx/nginx.conf #%config代表这是个配置文件noplace代表不能替换
- %config(noreplace) /etc/nginx/fastcgi_params
- %doc /usr/html/index.html #%doc代表这个是文档
- %attr(0755,root,root) /etc/rc.d/init.d/nginx #%attr后面的是权限,属主,属组
3. 生成rpm文件测试
- rpmbuild -ba tengine.spec
4. 安装测试
到此RPM包制做完毕,你能够根据你的需求制做RPM包吧。
四.RPM包签名
1.生成GPG签名密钥,我用的是root用户
- gpg --gen-key
- Your selection?1<Enter> ##默认便可
- What keysize do you want? (2048) 1024<Enter> ##密钥长度
- Key is valid for? (0) 1y<Enter> ##有效期
- Is this correct? (y/N) y<Enter> ##确认
- Real name: LaoGuang<Enter> ##密钥名称
- Email address: ibuler@qq.com<Enter> ##邮件
- Comment: GPG-RPM-KEY<Enter> ##备注
- Change (N)ame, (C)omment, (E)mail or (O)kay/(Q)uit? O<ENTER>
- Enter passphrase OK <Enter> ##使用空密码,也能够输入
- <Take this one anyway> <Enter>
- <Take this one anyway> <Enter>
有时可能由于随机数不够致使卡在那里,这时候你就yum 安装几个包组,立刻就够了。
2.查当作生的密钥
- [root@ng1 dev]# gpg --list-keys
- /root/.gnupg/pubring.gpg
- ------------------------
- pub 1024R/49C99488 2012-11-28 [expires: 2013-11-28]
- uid LaoGuang (GPG-RPM-KEY) <ibuler@qq.com>
- sub 1024R/69BA199D 2012-11-28 [expires: 2013-11-28]
3.导出公钥以供你们使用验证
- gpg --export -a "LaoGuang" > RPM-GPG-KEY-LaoGuang
4.编缉 .rpmmacros说明咱们用哪个密钥加密,咱们用root加密的那就在/root下编辑
- vi ~/.rpmmacros
- %_gpg_name LaoGuang
5.为rpm包加签名
- rpm --addsign tengine-1.4.2-1.el6.x86_64.rpm
- Enter pass phrase: ##输入密钥
- Pass phrase is good.
- tengine-1.4.2-1.el6.x86_64.rpm:
到此签名添加成功,下面来验证
6.讲刚才导出的公钥导入rpm中
- rpm --import RPM-GPG-KEY-LaoGuang
7.验证
- rpm --checksig tengine-1.4.2-1.el6.x86_64.rpm
- tengine-1.4.2-1.el6.x86_64.rpm: rsa sha1 (md5) pgp md5 OK
到此整个过程完毕,你也试试吧
PS:觉的写的不错就赞一下吧,写篇文档不容易啊。