一、说明
如果我们是以软件包的格式来划分的,常见的Linux发行版主要可以分为两类,类ReadHat系列和类Debian系列,这两类系统分别提供了自己的软件包管理系统和相应的工具。
类RedHat系统中软件包的后缀是rpm,类Debian系统中软件包的后缀是deb。另一方面,类RedHat系统提供了同名的rpm命令来安装、卸载、升级rpm软件包,类Debian系统同样提供了dpkg命令来对后缀是deb的软件包进行安装、卸载和升级等操作。
rpm的全称是Redhat Package Manager,常见的使用rpm软件包的系统主要有Fedora、CentOS、openSUSE、SUSE企业版、PCLinuxOS以及Mandriva Linux、Mageia等,使用deb软件包后缀的类Debian系统最常见的有Debian、Ubuntu、Finnix等。
RPM这个软件管理的机制是由 Red Hat 这家公司发开发出来的, RPM 是以一种数据库记录的方式来将你所需要的软件安装到你的 Linux 系统的一套管理机制。
它最大的特点就是将你要安装的软件先编译过, 并且打包成为 RPM 机制的包装文件,通过包装好的软件里默认的数据库记录, 记录这个软件要安装的时候所依赖的软件,当在你的 Linux 主机进行安装时, RPM 会先依照软件里的数据查询 Linux 主机的依赖软件是否满足, 若满足则予以安装,若不满足则不予安装。那么安装的时候就将该软件的信息整个写入 RPM 的数据库中,以便未来的查询、验证与卸载!
这样一来的优点是:
1. 由于已经编译完成并且打包完毕,所以软件传输与安装上很方便 (不需要再重新编译)
2. 由于软件的信息都已经记录在 Linux 主机的数据库上,很方便查询、升级与卸载
但是这也造成些许的困扰,由于 RPM 文件是已经包装好的数据,也就是说, 里面的数据已经都『编译完成』了!所以,该软件文件几乎只能安装在原本默认的硬件与操作系统版本中。 也就是说,你的主机系统环境必须要与当初创建这个软件文件的主机环境相同才行!
举例来说,rp-pppoe 这个 ADSL 拨接软件,它必须要在 ppp 这个软件存在的环境下才能进行安装!如果你的主机并没有 ppp 这个软件,那么很抱歉,除非你先安装 ppp 否则 rp-pppoe 就是不让你安装的 (当然你可以强制安装,但是通常都会有点问题发生就是了!)。
所以,通常不同的 distribution (发行版)所释出的 RPM 文件,并不能用在其他的 distributions 上。举例来说,Red Hat 释出的 RPM 文件,通常无法直接在 SuSE 上面进行安装的。更有甚者,相同 distribution 的不同版本之间也无法互通,例如 CentOS 6.x 的 RPM 文件就无法直接套用在 CentOS 7.x 。
因此,这样可以发现这些软件管理机制的问题是:
1. 软件文件安装的环境必须与打包时的环境需求一致或相当
2. 需要满足软件的相依属性需求
3. 卸载时需要特别小心,最底层的软件不可先移除,否则可能造成整个系统的问题
那怎么办?如果我真的想要安装其他 distributions 提供的好用的 RPM 软件文件时? 呵呵!还好,还有 SRPM 这个东西!SRPM 是什么呢?顾名思义,他是 Source RPM 的意思,也就是这个 RPM 文件里面含有源码。特别注意的是,这个SRPM 所提供的软件内容『并没有经过编译』, 它提供的是源码!
通常 SRPM 的扩展名是以 ***.src.rpm 这种格式来命名的。不过,既然 SRPM 提供的是原始码,那么为什么我们不使用 Tarball 直接来安装就好了?这是因为 SRPM 虽然内容是原始码, 但是他仍然含有该软件所需要依赖说明、以及所有 RPM 文件所提供的数据。同时,他与 RPM 不同的是,它也提供了参数配置文档 (就是 configure 与 makefile),所以如果我们下载的是 SRPM ,那么要安装该软件时,你就必须要:
1. 先将该软件以 RPM 管理的方式编译,此时 SRPM 会被编译成为 RPM 文件
2. 然后将编译完成的 RPM 文件安装到 Linux 系统当中
怪了,怎么 SRPM 这么麻烦呢!还要重新编译一次,那么我们直接使用 RPM 来安装不就好了?通常一个软件在发布的时候,都会同时发布该软件的 RPM 与 SRPM 。我们现在知道 RPM 文件必须要在相同的 Linux 环境下才能够安装,而 SRPM 既然是原始码的格式,自然我们就可以通过修改 SRPM 内的参数配置档,然后重新编译生成能适合我们 Linux 环境的 RPM 文件,如此一来,不就可以将该软件安装到我们的系统当中,而不必与原作者打包的 Linux 环境相同了?这就是 SRPM 的用处了!
为何说 CentOS 是『社群维护的企业版』呢?
Red Hat 公司的 RHEL 发布后,连带会将 SRPM 发布出来。 社群的朋友就将这些 SRPM 收集起来并重新编译成为所需要的软件,再重复发布,成为 CentOS,所以才能号称与 Red Hat 的 RHEL 企业版同步啊!真要感谢 SRPM 哩!如果你想要理解 CentOS 是如何编译一支程序的, 也能够通过学习 SRPM 内含的编译参数,来学习的啊!
本文主要描述如何通过软件包的源代码src.rpm构建自己的rpm软件安装包。
从软件运行的结构来说,一个软件主要可以分为三个部分:可执行程序、配置文件和动态库。当然还有可能会有相关文档、手册、供二次开发用的头文件以及一些示例程序等等,其他部分都是可选的,只有可执行文件是必须的。
关于如何制作rpm软件包的方法,网上教程也一大堆,谈及最多的当属rpmbuild这个命令行工具。
rpm的打包流程相比deb的要稍微麻烦一些,因为它对打包目录有一些严格的层次上的要求。如果你的rpm的版本<=4.4.x,那么rpmbuid工具其默认的工作路径是/usr/src/redhat,这就使得普通用户不能制作rpm包,因为权限的问题,在制作rpm软件包时必须切换到root身份才可以。
从rpm从4.5.x版本开始,将rpmbuid的默认工作路径移动到用户家目录下的rpmbuild目录里,即$HOME/rpmbuild,并且推荐用户在制作rpm软件包时尽量不要以root身份进行操作,因为在制作RPM包的过程中,将会把软件编译和安装到系统中,这样可能会破坏系统。
二、实验环境
操作系统: CentOS7.x Minimal
编译安装软件:nginx-1.15.0-1.el7_4.ngx.src.rpm
虚拟机: xx.xx.xx.xx (能联网)
三、 安装编译环境
nginx源码都是用C/C++写的,所以需要在编译用的CentOS 7服务器上安装gcc和gcc-c++等相关软件包
安装常用工具
# yum -y install vim wget
安装编译工具
# yum -y install rpm-build gcc make redhat-lsb-core libuuid-devel
安装nginx依赖包
# yum -y install openssl openssl-devel libxml2-devel libxslt-devel perl-devel perl-ExtUtils-Embed libtool zlib zlib-devel pcre pcre-devel patch
添加用于编译src.rpm的用户
# useradd builder
四、用src.rpm编译生成nginx安装包
# wget http://120.52.51.13/nginx.org/packages/mainline/centos/7/SRPMS/nginx-1.15.0-1.el7_4.ngx.src.rpm
# rpm -qpi nginx-1.15.0-1.el7_4.ngx.src.rpm
# cp nginx-1.15.0-1.el7_4.ngx.src.rpm /home/builder
# su - builder
编译方式一:直接生成安装用的rpm安装包
$ rpmbuild --rebuild --clean nginx-1.15.0-1.el7_4.ngx.src.rpm
$ ll -R
可以看到,程序根据操作系统的架构,在 /home/builder/rpmbuild/RPMS/x86_64/ 目录下编译生成用于安装的rpm包。
编译方式二:生成源码包
$ rpm -ivh nginx-1.15.0-1.el7_4.ngx.src.rpm
$ ll -R
用root用户,对生成的 nginx-1.15.0.tar.gz 包做编译安装,这没什么好说的。
编译方式三:通过spec 文件,生成用于安装的rpm包
$ rpm -ivh nginx-1.15.0-1.el7_4.ngx.src.rpm
$ ll -R
$ cd /home/builder/rpmbuild/SPECS/
$ rpmbuild -bb nginx.spec
$ /home/builder
$ ll -R
细心的你可能会发现,咦,怎么和方式一生成安装用的rpm包方式一样?
其实不一样,相比方式一,在 rpmbuild -bb nginx.spec 之前,我们是可以编辑修改nginx.spec 之前,自定一些东西的,只是我们这里用的默认的nginx.spec文件而已,关于nginx.spec文件,不是本文的关注点,感兴趣可以查看相关文档。
总结一下:
src.rpm包的好处是,一定程度上跨平台,在类RedHat系列,如RedHat、Fedora、CentOS、openSUSE、SUSE企业版、PCLinuxOS以及Mandriva Linux、Mageia等操作系统上,不管哪个版本,下载某个软件的src.rpm包,编译成用于安装rpm包,那么就适配这个操作系统了。
如你将nginx-1.15.0-1.el7_4.ngx.src.rpm在 CentOS6.5上编译成安装用的rpm包,那么就可以在CentOS6.5上安装,如你将nginx-1.15.0-1.el7_4.ngx.src.rpm在 CentOS7.5上编译成安装用的rpm包,那么就可以在CentOS7.5上安装。
如果你将nginx-1.15.0-1.el7_4.ngx.src.rpm在CentOS6.5上编译成安装用的rpm包,在CentOS7.5上安装,基本不行!
五、安装nginx
$ su -root
# rpm -ivh /home/builder/rpmbuild/RPMS/x86_64/nginx-1.15.0-1.el7_4.ngx.x86_64.rpm
# nginx -V 2>&1 | sed 's/ --/\n--/g' | egrep --color '.*path.*|$'
# rpm -qa --scripts nginx
# rpm -qi nginx
你在哪台服务器上做的编译,包中获取了你的主机名。
# systemctl start nginx
# systemctl enable nginx
# systemctl status nginx
六、参考
软件安装: RPM, SRPM 与 YUM 功能
http://cn.linux.vbird.org/linux_basic/0520rpm_and_srpm.php#intro_whatisrpm
rpmbuild命令
http://man.linuxde.net/rpmbuild
rpmbuild制作rpm 包
https://blog.csdn.net/u012373815/article/details/73257754
一堂课玩转rpm包的制作
http://blog.chinaunix.net/uid-23069658-id-3944462.html
How to compile and install nginx1.15.3 on CentOS7
//www.greatytc.com/p/1a83110786b1
玩转rpm包的制作
https://blog.csdn.net/weixin_37871174/article/details/79258383
Linux 安装.src.rpm源码包的方法
https://www.cnblogs.com/einyboy/archive/2012/09/13/2683015.html
CentOS 7内核源码包(kernel.src.rpm)的修改和打补丁编译
https://www.sulabs.net/?p=773
鸟哥的 Linux 私房菜:基础学习篇 第四版
https://wizardforcel.gitbooks.io/vbird-linux-basic-4e/content
修改、重新生成和安装src.rpm源码包
http://abcdxyzk.github.io/blog/2014/10/30/tools-src-rpm
https://haohetao.iteye.com/blog/684589
在 CentOS 下设置一个创建 RPM 的环境
https://wiki.centos.org/zh/HowTos/SetupRpmBuildEnvironment
Rebuild a Source RPM
https://wiki.centos.org/HowTos/RebuildSRPM
https://wiki.centos.org/zh/HowTos/RebuildSRPM
Redhat RPM Source Packages
https://aplawrence.com/BGarlock/rpm-bg.html
Linux : How to install source rpm on RHEL/CentOS
https://www.itechlounge.net/2012/12/linux-how-to-install-source-rpm-on-rhelcentos/