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案例:

fpm   -f -s dir -t rpm -n beyond-php --epoch=0 -v ‘5.2.14‘ -C /usr/local/ -p ./ --iteration 1.el6  -d ‘beyond-libiconv‘ -d ‘beyond-libmcrypt‘ -d ‘beyond-mcrypt‘ -d ‘beyond-mhash‘ -d ‘libxml2‘ -d ‘libxml2-devel‘  -d ‘zlib‘ -d ‘zlib-devel‘ -d ‘libpng‘ -d ‘libpng-devel‘ -d ‘freetype‘ -d ‘freetype-devel‘ -d ‘autoconf‘ -d ‘gd‘ -d ‘gd-devel‘ -d ‘libjpeg‘ -d ‘libjpeg-devel‘  -d ‘curl‘ -d ‘curl-devel‘ -d ‘mysql-devel‘ -d ‘openssl‘ -d ‘openssl-devel‘ -d ‘openldap-devel‘ -d ‘libtool-ltdl‘ -d ‘libtool-ltdl-devel‘ --url http://sa.beyond.com/source/php-5.2.14.tar.gz --license GPL  --post-install ./preinstall.sh   /usr/local/php

来自为知笔记(Wiz)

原文地址:https://www.cnblogs.com/pycode/p/9495792.html

时间: 2024-10-07 06:13:48

linux制做RPM包的相关文章

linux之rpm包制作

难点:spec文件的编写 1,首先安装rpm-build命令 yum install rpm-build 2,介绍spec编写规则: #ll #drwxr-xr-x  2 root root 4096 Jul 29 13:50 BUILD #drwxr-xr-x  2 root root 4096 Jul 29 13:51 RPMS #drwxr-xr-x  2 root root 4096 Jul 29 13:51 SOURCES #drwxr-xr-x  2 root root 4096 J

包管理 ----- Linux操作系统rpm包安装方式步骤

Linux操作系统rpm包安装方式步骤 2016年08月04日 07:00:26 阅读数:17140 转自 : http://os.51cto.com/art/201003/186467.htm 特别值得一提的是Linux操作系统有很多值得学习的地方,这里我们主要介绍Linux操作系统,包括介绍Linux操作系统等方面.Linux操作系统软件安装方法总结 一.rpm包安装方式步骤: 引用: 1.找到相应的软件包,比如soft.version.rpm,下载到本机某个目录: 2.打开一个终端,su

Linux的rpm包管理

我们都知道,windows的程序无法直接在linux中运行,windows中大量的木马和病毒也无法被linux识别,所有的软件包都必须针对linux再做单独的开发. 软件包分类 源码包 (把源代码直接开放的包) 脚本安装包(源码包写一个安装界面,不需要手动安装) 二进制包(RPM包.系统默认包) 源码包的优点: 1.开源,如果有足够的能力,可以修改源代码 2.可以自由选择所需的功能 3.软件是编译安装,所以更加适合自己的系统,更加的稳定也效率更高 4.卸载方便 缺点: 1.安装步骤较多,尤其在安

linux 下载rpm包到本地,createrepo:创建本地YUM源

如何下载rpm包到本地 设置yum安装时,保留rpm包. 1.编辑 /etc/yum.conf 将keepcache的值设置为1; 这样就可以将yum安装时的rpm包保存在 /var/cache/yum下面 2.或者使用yum-plugin-downloadonly插件, sudo yum install yum-plugin-downloadonly 用法:sudo yum install ceph-0.87.1-0.el7.centos.x86_64.rpm --downloadonly -

Linux 定制rpm包

 定制rpm包 说明:这些操作全部在管理服务器内操作. 定制rpm包,搭建内网yum仓库,通过kickstart批量系统安装,这是互联网企业运维自动化的必要技能,自动化运维的基石. 1.1 面试题 有100台服务器想安装系统.你有什么方案快速部署并优化吗?需要多少时间搞定? 1.1.1 解决方案 (1) tar打包:先编译安装.打包.批量分发.解包: (2) saltstack.puppet.ansible批量部署: (3) 定制rpm所.搭建yum仓库.yum安装: (4) openstack

linux系统RPM包的安装

rpm包的安装方法有2种 使用yum install -y 安装,这种安装需要创建rpm仓库,在目录/etc/yum.repos.d目录下面的*.repo文件下面添加如下信息:不同版本的linux的系统,有的会自带repo格式的文件,可以直接在里面添加,没有的话直接新建一个. 在仓库文件中添加: [唯一id] name=名字 baseurl=file:///mnt/cdrom gpgcheck=0 2.如果有个别包需要关联,使用yum安装和单独的rpm -ivh 皆无法正常安装,可以使用 rpm

Linux基本命令——RPM包管理工具

WHAT?什么是RPM? RPM是一种软件包格式,文件的扩展名为".rpm",其管理机制最早由Red Hat公司提示,后来随着版本升级,融入更多的优秀特性,先已成为众多Linu发行版中公认的软件包管理标准. WHY?为什么要使用它? RPM包管理器通过建立统一的文件数据库,对在Linux系统中安装.卸载.升级的各种.rpm软件包进行详细的记录,并能够自动分析软件包之间的依赖关系,保持各应用程序在一个协调.有序的整体环境中运行. WHERE?在哪里使用? 很多Linux主流的软件都有.r

linux下rpm包和命令使用简介

一.rpm包简介 RPM[1] 是RPM Package Manager(RPM软件包管理器)的缩写,这一文件格式名称虽然打上了RedHat的标志,但是其原始设计理念是开放式的,现在包括OpenLinux.S.u.S.E.以及Turbo Linux等Linux的分发版本都有采用,可以算是公认的行业标准了. 二.rpm包的安装 首先本例实在CentOS中进行的,若是别的发行版不在本篇文件的介绍范围内,同时在找rpm安装包时最好是发行商提供或者是从官方下载,最后还可以从国内比较常用的镜像网站中下载,

Linux中rpm包的管理

1.相关概念  1.程序包管理器功能:1.应用程序打包:有特定格式 : 2. 对兼容的程序包进行管理:            [注意:制作成的二进制格式程序与平台有相关性,所以,通常需要制作各种流行平台所兼容的版本] 2.C程序包编译到机器识别的过程:   源代码(文本)--> 预处理 --> 编译 --> 汇编 --> 链接 编译时,根据是否将被调用的库文件直接打包进生成的二进制程序文件,编译方式可分为两类:                    动态链接:不将被调用的库文件打包