在CentOS官方仓库中,即提供了二进制包,又提供了二进制的源码包。比如bind-9.9.4-74.el7_6.1.src.rpm与bind-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中还没有修复,可以到上游下载源码包: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