RPM包制作 本文共有5205个字,关键词: rpm包的制作是根据spec file来实现的,我们能够写spec file文件就能够实现制作rpm包了,spec file文件中都是一些命令,他告诉rpm包的制作工具rpmbuild,一步步如何解压一个软件包,如何去编译一个软件包,编译完成后如何做成不同的rpm包,rpm包之间有什么样的关系,每一个rpm包中应该包含什么样的文件。 spec file文件的语法 在各个段落中如何定义软件包的相关信息,如何控制编译,如何去列出包中所包含的文件,以及如何在spec file文件中使用宏(macro)。 #####一般来说制作一个rpm包大致包含以下几个方面的工作 ``` ============================================================= 1. 明确我们打算做的rpm包是什么东西 2. 收集制作软件包的原材料,最好是最原始的源码包 3. 收集软件包所需要的补丁 4. 制作rpm包是否适合老版本升级,是否需要执行一些清理旧包 5. 规划好rpm包的依赖关系,这个包依赖什么rpm包,这个rpm包向其他rpm包提供什么样的能力(capability) #编译依赖、安装依赖 6. 制作rpm包 7. 测试rpm包是否能够安装 ============================================================= ``` rpm包的制作需要有一个制作车间,需要有一定的目录结构 !!制作rpm包一定不能使用root用户制作,使用普通用户来制作rpm包,因为在制作过程中如果某个命令写错了,root用户执行后的结果是灾难性的,且rpm包的制作过程中用不着root用户权限 将原材料放入规划好的目录结构中(特定目录) 创建spec file文件 编译源码生成rpm包 ``` 我们需要在特定的目录中提供5个子目录(目录名大写) BUILD:让源代码解压后存放的位置,但是我们不用管,只需要提供一个目录(真正制作过程在这个目录下) RPMS:制作完成后的RPM包存放位置(按照架构存放,例如i386目录,需为特定平台指定子目录),RPM包的编译可以实现交叉编译 SOURCES:所有收集的原材料存放在这里(conf文件,源码补丁文件等) SPECS:spec file文件,每个RPM包的制作必须要有一个spec file文件,作为rpm包制作过程中的指导文件,通常以软件包的名称命名,以spec结尾。 SRPMS:SRC格式的RPM包的存放路径 ``` redhat系统上,在/usr/src/redhat/目录下有Build RPM包的目录,权限为root,普通用户没有权限,多数情况下,我们不会在该目录下进行生成rpm包,在任何一个地方只要准备了这么几个目录都可以作为rpm包的制作车间,到底使用谁来作为当前用户rpm包的宏相关定义(rpm包为了工作有很多系统变量,和操作系统没有关系) ~]# rpmbuild --showrc #显示所有相关宏定义 宏的格式为:%{...} 名称为:_XX(一个下滑线的为定义spec文件本身环境的使用情况) 名称为:__XX(两个下划线定义的通常是命令) 定义宏的目的:在不同的系统上,路径很可能不一样,用以引用当前系统上的命令真正在什么地方。 macrofiles: 定义这些宏在什么文件中设定的(使用冒号隔开),生效的次序是自前而后的,如果配置文件中某个宏重复了,则以最后读取到的为准。 _topdir: 用于定义制作车间的路径 在家目录下创建文件~/.rpmmacros 写入%_topdir /RPM_BUILD_PATH #指定一个当前用户有权限访问的目录 spec file文件结构 intraduction section #介绍段,rpm -qi能够查询到的信息 prep section #准备阶段,解压缩源码包并cd进去 build section #编译阶段 install section #安装阶段(安装到某一个目录下,非当前系统) clean section #清理阶段 files section #文件段,列出收集的文件,打包到rpm包中 change log section #改变日志段(版本信息变更) spec文件语法 ``` ============================================================ #定义的标签(冒号前的顶格字段),在spec文件中可以使用%{name}的方式进行引用标签后(冒号)的值 #%{?dist},该处的问号能进行判断,存在就赋值,不存在则不填 #所有以"#"开头的为注释,但是注释中不能出现"%",非得出现可写为"%%" TagName: value #标签名称不区分大小写 %define macro_name value #用户自定义宏 #用户自定义宏的引用:%{macro_name} || %macro_name Name: name-version-release.rpm name-version-release.arch.rpm #name中一定不能出现短横线(dash),短横线有特殊意义 GROUP: 制作的软件包属于哪个组,可参考/usr/share/doc/rpm-version/GROUPS Vendor: 制作人 URL: rpm下载位置或网址 Packager: first name License: 一定要带上,看清楚源码包的授权,REDME/change logs Summary: 概述,尽量不要写太多 %description: 写大段的描述信息,建议一行不要太长,采取强制换行 #Define Package Dependencies 定义包的依赖(可省略) Requires: capability #安装rpm包时的依赖,可以出现多次 Povides: capability #该rpm包提供的能力 BuildRequires: capability #生成rpm包时的依赖,可出现多次 #设定build locations BUILD: 用于编译的目录 BuildRoot: 用于编译后安装的目录(假想根目录) %{buildroot} #假想根目录 $RPM_BUILD_ROOT #假想根目录 Source: 怎么命名源文件(如果只有一个使用source即可) #如果有多个则:source0、source1等等 #这些源文件必须位于source下,可以加http链接,但是它不回去下在,而是到SOURCE目录下去找 #通过source引入的文件通常不会自动安装到对应的buildroot路径下,需要手动进行安装 %{__install} -p -D -m 0755 %{SOURCE1} %{buildroot}/etc/rc.d/init.d/nginx #应用"SOURCE1"需大写 Patch: 补丁,如果有补丁,命名方式同source,命名patch是为了后面打补丁引用 %prep #将源代码解压到build路径下,设置环境变量并cd进去 %setup -q -n nagios #有些包解压后名称不带版本号,当cd时会报错,因此需要使用%setup的额外选项指定名称 -q #静默模式 -a #先进build目录再解压缩源文件 #-a 0 -a 1 展开source0、source1 -b #先解压缩,再进入build目录,当展开目录为多个且需要合为一个时 #-b 0 -b 1 展开source0、source1 #-b需要先使用-c,再解压缩之前创建目录,name-version %build #对于c语言,configure,make,make install #如果是perl程序,读帮助文档perl Makefile.PL %install #保留源文件时间戳 %clean #主要作用就是删除buildroot rm -rf %{buildroot} ~]# rpmbuild --clean nginx.spec Define installation Scripts %pre #安装前脚本 %post #安装后脚本 %preun #卸载前脚本 %postun #卸载后脚本 #脚本中有$1变量,指的是安装类型(处理类型) 判断 $1 == 1 安装 判断 $1 == 2 升级 #3-9都可以用,但是常用2 判断 $1 == 3 卸载 %files #任何包含进rpm包中的文件,都在这儿列出来必须在BuildRoot目录中安装生成,支持通配符、目录 %dir /PATH/TO/DIR #将指定目录当做空目录,不关心目录中内容 %doc File_Name #不写路径,在安装时放入/usr/local/share/doc/nginx-xxx %dirdoc /PATH/TO/DIR #将整个目录下的内容作为文档处理 %config /PATH/TO/FILE #指定配置文件 #noreplace,不替换以改变的文件 #*.rpm.new(新安装的配置文件) #*.rpmorig(不兼容时的新文件名称) %config(noreplace,missing ok) #missing ok,没有也没关系 %changelog * #以星号标识日期 #日期的格式为:星期,月份,日,年,制作者,邮件地址-版本号-release号 - #短横线标识注释,在这个版本里我们都干了什么事 %attr(mode,user,group) filename #给单个文件修改属主属组、权限,为横线时保留原有属性 %attr(-,user,-) filename %defattr(-,-,root,-) #默认权限定义 ============================================================ ``` ~]# ldconfig #重新读取动态链接库中的库文件 ~]# rpm -k *.rpm #检查rpm包的来源 使用gpg命令对rpm包进行签名 ~]# gpg --gen-key #生成秘钥 ~]# gpg --list-key #查看秘钥 ~]# gpg --ecport -a '...秘钥...' >RPM-GPG-KEY-* #将公钥提取出来,随安装包给用户 ~]# rpm --addsign *.rpm #对rpm包进行签名 ~]# rpm --import RPM-GPG-KRY-* #安装公钥 ~]# rpm --checksig *.rpm #验证RPM包 PGP: Pretty Good Privacy OpenPGP是一种规范: PGP是商业的软件,使用该软件加密的也得使用该软件进行解密,为了增强适用性,PGP公司写了open PGP规范,其他公司可以按照规范开发软件,以增强适用性,GNU组织根据该规范编写了一款软件,称为GNUPG-->GPG 制作RPM包时直接签名 ~]# vi ./rpmmacros %_signature %_GPG_Name 「一键投喂 软糖/蛋糕/布丁/牛奶/冰阔乐!」 赞赏 × 几人行 (๑>ڡ<)☆谢谢老板~ 2元 5元 10元 50元 100元 任意金额 2元 使用微信扫描二维码完成支付 版权声明:本文为作者原创,如需转载须联系作者本人同意,未经作者本人同意不得擅自转载。 CI/CD 2019-05-06 评论 3225 次浏览