linux制做RPM包
Posted FuZZ
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了linux制做RPM包相关的知识,希望对你有一定的参考价值。
制作rpm包
1.制作流程
1.1 前期工作
1)创建打包用的目录rpmbuild/{BUILD,SPECS,RPMS, SOURCES,SRPMS}
建议使用普通用户,在用户家目录中创建
2)确定好制作的对象,是源码包编译打包还只是一些库文件打包
3)编写SPEC文件
4)开始制作
1.2 RPM制作过程
1)读取并解析 filename.spec 文件
2)运行 %prep 部分来将源代码解包到一个临时目录,并应用所有的补丁程序。
3)运行 %build 部分来编译代码。
4)运行 %install 部分将代码安装到构建机器的目录中。
5)读取 %files 部分的文件列表,收集文件并创建二进制和源 RPM 文件。
6)运行 %clean 部分来除去临时构建目录。
补充说明:
BUILD目录:制作车间,二进制tar.gz包的解压后存放的位置,并在此目录进行编译安装
SPECS目录:存放SPEC文件
RPMS目录:存放制作好的rpm包
SOURCES目录:存放源代码
SRPMS目录:存放编译好的二进制rpm包
BUILDROOT目录:此目录是在BUILD目录中执行完make install之后生成的目录,里面存放的是编译安装好的文件,他是./configure中—prefix指定path的根目录
1.3制作工具:rpmbuild
制作过程的几个状态
rpmbuild -bp 执行到%prep
rpmbuild -bc 执行到%build中的config
rpmbuild -bi 执行至%build中的install
rpmbuild -ba 编译后做成rpm包和src.rpm包
rpmbuild -bs 仅制作src.rpm包
rpmbuild -bb 仅制作rpm包
2.SPEC文件
2.1 spec文件参数:
自定义软件包基本参数:
Name 软件包名字
Version 软件包版本
Release 软件包修订号
Summary 软件包简单描述
Group 软件包所属组。必须是系统定义好的组
License 软件授权方式,通常就是GPL
Vendor 软件包发型厂商
Packager 软件包打包者
URL 软件包的url
Source 定义打包所需的源码包,可以定义多个,后面使用%{SOURCE}调用
Patch 定义补丁文件,后面可以使用%{Patch}调用
BuildRoot 定义打包时的工作目录
BuildRequires 定义打包时依赖的软件包
Requires 定义安装时的依赖包,形式为Package name 或者 Package >= version
Prefix %{_prefix}| %{_sysconfdir} : %{_prefix} 这个主要是为了解决今后安装rpm包时,并不一定把软件安装到rpm中打包的目录的情况。这样,必须在这里定义该标识,并在编写%install脚本的时候引用,才能实现rpm安装时重新指定位置的功能
%{_sysconfdir} 这个原因和上面的一样,但由于%{_prefix}指/usr,而对于其他的文件,例如/etc下的配置文件,则需要用%{_sysconfdir}标识
%package 定义一个子包
%description 详细描述信息
自定义打包参数;
%prep 预处理段,默认是解压源码包,可以自定义shell命令和调用RPM宏命令
%post rpm安装后执行的命令,可以自定义shell命令和调用RPM宏命令
%preun rpm卸载前执行的命令,可以自定义shell命令和调用RPM宏命令
%postun rpm卸载后执行的命令,可以自定义shell命令和调用RPM宏命令
%patch 打补丁阶段
%build 编译安装段,此段包含./configure和 make 安装阶段
%install 安装阶段,会把编译好的二进制文件安装到BUILDROOT为根的目录下
%files 文件段,定义软件打包时的文件,分为三类--说明文档(doc),配置文件(config)及执行程序,还可定义文件存取权限,拥有者及组别。其路径为相对路径
%changelog 定义软件包修改的日志
2.2补充:
Group:
软件包所属类别,具体类别有:
Amusements/Games (娱乐/游戏)
Amusements/Graphics(娱乐/图形)
Applications/Archiving (应用/文档)
Applications/Communications(应用/通讯)
Applications/Databases (应用/数据库)
Applications/Editors (应用/编辑器)
Applications/Emulators (应用/仿真器)
Applications/Engineering (应用/工程)
Applications/File (应用/文件)
Applications/Internet (应用/因特网)
Applications/Multimedia(应用/多媒体)
Applications/Productivity (应用/产品)
Applications/Publishing(应用/印刷)
Applications/System(应用/系统)
Applications/Text (应用/文本)
Development/Debuggers (开发/调试器)
Development/Languages (开发/语言)
Development/Libraries (开发/函数库)
Development/System (开发/系统)
Development/Tools (开发/工具)
Documentation (文档)
System Environment/Base(系统环境/基础)
System Environment/Daemons (系统环境/守护)
System Environment/Kernel (系统环境/内核)
System Environment/Libraries (系统环境/函数库)
System Environment/Shells (系统环境/接口)
User Interface/Desktops(用户界面/桌面)
User Interface/X (用户界面/X窗口)
User Interface/X Hardware Support (用户界面/X硬件支持)
%setup 的用法
%setup 不加任何选项,仅仅打开源码包
%setup -n newdir 将软件包解压至新目录(重命名解压的包),默认
%setup -c 解压缩之前先产生目录。
%setup -b num 将第num个source文件解压缩。
%setup -T 不使用default的解压缩操作。
%setup -T -b 0 将第0个源代码文件解压缩。
%setup -c -n newdir 指定目录名称newdir,并在此目录产生rpm套件。
%setup -q 解压不输出信息
%Patch用法
先使用Patch{n}定义补丁包,然后使用%patch{n}或者%{patch{n}}来调用打补丁
补丁号命名规则
0-9 Makefile、configure 等的补丁
10-39 指定功能或包含他的文件的补丁
40-59 配置文件的补丁
60-79 字体或字符补丁
80-99 通过 xgettexize 得到的目录情况的补丁
100- 其他补丁
%patch 最简单的补丁方式,自动指定patch level。
%patch 0 使用第0个补丁文件,相当于%patch -p 0。
%patch -s 不显示打补丁时的信息。
%patch -T 将所有打补丁时产生的输出文件删除
%patch -b name 在打补丁之前,将源文件加入name,缺省为.org
%file用法
%defattr (-,root,root) 指定包装文件的属性,分别是(mode,owner,group),-表示默认值,对文本文件是0644,可执行文件是0755
%attr(600,work,work) 指定特定的文件目录权限
fattr (-,root,root)
本段是文件段,用于定义构成软件包的文件列表,那些文件或目录会放入rpm中,分为三类-说明文档(doc),配置文件(config)及执行程序,还可定义文件存取权限,拥有者及组别。
这里会在虚拟根目录下进行,千万不要写绝对路径,而应用宏或变量表示相对路径。
※特别需要注意的是:%install部分使用的是绝对路径,而%file部分使用则是相对路径,虽然其描述的是同一个地方。千万不要写错。
%files -f %{name}.lang tui
file1 #文件中也可以包含通配符,如*
file2
directory #所有文件都放在directory目录下
%dir /etc/xtoolwait #仅是一个空目录/etc/xtoolwait打进包里
%doc 表示这是文档文件,因此如安装时使用--excludedocs将不安装该文件,
%doc /usr/X11R6/man/man1/xtoolwait.* #安装该文档
%doc README NEWS #安装这些文档到/usr/share/doc/%{name}-%{version} 或者 /usr/doc或者
%docdir #定义说明文档的目录,例如/root,在这一语句后,所有以/root开头的行都被定义为说明文件。
%config /etc/yp.conf #标志该文件是一个配置文件,升级过程中,RPM会有如下动作。
%config(missisgok) /etc/yp.conf 此配置文件可以丢失,即使丢失了,RPM在卸载软件包时也不认为这是一个错误,并不报错。一般用于那些软件包安装后建立的符号链接文件,
/etc/rc.d/rc5.d/S55named文件,此类文件在软件包卸载后可能需要删除,所以丢失了也不要紧。
%config(noreplace) /etc/yp.conf
#该配置文件不会覆盖已存在文件(RPM包中文件会以.rpmnew存在于系统,卸载时系统中的该配置文件会以.rpmsave保存下来,如果没有这个选项,安装时RPM包中文件会以.rpmorig存在于系统 )
覆盖已存在文件(没被修改),创建新的文件加上扩展后缀.rpmnew(被修改)
%{_bindir}/*
%config /etc/aa.conf
%ghost /etc/yp.conf #该文件不应该包含在包中,一般是日志文件,其文件属性很重要,但是文件内容不重要,用了这个选项后,仅将其文件属性加入包中。
%attr(mode, user, group) filename #控制文件的权限如%attr(0644,root,root) /etc/yp.conf
如果你不想指定值,可以用-
%config %attr(-,root,root) filename #设定文件类型和权限
fattr(-,root,root) #设置文件的默认权限,-表示默认值,对文本文件是0644,可执行文件是0755
%lang(en) %{_datadir}/locale/en/LC_MESSAGES/tcsh* #用特定的语言标志文件
%verify(owner group size) filename #只测试owner,group,size,默认测试所有
%verify(not owner) filename #不测试owner,测试其他的属性
所有的认证如下:
group: 认证文件的组
maj: 认证文件的主设备号
md5: 认证文件的MD5
min: 认证文件的辅设备号
mode: 认证文件的权限
mtime: 认证文件最后修改时间
owner: 认证文件的所有者
size: 认证文件的大小
symlink:认证符号连接
如果描述为目录,表示目录中出%exclude外的所有文件。
%files
fattr(-,root,root)
%doc
%{_bindir}/*
%{_libdir}/liba*
%{_datadir}/file
%{_infodir}/*
%{_mandir}/man[15]/*
%{_includedir}
%exclude %{_libdir}/debug
(%exclude 列出不想打包到rpm中的文件。※小心,如果%exclude指定的文件不存在,也会出错的。)
如果把
%files
fattr(-,root,root)
%{_bindir}
写成
%files
fattr(-,root,root)
/usr/bin
则打包的会是根目录下的/usr/bin中所有的文件。
%files libs
fattr(-,root,root)
%{_libdir}/*so.*
%files devel
?fattr(-,root,root)
%{_includedir}/*
install的用法
-b:为每个已存在的目的地文件进行备份;
-d:创建目录,类似mkdir -p
-D:创建目的地前的所有目录,然后将来源复制到目的地。复制文件
-g:自行设置所属的组;
-m:自行设置权限,而不是默认的rwxr-xr-x
-o:自行设置所有者
-p:以来源文件的修改时间作为相应的目的地的文件属性
%pre %post %pretun %postun 用法
rpm提供了一种信号机制:不同的操作会返回不同的信息,并放到默认变量$1中
0代表卸载、1代表安装、2代表升级
if [“$1” = “0” ] ;then
comond
fi
用于判断rpm的动作
2.3 典型的spec文件案例:
3.技巧:
1)如果要避免生成debuginfo包:这个是默认会生成的rpm包。则可以使用下面的命令
echo ‘%debug_package %{nil}‘ >> ~/.rpmmacros
2)配置 RPM 在构建时使用新的目录结构,而不是默认的目录结构:
echo "%_topdir $HOME/rpmbuild" > ~/.rpmmacros
4.使用FPM制作RPM包
1)安装:
yum -y install ruby rubygems ruby-devel 安装ruby 和gem
gem install fpm 安装fpm工具
2)准备编译安装好的源码包
/usr/local/libiconv
3)打包:
fpm -f -s dir -t rpm -n beyond-libiconv --epoch=0 -v ‘1.14‘ -C /usr/local --iteration 1.el6 ./libiconv-1.14
参数解释
-f 强制输出,如果文件已存在,将会覆盖源文件
-s 指定源文件为目录 dir
-t 指定制作的包类型(rpm,deb solaris etc)
-n 指定制作的包名
-- epoch 指定时间戳
-v 指定软件版本
-C 指定软件安装的目录
--iteration 指定软件的适用平台
./libiconv-1.14 本次打包的文件
附加参数:
-e 可以在打包之前编译 spec文件
-d 指定依赖的软件包 用法 –d ‘Package’ 或 –d ‘Package > version’
--description 软件包描述
-p 生成的package文件输出位置
--url 说明软件包的url
--post-install :软件包安装完成之后所要运行的脚本;和”--after-install” 意思一样
--pre-install :软件包安装完成之前所要运行的脚本;和”--before-install” 意思一样
--post-uninstall :软件包卸载完成之后所要运行的脚本;和”--after-remove”意思一样
--pre-uninstall:软件包卸载完成之前所要运行的脚本;和”--before-remove”意思一样
fpm打包php案例:
以上是关于linux制做RPM包的主要内容,如果未能解决你的问题,请参考以下文章