linux下源码包制作成rpm包教程
[导读]
在puppet cookbook系列文档中,sky就不至一次的提到过使用puppet 来管理软件包,而大多数
同学都会问,那我下载的.tar.gz的压缩包怎么办呢?那如何使用puppet来管理呢?关于源码包的
安装,之前有篇文章已经介绍了从源码包构建包,sky还是会建议大家把源码包制作成rpm包,
放进yum仓库,再使用puppet来管理,这样会方便许多,做运维的,你懂的.
[正文]
1.要使用rpmbuild 这个命令,那么要安装rpm-build, centos下可以使用yum -y intall rpm-build 来完成安装.
2.rpmbuild 包和 /usr/src/redhat目录 ,这些 rpm build 的程序是要靠 spec 文件的控制.它是配置指定安装到另外的机器上的,
用来指示转换的源码补丁编译成二进制文件的包.默认编译操作是在下面的目录中,它是编译源码的相关动作操作的位置.
如果不指定其它的地方,那么 rpm building 的地方是主要在 /usr/src/redhat 的目录,目录的架构如下,这就是为 rpm-build 提供的目录结构.
1
2
3
4
5
6
7
8
9
10
11
12 |
/usr/src/redhat/ |-- BUILD |-- RPMS | |-- i386 | `-- ... |-- SOURCES | |-- foo-1.2. tar .gz | |-- foo-1.2-add_feature.patch | `-- foo-1.2-change_default.patch |-- SPECS | `-- foo.spec `-- SRPMS |
%define name foo # 名字 %define version 16 #version Name: %{name} #name 就是使用的上面的宏指令 Version: %{version} #version 也是使用的上面的宏指令 Release: 1 License: GPL Group: Applications/Productivity # 软件是哪个组的,更多信息查看 /usr/share/doc/rpm-version/GROUPS URL: http://www.mysqlops.com Source: ftp://www.mysqlops.com/pub/xxx.tar.gz Patch0: foo-1.2-change_default.patch Patch1: foo-1.2-add_feature.patch PreReq: unzip # 安装前需要什么 Requires: pam # 安装后需要什么 BuildPreReq: gcc >= 2.96 #打包前需要什么 BuildRoot: %{_tmppath}/%{name}-root # 准备源码文件的 chroot 的目录 Summary: A fictional open source package for the offering. #摘要 %description #描述
注意,spec 文件很多信息都是取自宏指令,如果没有明确指定,就会继承 /usr/lib/rpm/macros 和其它相关宏指令的文件.
Spec 文件之 %prep
%prep 这部分其它是由一些参数来组成一个 shell 脚本来从 SOURCES 中解压源码和应用补丁到 BUILD 目录中来准备下面的编译.
和 %prep 相关的宏指令
%setup
%patch
例:
%prep
%setup -q #提取源码到 BUILD 目录; -q 指不显示输出(quietly)
%patch0 -p1 # 应用 patch0
%patch1 -p1 -b .orig # 应用 Patch1 但是存下源文件成 .oring 的后缀
unzip foo_data.zip # 接下来解压 zip 文件
Spec 文件之 %build
%build 是编译和准备软件,运行象一个 shell 脚本,它运行在上下文目录指定的源码目录.在编译过程中,调用脚本 .config 在本地的目录(%configure 中配置的).
和 %build 相关的宏
%configure # 可以通过运行 rpm -eval %configure 来看它的设置
例:
%build
%configure -enable-shared
CFLAGS=-O2 make
Spec 文件之 %install
%install 是用来做 rpm 安装所有需要的文件.这些打包的文件会复制到前面的讲的 BuildRoot 中的目录树中.通常这个目录是使用的 /var/tmp 中.
$RPM_BUILD_ROOT 参数来设置 BuildRoot.主要不能使用真实目录来设置的主要原因是,在编译的过程中有可能会有文件替换到你系统中的文件引起系统
和软件问题.对其它的文件路径象在 %{_mandir}, %{_bindir} , %{_sysconfdir} 等等,都是使用预先定义的宏来指定的.
默认都是跑在这个 RPM_BUILD_ROOT 目录下的.
例:
1
2
3
4 |
% install rm -rf $RPM_BUILD_ROOT # 默认的$RPM_BUILD_ROOT 是 /var/tmp/%{name}-root make DESTDIR=$RPM_BUILD_ROOT install # 指定安装文件的路径 install -m644 foo.8 ${RPM_BUILD_ROOT}/%{_mandir} /man8/foo .8 |
Spec 文件之 %clean
%clean 是用来清理 build 后的临时文件,主要是怕这些旧的文件影响以后编译.主要是要删除 $RPM_BUILD_ROOT 和运行 make clean .
例:
%clean rm -rf $RPM_BUILD_ROOT make clean
Spec 文件之 Scriptlets
这些选项可以让你动态的使用 shell 脚本来控制安装和删除,
%pre,%post 是用脚本运行在包安装后,注意没法交互
%preun,%postun 用脚本运行在包删除时
rpm -q -scripts packagename # 可以看到脚本的信息
例如:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21 |
%pre groupadd -g 201 foo useradd -g foo -s /bin/false -d /var/foo -M foo %post /sbin/ldconfig chkconfig --add food %preun if [ = 0 ] then service food stop > /dev/null 2>&1 chkconfig --del food fi %postun if [ = 0 ] then userdel foo groupdel foo else /sbin/ldconfig service food condrestart > /dev/null 2>&1 fi |
注意,在这个当中的数字,如果是 1 是指是第一次安装,如果是 2 是指也许是升级.如果是 0 在 %postun , 是指被完全的删除.
Spec 文件之 %files
%files 任何打包的文件,都需要在这个包的详细的文件列表中,如果是目录,包的所有者的全部目录都在中间,%dir 来指定空目录,可以用
%files -f /tmp/dyanmic_filelist 来指定一个文件列表.默认 %config 会替换掉配置,给原来的配置修改名字为 .rpmorig,
如果不想修改的话,就用%config(noreplace) 就会给新的配置文件名字命名为 .rpmnew.
%defattr(mode,user,group)
%attr(mode,user,group) filename
%config 配置文件
%doc 文档
例:
1
2
3
4
5
6
7
8
9 |
%files %defattr(-,root,root) %config /etc/foo .conf # 指定了才能在更新和删除时有用 /usr/sbin/food /usr/bin/foo %doc README # 目录是在 /usr/share/doc/%{name}-%{version} %doc /usr/share/man/man8/food .8 /usr/share/foo/ % dir /var/lock/foo/ # 空的目录 |
Spec 文件之 %changelog;
%changelog 是记录包的修改,比如加入一个新的补丁,修改配置,日志使用 data +”%a %b %d %Y”,
需要显示包的日志改变的信息可以使用 rpm-q -changelog.例:
%changelog
• Mon Aug 5 2002 Elvis Presley
[总结]
知道了怎么把rpm包相信大家就会知道,然后做yum 源了,做好了yum源,只需要客户端配置好使用安装源,这样是不是很方便,
如果自定义yum 源不会的,sky 改天写下吧,大概做法:centos下比较简单,安装下createrepo软件,然后再做个http服务,
就可以了.本篇文章大部分网上大多数都有的,大家可以实际测试下,如不清楚再问下吧.
推荐阅读:SPEC文件深度说明:
建议继续学习:
- 如何解压rpm文件 (阅读:4022)
- rpm删除出现”error: %preun( ) scriptlet failed, exit status 1解决方法 (阅读:3771)
- [Linux]编译一个 RHEL 定制的内核 rpm 包 (阅读:2836)
- Redhat 使用Yum安装、更新rpm包 (阅读:2575)
- 给 perl 的模块打包成rpm (阅读:2472)
- RPM包的管理 (阅读:2424)
- 快速创建pear/pecl的rpm (阅读:2134)
- RPM 与 DEB 的兼容 (阅读:1967)
- rpm Build 相关知识 (阅读:1868)
- [坑]打rpm包时,注意%post和%postun的执行顺序 (阅读:915)
扫一扫订阅我的微信号:IT技术博客大学习
- 作者:sky 来源: MySQLOPS 数据库与运维自动化技术分享
- 标签: rpm
- 发布时间:2012-02-26 23:17:41
- [71] Twitter/微博客的学习摘要
- [65] IOS安全–浅谈关于IOS加固的几种方法
- [65] find命令的一点注意事项
- [63] android 开发入门
- [62] Go Reflect 性能
- [62] 如何拿下简短的域名
- [61] Oracle MTS模式下 进程地址与会话信
- [60] 流程管理与用户研究
- [57] 【社会化设计】自我(self)部分――欢迎区
- [57] 图书馆的世界纪录