自行构建RPM包

  CentOS最容易被人诟病的一个问题便是软件包过于陈旧,经常无法使用某些实用的新特性,当然这也是为了稳定而做的考虑。为了使用某些新特性,有时候我们不得不重新编译新版本的软件以使用,而当你需要在多台服务器上重新部署时,这就显得非常麻烦。一个好的办法便是自行构建一个RPM包,然后通过RPM仓库的形式分发,如此每台服务器便可使用基于RPM的包管理软件yum/dnf,安装管理新版本软件包。

预备知识

RPM包结构

  在我们自行构建RPM包前,我们必须一个了解一个RPM包中包含哪些东西。我们可以使用yumdownloader命令下载一个RPM包。

1
2
3
yumdownloader wget
ls
> wget-1.14-18.el7_6.1.x86_64.rpm

  接下来我们来查看一下RPM包里的内容。

1
2
3
4
5
6
7
8
9
10
11
12
13
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目录,该目录的目录结构如下:

1
2
3
4
5
6
7
8
9
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命令,并创建一个用于构建的用户。

1
2
yum -y install rpm-build
useradd builder

  直接使用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
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
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

后续阅读