rpm包的制作过程其实并不复杂,只要理清楚准备在这个包里放什么,并且放在什么位置就好。就像烧制一道料理的过程,首先要明白做菜的原材料是什么,其次还需要在正确的场所、使用正确的工具完成烹饪。
1. RPM的6个制作空间
rpm包的制作有两个关键文档,.spec文件和.sh生成脚本。spec文件就像打包的图纸,生成脚本则简化了rpm包的制作流程。在介绍这两个文档之前,我们先来初识一下rpm包的制作空间rpmbild。rpm包的制作空间分为六块:SPECS、SOURCES、BUILD、BUILDROOT、RPMS和SRPMS。
$ tree rpmbuild
rpmbuild
├── SPECS
├── SOURCES
├── BUILD
├── BUILDROOT
├── RPMS
└── SRPMS
默认位置 |
名称 |
用途 |
~/rpmbuild/SPECS |
Spec 文件目录 |
存放 RPM 包配置(.spec)文件 |
~/rpmbuild/SOURCES |
源代码目录 |
存放源码包、补丁 |
~/rpmbuild/BUILD |
构建目录 |
源码包被解压至此,并在该目录的子目录完成编译 |
~/rpmbuild/BUILDROOT |
最终安装目录 |
保存 %install 阶段安装的文件 |
~/rpmbuild/RPMS |
标准 RPM 包目录 |
生成/保存二进制 RPM 包 |
~/rpmbuild/SRPMS |
源代码 RPM 包目录 |
生成/保存源码 RPM 包 |
RPM的打包过程同这六块制作空间息息相关,接下来我会简单介绍rpmbild的打包过程,一共包括4个环节,但只有第一个环节需要我们参与,而后面的三个环节,rpmbuild的相关命令会自动完成:
- 首先,需要把.spec和源代码分别放置在SPECS和SOURCES目录中。
- 接下来是“编译”环节,编译的过程是在BUILD中完成的,所以需要先把源代码复制到此目录下。一般情况下,源代码是压缩包的格式,那么解压过来即可。
- 然后进行“安装”,这里有点类似于预先组装软件包,把软件包应该包含的内容安装到BUILDROOT中。并按照实际安装后的目录结构组装,比如二进制命令可能会放在/usr/bin下,日志内容会放在/var/log下,那么就在BUILDROOT下也按照同样的目录结构放置。
- 最后一步也是大功告成的一步,在RPMS目录下可以找到生成的RPM包,而源码包会被放置在SRPMS目录下。
2. SPEC文件
明晰了rpm包的制作空间之后,就可以了解我们的“图纸”——SPEC文件了,SPEC文档大致可以分为6个部分。
- 第一部分是头文件及描述部分,这部分会说明要构建什么包,也就是介绍这道菜是什么。
- 第二部分%prep,相当于是把食材解冻的过程。在此之前,所有食材是被冻在一起的。该部分描述了解压源码包的方法,其中%setup用于指定操作Source0标签的文件。这一步是从SOURCES向BUILD写入内容的过程。
- 第三部分%build是构建软件,是对解压到BUILD下的源码进行编译的阶段,就像是炒菜的过程,整个过程在BUILD目录下完成。
- 第四部分%install是安装文件,像是摆盘的过程。该阶段包含安装阶段需要执行的命令,读取位于BUILD目录下的文件,并将其安装至BUILDROOT目录。并根据需要在BUILDROOT中创建必要目录。比如xxx6.py,在项目代码的目录中的路径是xx5/xx6.py,而我们规定,我们的软件包在安装完成之后,该脚本需要被放在usr/local/bin下面。所以我们在这里指定安装后的位置,放在/usr/local/bin/xxx6.py。这也是为什么说spec像打包的图纸,它规定了打包什么,并且安装在哪里。BUILDROOT下面的这些文件,是用户安装 RPM 后最终得到的文件。所以BUILDROOT也被称作虚根。这其中会涉及到很多宏,这里列举三个宏。
%{_sysconfdir} /etc
%{_localstatedir} /var
%{_prefix} /usr
- 第五部分%files是列出所有要包括在RPM中的文件,也就是需要被打包的文件和目录,这些文件都是从BUILDROOT目录下取用的。就像我们摆盘是在厨房摆的,但是最后我们会把它端到餐厅。BUILDROOT就像是厨房,而%files下面就是餐厅。
- 在最后一部分规定一些安装卸载前后执行的脚本,也就是做菜的收尾工作。
3. sh脚本
在这一部分会介绍sh生成脚本的编写规范。该脚本的编写过程,其实就像是炒菜的过程,目的是炒好一盘菜,大致可以分为以下三步:
- 修建厨房(建设制作空间)。炒菜首先要有地点,在哪里炒菜,所以首先会修建厨房。会设定目录结构,也就是前面讲到的rpm包的制作空间,会将制作空间给创建好,把厨房建好。
- 放置原材料(放置tar包和spec文件)。厨房建好后,还需要有原材料。所以说这时要把tar包和spec文件放在正确的位置,就像是“把鸡鸭鱼肉搬进去放好”,一定要放在正确的位置,如果把鱼扔在了垃圾桶里,肯定是没法做完一道菜的。
- 使用特定厨具炒菜(使用rpmbuild指令打包)。制作空间也有了,原材料也有了,最后就是炒菜了。使用rpmbuild指令进行打包,得到的就是rpm包。
生成脚本不仅简化了打包流程,还可以使用控制台传参。比如可以通过控制台传参来定义version和release号,这样一来每一次出迭代版本的新包就不用手动修改spec文件,而是直接通过控制台来进行version和release号传参指导。
上述就是rpm包的制作流程,及相关文档的编写规范,期待你亲手制作的第一个RPM包。