目录
1. 源 SRPM 介绍
RPM 包是已经编译好的归档的软件包,这类包只要在符合的环境下就可以使用了,但是这也是 RPM 的一个问题,由于 RPM包 的使用对环境有要求,所以适配A环境的RPM包就不能适配B环境。
- RPM包分为:
- 二进制包 Binary
- 源代码包 Source
- Delta包
SRPM 是一种特殊的包,这个包含有源代码,由于源代码没有进行编译所以需要在某台机器上进行编译生成一个 新的RPM包 随后就能在该主机上使用了,通常情况下都是使用官方的、安装介质上的 RPM包。
SRPM 包与 RPM包 的命名类似只是在 RPM包的后缀前面有 rsrc。示列:xxx.src.rpm
大多的软件项目在推出 rpm 的时候也会有 源rpm 。
还有一种 tar包 的格式,tar包 用于最后的情况,一般是指没有 SRPM 的情况。
文件格式 | 文件名格式 | 是否直接安装 | 内含程序类型 | 可否修改参数并编译 |
---|---|---|---|---|
RPM | .rpm | 可以 | 已编译 | 不可 |
SRPM | .src.rpm | 不可以 | 未编译的源代码 | 可以 |
早期的 SRPM 必须要使用 root 身份来进行编译,同时源代码会放置在 /usr/src/redhat 目中中,现在则存放于 /家目录/rpmbuild/ 目录中
编译的时候需要有 make、gcc、c、c++ 等其它编译用的程序语言来进行编译。
2. 获取 SRPM
一般软件在发行编译包的时候会附带源码包。
下载的网站:
https://pkgs.org/
pkgs 是一个不错的网站,里面整合了各个发行版的包,在下载的包页面会有包的出处,这里面也就有源RPM包的下载地址。
比如在 CentOS7 的 x86_64 中可以找到这些包,这里 MySQL-python-1.2.5-1.el7.x86_64.rpmhttps://centos.pkgs.org/7/centos-x86_64/MySQL-python-1.2.5-1.el7.x86_64.rpm.html
在下载页面可以的 Download 板块可以找到 RPM包 的下载页面、SRPM 包的下载页面如下:
这样就可以获取 SRPM包 的下载地址了。
3.使用 SRPM 来安装软件
有两种方式来实现 SRPM包 的安装
- 方式一:编译 + 打包形成一个新的 RPM,用新的 RPM包 来安装
- 方式二:编译 → 安装
由于第二种方式并不能生成 rpm包 所以并不推荐使用。
3.1 实验:tree 命令的 SRPM 的编译安装使用
- 编译的SRPM:tree-1.6.0-10.el7.src.rpm
- 操作系统平台:CentOS Linux release 7.5.1804 (Core)
- 预先安装程序:gcc、mock、rpm-build
预先需要的操作:
[root@localhost ~]# useradd -s /sbin/nologin mockbuild
tree-1.6.0-10.el7.src.rpm 的下载地址:
3.3.1 方式一:
rpm -ivh tree-1.6.0-10.el7.src.rpm
rpmbuild -bb rpmbuild/SPECS/tree.spec
rpm -ivh rpmbuild/RPMS/x86_64/tree-1.6.0-10.el7.x86_64.rpm
使用 SRPM包 的过程与安装标准 RPM包 的过程是一样的,都是使用 rpm -ivh 。
rpm -ivh xxx.src.rpm 会创建一个名为 rpmbuild 的目录,在这个目录中有两个子目录 SOURCE、SPECS 。
- rpmbuild
- SOURCE:用于保存源代码
- SPECS:保存配置文件
rpmbuild 会的 -bb 第一个是的 b 是 build ,第二个是 binary 二进制的意思这用于构建二进制包。
rpmbuild 会根据 /SPECS/tree.spec 这个文件来进行相关的操作在 /家目录/rpmbuild/ 会有
- BUILD 在编译过程中,有些暂时的数据都会放置在这个目录中
- BUILDROOT
- RPMS 编译后将打包的完成的包文件放置在该目录下
- SOURCE 这个目录当中放置的是该软件的原始文件以及 config 这个配置文件
- SPECS 这个目录放置该软件的配置文件,包括这个软件的信息参数、设置项目等
- SRPMS 放置的是 SRPM 封装的文件,用于将软件以 SRPM 的方式输出
这四个新的子目录,tree.spec 这个参数文件会把源代码解压到 BUILD 目录下,随后需要调用 gcc 编译生成二进制文件,编译后就能生成一个 RPM 包,文件会保存在 RPMS 目录中。
在 /家目录/rpmbuild/BUILD/tree-1.6.0/tree 这里包括了源文件、生成文件、这里面的 tree 是可以执行的。
如:
[root@localhost ~]# /家目录/rpmbuild/BUILD/tree-1.6.0/tree /home/
3.3.2 方式二:
[root@localhost ~]# mkdir testsrcrpm
[root@localhost ~]# cd testsrcrpm/
[root@localhost testsrcrpm]# wget https://vault.centos.org/centos/7/os/Source/SPackages/tree-1.6.0-10.el7.src.rpm
[root@localhost ~]# rpm -ivh testsrcrpm/tree-1.6.0-10.el7.src.rpm
[root@localhost ~]# rpmbuild -bp rpmbuild/SPECS/tree.spec
[root@localhost ~]# cd rpmbuild/BUILD/tree-1.6.0/
[root@localhost tree-1.6.0]# more INSTALL
[root@localhost tree-1.6.0]# make
[root@localhost tree-1.6.0]# ./tree
[root@localhost tree-1.6.0]# make install
[root@localhost tree-1.6.0]# ll /usr/bin/tree
-rwxr-xr-x 1 root root 71000 Jun 28 03:18 /usr/bin/tree
[root@localhost tree-1.6.0]# rpm -qi tree
与 方式一 类似,只是使用的不是 rpmbuild -bb 而是 rpmbild -bp 这里的 p 是准备的意思,表示并不会进行编译而是创建目录结构,之后提取包中的源文件,并打上补丁。
第二种编译安装与 tar包 类似,在操作的目录下进行 make、make install 。