自行构建RPM包
CentOS最容易被人诟病的一个问题便是软件包过于陈旧,经常无法使用某些实用的新特性,当然这也是为了稳定而做的考虑。为了使用某些新特性,有时候我们不得不重新编译新版本的软件以使用,而当你需要在多台服务器上重新部署时,这就显得非常麻烦。一个好的办法便是自行构建一个RPM包,然后通过RPM仓库的形式分发,如此每台服务器便可使用基于RPM的包管理软件yum/dnf,安装管理新版本软件包。
预备知识
RPM包结构
在我们自行构建RPM包前,我们必须一个了解一个RPM包中包含哪些东西。我们可以使用yumdownloader
命令下载一个RPM包。
1 |
yumdownloader wget |
接下来我们来查看一下RPM包里的内容。
1 |
rpm -qpl wget-1.14-18.el7_6.1.x86_64.rpm |
RPM看起来就是一个压缩包,在安装的时候将包内容解压至正确的目录。你可以使用rpm2cpio wget-1.14-18.el7_6.1.x86_64.rpm | cpio -div
命令,验证上述内容。
RPM与SRPM
在我们了解了RPM包结构后,还有一个需要注意的地方,就是SRPM包(.src.rpm后缀的包),如果用一句话来解释两者,那么我想便是源代码和可执行文件的区别。
在每一个SRPM包中,都有一个至关重要的.spec
文件,这个文件就相当于C++的Makefile
或者Docker的Dockerfile
,用于指示如何构建、安装、卸载这个RPM包。
编译目录结构
下载一个SRPM包并安装。将会在家目录下生成一个rpmbuild
目录,该目录的目录结构如下:
1 |
yumdownloader --source wget |
其中SOURCES
目录用于存放编译RPM包时所用的源码,SPECS
目录用于存放.spec文件。
SPEC文件编写
关于如何编写SPEC文件,建议参考别的RPM包是如何编写SPEC文件的,每个SRPM包中都会包含用于构建的SPEC文件。另外,阅读官方手册,可能是一个较好的理解方式。
构建RPM包
构建RPM包前,我们必须先安装rpmbuild
命令,并创建一个用于构建的用户。
1 |
yum -y install rpm-build |
直接使用rpmbuild命令指向SPEC文件构建RPM包。其中-ba
参数表示同时构建RPM包和SRPM包,你也可以使用-bb
或者-bs
参数单独构建RPM包或SRPM包。
1 |
rpmbuild -ba some.spec |
再一次查看rpmbuild目录结构。其中BUILD
目录存放解压的源码,BUILDROOT
目录是编译后安装的根目录,RPM打包时,以此为根目录,RPM
目录存放生成的rpm文件,SRPMS
目录存放生成的.src.rpm文件。
1 |
cd ~/rpmbuild |