「CentOS」- 重新构建RPM源码包

在CentOS官方仓库中,即提供了二进制包,又提供了二进制的源码包。比如bind-9.9.4-74.el7_6.1.src.rpmbind-9.9.4-74.el7_6.1.rpm这两个软件包。我们平时安装的是bind-9.9.4-74.el7_6.1.rpm,而bind-9.9.4-74.el7_6.1.src.rpm是生成bind-9.9.4-74.el7_6.1.rpm的材料。

我们所说的“重新构建RPM源码包”,就是使用.src.rpm生成.rpm的过程。在这个过程中,我们可以修改.src.rpm生成我们想要的.rpm包。

为什么要重新构建?

重新构建的原因有以下几个:

安装CentOS仓库中不可用的包,或者安装一个在CentOS中不可用的包。

如果包在CentOS中不可用,那你也应该尝试构建一个RPM包。因为包管理器带来的好处将抵消你构建包的工作。相比源码安装,使用包管理由很多的好处。

仓库中的包不满足需求。比如没有某些编译选项,而缺少某些功能。

是否需要重新构建?

官方的包提供了相关的邮件列表,问题追踪,安全更新等等。在重新构建前,应该先考虑是否有已经存在的软件包。

一旦构建了软件包,还有管理后期的安全更新等等相关的问题。

# 获取源码包

不是每个源码包那到系统中就可以成功构建。源码在所属的发行版上是一定可以构建成功的。但是如果版本相差太远,或者衍生版的差异太大,又或者其他的种种因素,都有可能导致构建的失败。

当你构建一个源码包时,如果需要升级系统的核心包,那你最好是找一个旧的源码包。而且不要用重新构建的方式升级核心包。因为这些操作可能会破坏系统。

方法一:到仓库中下载

如果修复修复了问题,但是CentOS中还没有修复,可以到上游下载源码包:http://ftp.redhat.com/pub/redhat/linux/enterprise/

在CentOS中使用的源码包:http://vault.centos.org/

使用wget或者浏览器等工具进行下载即可。尽量不要让在RPM构建树目录中,因为构建生成的新文件可能会覆盖你下载的包。

方法二:使用yumdownloader命令

安装yumdownloader命令:yum install -y yum-utils

下载源码包:yumdownloader --source "bind"

# 附加说明

!!!构建成功的包不保证可以在任何其他的发行版中运行成功。也不要把其他发行版中构建包安装到不同的发行版中,这些操作都由可能破坏系统。

# 准备构建环境

有关RPM构建环境的搭建,参考「设置RPM构建环境」一文。

# 安装构建源码包的依赖

安装源码依赖,源码包可能依赖某些库和头文件,需要手动安装。

可以使用yum-builddep命令来安装包的依赖:yum install -y yum-utils

例如,安装bind包的依赖:yum-builddep "bind"

# 方法一、快速构建源码包

可以快速构建和安装源码包,参考「使用源码包开始安装」一文。

# 方法二、安装SRPM包,并从Specfile中构建

另外一种构建方法是,先安装SRPM包,然后使用specfile进行构建。

安装SRPM包

先安装SRPM包:rpm -i foo.src.rpm

如果安装过程中出现MD5 sum mismatch类似的错误,可以指定--nomd5选项:rpm --nomd5 -i foo.src.rpm

查看SRPM包的内容:rpm -qpl foo.src.rpm

安装完成后,specfile将保存在~/rpmbuild/SPECS目录中,文件后缀为.spec。包含在SRPM中的其他文件将保存在~/rpmbuild/SOURCES目录中(通常是源码和patch文件)。

使用spec文件构建

使用~/rpmbuild/SPECS中的spec文件进行构建:rpmbuild -ba mypackage.spec

# 总结

使用这种方法可以对包进行一些修改。大致的流程如下:

cd ~/rpmbuild/SPECS/

rpmbuild -bp mypackage.spec # 准备源码,通常是应用patch文件

cd ~/rpmbuild/BUILD/

cp existing_directory existing_directory.orig

cd existing_directory

find the file you wish to change, modify it.

cd ~/rpmbuild/BUILD/

diff -Npru existing_directory.orig existing_directory > name_of_your_patch_file.patch

cp name_of_your_patch_file.patch ~/rpmbuild/SOURCES/

cd ~/rpmbuild/SPECS/

edit the mypackage.spec file to add the definition of name_of_your_patch_file.patch and the application of your_patch_file -- please look in the file to see how that is done.

rpmbuild -ba mypackage.spec

具体的细节,还要阅读更多官方的文档和资料。

参考文献

Rebuild a Source RPM
Working with Source RPMs