linux源码NTP构建rpm包的方法
linux运维经常遇到漏洞修复问题,针对这些漏洞需要修复。一般采用更新该服务的方式修复漏洞。当机器较少是一台一台的编译安装比较轻松,当机器达到几十上百台时,服务的安装将成为一个繁重的工作,如果能叫服务的源码包制作成rpm格式的安装包,这将降低了安装服务的难度和减轻了安装升级的工作量。本文将介绍如何通过NTP官方源码包生产rpm的安装包。
首先介绍RPM
rpm的全称是Redhat Package Manager,常见的使用rpm软件包的系统主要有Fedora、CentOS、openSUSE、SUSE企业版、PCLinuxOS以及Mandriva Linux、Mageia等,使用deb软件包后缀的类Debian系统最常见的有Debian、Ubuntu、Finnix等。
PM这个软件管理的机制是由 Red Hat 这家公司发开发出来的, RPM 是以一种数据库记录的方式来将你所需要的软件安装到你的 Linux 系统的一套管理机制。
它最大的特点就是将你要安装的软件先编译过, 并且打包成为 RPM 机制的包装文件,通过包装好的软件里默认的数据库记录, 记录这个软件要安装的时候所依赖的软件,当在你的 Linux 主机进行安装时, RPM 会先依照软件里的数据查询 Linux 主机的依赖软件是否满足, 若满足则予以安装,若不满足则不予安装。那么安装的时候就将该软件的信息整个写入 RPM 的数据库中,以便未来的查询、验证与卸载!
优点是:
-
由于已经编译完成并且打包完毕,所以软件传输与安装上很方便 (不需要再重新编译)
-
由于软件的信息都已经记录在 Linux 主机的数据库上,很方便查询、升级与卸载
缺点是:
3. 软件文件安装的环境必须与打包时的环境需求一致或相当
-
需要满足软件的相依属性需求
-
卸载时需要特别小心,最底层的软件不可先移除,否则可能造成整个系统的问题
接下来介绍SRPM
SRPM 是什么呢?顾名思义,他是 Source RPM 的意思,也就是这个 RPM 文件里面含有源码。特别注意的是,这个SRPM 所提供的软件内容『并没有经过编译』, 它提供的是源码!
通常 SRPM 的扩展名是以 ***.src.rpm 这种格式来命名的。不过,既然 SRPM 提供的是原始码,那么为什么我们不使用 Tarball 直接来安装就好了?这是因为 SRPM 虽然内容是原始码, 但是他仍然含有该软件所需要依赖说明、以及所有 RPM 文件所提供的数据。同时,他与 RPM 不同的是,它也提供了参数配置文档 (就是 configure 与 makefile),所以如果我们下载的是 SRPM ,那么要安装该软件时,
你就必须要:
-
先将该软件以 RPM 管理的方式编译,此时 SRPM 会被编译成为 RPM 文件
-
然后将编译完成的 RPM 文件安装到 Linux 系统当中
怎么 SRPM 这么麻烦呢!还要重新编译一次,那么我们直接使用 RPM 来安装不就好了?通常一个软件在发布的时候,都会同时发布该软件的 RPM 与 SRPM 。我们现在知道 RPM 文件必须要在相同的 Linux 环境下才能够安装,而 SRPM 既然是原始码的格式,自然我们就可以通过修改 SRPM 内的参数配置档,然后重新编译生成能适合我们 Linux 环境的 RPM 文件,如此一来,不就可以将该软件安装到我们的系统当中,而不必与原作者打包的 Linux 环境相同了?这就是 SRPM 的用处了!
接下来介绍用NTP软件包的源代码src.rpm构建自己的rpm软件安装包。
一:实验环境
[root@centos7 x86_64]# cat /etc/redhat-release
CentOS Linux release 7.6.1810 (Core)
虚拟机:VMware xx.xx.xx.xx (能联网)```
打包软件:[root@centos7 builder]# ll
total 4244
-rw-r--r-- 1 builder builder 4343547 Mar 11 14:34 ntp-4.2.6p5-28.el7.centos.src.rpm
2:先说一下软件包来源
本次打包原因是一部分服务器系统已经过了生命周期,官网已经不提供更新服务,那么就的找到旧版本的源码包打包成rpm方便升级。
于是我就到centOS官网地址去找src.rpm包:https://vault.centos.org/7.6.1810/os/Source/SPackages/
这个是centos的存档地址,里面存放了许多旧的源码包,这些包再新版本的系统中已经不存在了。
本次NTP源码包的完整下载地址是:https://vault.centos.org/7.6.1810/os/Source/SPackages/ntp-4.2.6p5-28.el7.centos.src.rpm
3:安装编译环境
安装相应的软件包
yum -y install vim wget rpm-build gcc make redhat-lsb-core libuuid-devel mock
然后创建一个用户,如果你不创建这个用户打包的时候就会出现
Warning: user mockbuild does not exist. using root
这样的警告,虽然不是报错,但是我测试创建这个用户就不会出现警告了。
useradd -s /sbin/nologin mockbuild
最后安装NTP服务所需要的依赖,因为我测试的时候出现了报下面这个缺少依赖,所以这提前安装依赖,如果你打包的时候还包缺依赖那报啥就你安装啥就行了。
yum install -y libcap-devel libedit-devel perl-HTML-Parser pps-tools-devel autogen autogen-libopts-devel libedit-devel.x86_64
error: Failed build dependencies:
libcap-devel is needed by ntp-4.2.6p5-28.el7.x86_64
libedit-devel is needed by ntp-4.2.6p5-28.el7.x86_64
perl-HTML-Parser is needed by ntp-4.2.6p5-28.el7.x86_64
pps-tools-devel is needed by ntp-4.2.6p5-28.el7.x86_64
autogen is needed by ntp-4.2.6p5-28.el7.x86_64
autogen-libopts-devel is needed by ntp-4.2.6p5-28.el7.x86_64
接下来添加用于编译src.rpm的用户
# useradd builder
把下载的ntp-4.2.6p5-28.el7.centos.src.rpm包放到该用户的家目录里面去:
[root@centos7 builder]# cp ntp-4.2.6p5-28.el7.centos.src.rpm /home/builder/
编译前看一下这个包的详细信息:
开始编译:直接生成rpm安装包
rpmbuild --rebuild --clean ntp-4.2.6p5-28.el7.centos.src.rpm
然后哔哩吧啦一堆东西,最后看到这说明成功了
可以看到,程序根据操作系统的架构,在 /home/builder/rpmbuild/RPMS/x86_64/ 目录下编译生成用于安装的rpm包。
就可以拿这些包去升级了
还有编译方式二:通过spec 文件,生成用于安装的rpm包
cd /home/builder/rpmbuild/SPECS/
rpmbuild -bb nginx.spec
细心的你可能会发现,咦,怎么和方式一生成安装用的rpm包方式一样?
其实不一样,相比方式一,在 rpmbuild -bb nginx.spec 之前,我们是可以编辑修改nginx.spec 之前,自定一些东西的,只是我们这里用的默认的nginx.spec文件而已,关于nginx.spec文件,不是本文的关注点,感兴趣可以查看相关文档。