自行构建RPM包
CentOS最容易被人诟病的一个问题便是软件包过于陈旧,经常无法使用某些实用的新特性,当然这也是为了稳定而做的考虑。为了使用某些新特性,有时候我们不得不重新编译新版本的软件以使用,而当你需要在多台服务器上重新部署时,这就显得非常麻烦。一个好的办法便是自行构建一个RPM包,然后通过RPM仓库的形式分发,如此每台服务器便可使用基于RPM的包管理软件yum/dnf,安装管理新版本软件包。
预备知识
RPM包结构
在我们自行构建RPM包前,我们必须一个了解一个RPM包中包含哪些东西。我们可以使用yumdownloader
命令下载一个RPM包。
yumdownloader wget
ls
> wget-1.14-18.el7_6.1.x86_64.rpm
接下来我们来查看一下RPM包里的内容。
rpm -qpl wget-1.14-18.el7_6.1.x86_64.rpm
> /etc/wgetrc
> /usr/bin/wget
> /usr/share/doc/wget-1.14
> /usr/share/doc/wget-1.14/AUTHORS
> /usr/share/doc/wget-1.14/COPYING
> /usr/share/doc/wget-1.14/MAILING-LIST
> /usr/share/doc/wget-1.14/NEWS
> /usr/share/doc/wget-1.14/README
> /usr/share/doc/wget-1.14/sample.wgetrc
> /usr/share/info/wget.info.gz
> /usr/share/locale/**/LC_MESSAGES/wget.mo
> /usr/share/man/man1/wget.1.gz
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
目录,该目录的目录结构如下:
yumdownloader --source wget
rpm -ivh *.src.rpm
cd ~/rpmbuild
tree
> .
> ├── SOURCES
> │ └── many wget source file
> └── SPECS
> └── wget.spec
其中SOURCES
目录用于存放编译RPM包时所用的源码,SPECS
目录用于存放.spec文件。
SPEC文件编写
关于如何编写SPEC文件,建议参考别的RPM包是如何编写SPEC文件的,每个SRPM包中都会包含用于构建的SPEC文件。另外,阅读官方手册,可能是一个较好的理解方式。
构建RPM包
构建RPM包前,我们必须先安装rpmbuild
命令,并创建一个用于构建的用户。
yum -y install rpm-build
useradd builder
直接使用rpmbuild命令指向SPEC文件构建RPM包。其中-ba
参数表示同时构建RPM包和SRPM包,你也可以使用-bb
或者-bs
参数单独构建RPM包或SRPM包。
rpmbuild -ba some.spec
再一次查看rpmbuild目录结构。其中BUILD
目录存放解压的源码,BUILDROOT
目录是编译后安装的根目录,RPM打包时,以此为根目录,RPM
目录存放生成的rpm文件,SRPMS
目录存放生成的.src.rpm文件。
cd ~/rpmbuild
tree
.
├── BUILD
│ └── Some source file
├── BUILDROOT
├── RPMS
│ └── x86_64
│ └── some.x86_64.rpm
├── SOURCES
│ └── some.tar.gz
├── SPECS
│ └── some.spec
└── SRPMS
└── some.src.rpm