- 论坛徽章:
- 0
|
当应用软件构建的服务开始庞大时,头疼的事接踵而至:如何管理应用软件本身的良莠不齐?如何保证已开发完毕的产品不会丢失?如何进行各类应用的部署和拆分?如何平顺的对公用组件更新和升级?如何管理因网络、操作系统、等环境因素不尽相同导致的如同蛛网般的复杂配置、如何在日常运作中对应用服务达到快速建立、恢复、回滚?如何对系统运作进行日志跟踪?在工作成员频繁变动、业务频繁拆分的情况下上述工作的难度会乘方级的增加,依赖和嵌套问题会让构建和维护人员不知所措,对维护人员的要求会不断提升,在运作成本本应最低的维护一环结果投入了不合情理的力量,当问题严重时更会拖累新业务和应用的开展和影响已有的服务质量和应用成果。
我们接触的最多的包管理器恐怕就是RPM软件包管理器了,大部分企业、公司、小团体都使用了RedHat Linux操作系统发行版,各大软硬件厂商的系统程序、驱动程序、软件系统、数据库软件几乎都会有RPM的软件包发行,数量庞大几乎占据了90%以上的能下载到的Linux软件,以至于其他Linux发行版不得不支持安装RPM软件的安装。对于需要大规模管理应用软件部署的情景来说,用一个软件包管理器统一管理操作系统上文件管理是理想且必须的。
在淘宝内部,大范围使用了RPM软件包作为软件的封装载体,下面我就对RPM的基本封装做一个简单的介绍:
1 前言
2 初次接触——预备知识、语汇、建立打包思路
3 分清层次——RPM软件包的组成与种类
3.1 建立RPM包的思维路线
3.2 BINARY RPMS – 已编译好的二进制程序包
3.3 SOURCE RPMS – 源码包RPM,含编译程序
4 准备入手——了解RPM打包环境与命令
4.1 操作系统环境与架构
4.2 RPM包打包环境目录结构
4.3 建立自己的打包工作目录与环境
4.4 rpm macros – 定义了rpm的环境变量
4.5 Shell变量 – 与系统变量的融合
4.6 macros配置文件
4.7 rpmbuild常用命令与说明
4.8 校验最后成果
4.9 留存源码信息
5 轻松上路——如何编写SPEC文件
5.1 编写二进制包的SPEC
5.2 编写源码包的SPEC
5.3 Scriptlet说明
5.4 升级时Scriptlet顺序
6 源于需求——常见问题与处理
6.1 版本号比较规则
6.2 生成架构无关包
6.3 crontab怎么处理
6.4 可使用Prefix的RPM (relocatable binary packages )
6.5 强制跳脱依赖
6.6 保留原有配置文件
6.7 参考资料,推荐阅读
前言
本文源自一次RPM宣讲,整理了一下RPM包封装的要点和思路,希望对正在进行或需要用RPM打包的同事有所帮助,欢迎转载
---技术保障 不平 2010-04-12
初次接触——预备知识、语汇、建立打包思路
RPM --- Redhat Package Manager
OS Architecture --- I386, x86_64, noarch, …
SPEC --- specified file
用户使用命令 --- rpm / yum
作者打包命令 --- rpmbuild
源码Source
二进制Binary
分清层次——RPM软件包的组成与种类
建立RPM包的思维路线
建什么样的包
准备周边软件
是否需要补丁
可重塑的软件
升级的准备
依赖关系
建立RPM
测试RPM
保留源代码信息
BINARY RPMS – 已编译好的二进制程序包
SOURCE RPMS – 源码包RPM,含编译程序
准备入手——了解RPM打包环境与命令
操作系统环境与架构
[luyan@opstest ~]$ $cat /etc/issue
Red Hat Enterprise Linux Server release 5.4 (Tikanga)
Kernel \r on an \m
[luyan@opstest ~]$ uname -av
Linux opstest.corp.alimama.com 2.6.18-164.el5xen #1 SMP Tue Aug 18 15:59:52 EDT 2009 x86_64 x86_64 x86_64 GNU/Linux
RPM包打包环境目录结构
[luyan@opstest ~]$ tree /usr/src/redhat/
/usr/src/redhat/
|-- BUILD
|-- RPMS
| |-- i386
| |-- noarch
| `-- x86_64
|-- SOURCES
|-- SPECS
`-- SRPMS
建立自己的打包工作目录与环境
mkdir -p ~/rpmbuild/{BUILD,RPMS,SOURCES,SPECS,SRPMS}
mkdir -p ~/rpmbuild/RPMS/{noarch,i386,x86_64}
echo "%_topdir %(echo \$HOME)/rpmbuild" > ~/.rpmmacros
rpm macros – 定义了rpm的环境变量
http://docs.fedoraproject.org/drafts/rpm-guide-en/ch09s07.html
Shell变量 – 与系统变量的融合
macros配置文件
配置文件 定义 说明
/usr/lib/rpm/macros Official RPM macros 不要修改
/etc/rpm/macros Per-system customizations 尽量避免使用
$HOME/.rpmmacros Per-user customizations 建议定义
$rpm –showrc 显示最终的rc配置、macro定义和Shell变量
rpmbuild常用命令与说明
命令参数 用途
-ba 建立源码包和二进制包
-bb 建立二进制包
-bl 检测语法spec
校验最后成果
rpm -qlp your_binary_package.rpm
留存源码信息
建议在Description或URL中注明源代码地址,以便后续维护和修订
也可利用SRPM的形式封装源代码和Patch
轻松上路——如何编写SPEC文件
编写二进制包的SPEC
spec编写
Name: binary-test
Version: 0.0.1
Release: 1
Summary: RPM BINARY PACKAGE TEST
Vendor:Taobao
URL: http://twiki.corp.taobao.com/bin/view/SRE/OPS/RPM
Group: OPS
Packager: luyan
License: GPL
%description
This is a Template SPEC file to build binary RPM package
%prep
%pre
%post
chmod 777 %_appdir/binary-test/empty-dir
%preun
%postun
%files
# Main program dir bin
%_appdir/binary-test/bin
# Define An config file, when update the package, the old setting will keep last configuration
%config(noreplace) %_appdir/binary-test/conf/main.conf
# Define Ownership and mod to below files
%defattr(-,root,wheel,0755)
%dir %_appdir/binary-test/empty-dir
%attr(0755,ads,ads) %dir %_appdir/binary-test
%doc %_appdir/binary-test/README
%changelog
* Mon Apr 12 2010 BuPing <buping@taobao.com> 0.0.1-1
- wrote a binary-test template
用rpmbuild命令打包
$rpmbuild -bb binary_template.spec
[luyan@opstest ~]$ rpmbuild -bb binary_template.spec --target=noarch
Building target platforms: noarch
Building for target noarch
Executing(%prep): /bin/sh -e /var/tmp/rpm-tmp.20466
+ umask 022
+ cd /home/luyan/rpmbuild/BUILD
+ LANG=C
+ export LANG
+ unset DISPLAY
+ exit 0
Processing files: binary-test-0.0.1-1
Provides: config(binary-test) = 0.0.1-1
Requires(interp): /bin/sh /bin/sh /bin/sh /bin/sh
Requires(rpmlib): rpmlib(CompressedFileNames) <= 3.0.4-1 rpmlib(PayloadFilesHavePrefix) <= 4.0-1
Requires(pre): /bin/sh
Requires(post): /bin/sh
Requires(preun): /bin/sh
Requires(postun): /bin/sh
Requires: /bin/bash config(binary-test) = 0.0.1-1
Checking for unpackaged file(s): /usr/lib/rpm/check-files %{buildroot}
Wrote: /home/luyan/rpmbuild/RPMS/noarch/binary-test-0.0.1-1.noarch.rpm
编写源码包的SPEC
%{!?python_sitelib: %define python_sitelib %(%{__python} -c "from distutils.sysconfig import get_python_lib; print get_python_lib()"
)}
Summary: Parallel SSH tools
Name: pssh
Version: 1.4.3
Release: 1%{?dist}
License: BSD
Url: http://www.theether.org/pssh/
Group: Applications/Productivity
Source0: http://www.theether.org/pssh/pssh-%{version}.tar.gz
Requires: openssh-clients
BuildArch: noarch
BuildRoot: %{_tmppath}/%{name}-%{version}-%{release}-root-%(%{__id_u} -n)
BuildRequires: python-setuptools
%description
This package provides various parallel tools based on ssh and scp.
Parallell version includes:
o ssh : pssh
o scp : pscp
o nuke : pnuke
o rsync : prsync
o slurp : pslurp
%prep
%setup -q
%build
%{__python} setup.py build
%install
%{__rm} -rf %{buildroot}
%{__python} setup.py install -O1 --skip-build --root %{buildroot}
%clean
%{__rm} -rf %{buildroot}
%files
%defattr(-, root, root, -)
%doc AUTHORS BUGS ChangeLog COPYING TODO
%{_bindir}/pnuke
%{_bindir}/prsync
%{_bindir}/pscp
%{_bindir}/pslurp
%{_bindir}/pssh
%{python_sitelib}/%{name}-%{version}*
%{python_sitelib}/%{name}lib
%changelog
* Mon Jan 5 2009 Terje Rosten <terje.rosten@ntnu.no> - 1.4.3-1
- 1.4.3
* Sat Nov 29 2008 Ignacio Vazquez-Abrams <ivazqueznet+rpm@gmail.com> - 1.4.0-2
- Rebuild for Python 2.6
* Mon Aug 25 2008 Terje Rosten <terje.rosten@ntnu.no> - 1.4.0-1
- initial build
Scriptlet说明
标记 说明
%prep 在建包之前运行 适宜放置整理文件的脚本
%build 在配置编译时运行 放置./configure和make
%install 在编译完成后运行 放置make install
%pre 在安装包之前运行
%post 在安装包之后运行
%preun 在卸载包之前运行
%postun 在卸载包之后运行
升级时Scriptlet顺序
运行新包的 %pre
安装新文件
运行新包的 %post
运行旧包的 %preun
删除新文件未覆盖的所有旧文件
运行旧包的 %postun
源于需求——常见问题与处理
版本号比较规则
先比较 Epoch 再比较 Version 最后比较 Release
数字比字符串新
从nihui的blog摘取的一个比较的例子
1.00010 > 1.9,因为 10 > 9
2.02 = 2.2,因为 02 = 2
3.4.0 > 3.4,因为 3.4.0 多出一个列表分段
5mgc25 = 5.mgc.25,因为分隔后的列表两者相等
6.0 > 6beta,因为数字比字符串新
生成架构无关包
spec中注明 BuildArchitectures: noarch
rpmbuild时 --target=norarch
crontab怎么处理
将要执行的计划任务按照以下格式创建一个文件:
[gaosy@nlp1 cron.d]$ cat sysstat
# run system activity accounting tool every 10 minutes
*/10 * * * * root /usr/lib64/sa/sa1 1 1
#minute hour day month week user command
# generate a daily summary of process accounting at 23:53
53 23 * * * root /usr/lib64/sa/sa2 -A
将这个文件安装入/etc/cron.d/下
可使用Prefix的RPM (relocatable binary packages )
…
Prefix:/home/admin
%files
%{_prefix}/local/bin/hwconfig
…
不推荐,理由:底层库包很多都不能relocatable,yum不支持relocatable
强制跳脱依赖
AutoReqProv: no
保留原有配置文件
%config(noreplace)
参考资料,推荐阅读
需精读 http://docs.fedoraproject.org/en ... -creating-rpms.html
Redhat SRPMS库 学习构建S源码RPM的好地方 ftp://ftp.redhat.com/pub/redhat/ ... Server/en/os/SRPMS/
Les RPM de Remi 的源SEPC文件 http://rpms.famillecollet.com/SPEC/ |
|