【src】怎样在Linux 上使用src.rpm源码包?

一、说明

如果我们是以软件包的格式来划分的,常见的Linux发行版主要可以分为两类,类ReadHat系列和类Debian系列,这两类系统分别提供了自己的软件包管理系统和相应的工具。

类RedHat系统中软件包的后缀是rpm,类Debian系统中软件包的后缀是deb。另一方面,类RedHat系统提供了同名的rpm命令来安装、卸载、升级rpm软件包,类Debian系统同样提供了dpkg命令来对后缀是deb的软件包进行安装、卸载和升级等操作。

rpm的全称是Redhat Package Manager,常见的使用rpm软件包的系统主要有Fedora、CentOS、openSUSE、SUSE企业版、PCLinuxOS以及Mandriva Linux、Mageia等,使用deb软件包后缀的类Debian系统最常见的有Debian、Ubuntu、Finnix等。


RPM这个软件管理的机制是由 Red Hat 这家公司发开发出来的, RPM 是以一种数据库记录的方式来将你所需要的软件安装到你的 Linux 系统的一套管理机制。

它最大的特点就是将你要安装的软件先编译过, 并且打包成为 RPM 机制的包装文件,通过包装好的软件里默认的数据库记录, 记录这个软件要安装的时候所依赖的软件,当在你的 Linux 主机进行安装时, RPM 会先依照软件里的数据查询 Linux 主机的依赖软件是否满足, 若满足则予以安装,若不满足则不予安装。那么安装的时候就将该软件的信息整个写入 RPM 的数据库中,以便未来的查询、验证与卸载!



这样一来的优点是:

1. 由于已经编译完成并且打包完毕,所以软件传输与安装上很方便 (不需要再重新编译)

2.  由于软件的信息都已经记录在 Linux 主机的数据库上,很方便查询、升级与卸载


但是这也造成些许的困扰,由于 RPM 文件是已经包装好的数据,也就是说, 里面的数据已经都『编译完成』了!所以,该软件文件几乎只能安装在原本默认的硬件与操作系统版本中。 也就是说,你的主机系统环境必须要与当初创建这个软件文件的主机环境相同才行! 

举例来说,rp-pppoe 这个 ADSL 拨接软件,它必须要在 ppp 这个软件存在的环境下才能进行安装!如果你的主机并没有 ppp 这个软件,那么很抱歉,除非你先安装 ppp 否则 rp-pppoe 就是不让你安装的 (当然你可以强制安装,但是通常都会有点问题发生就是了!)。

所以,通常不同的 distribution (发行版)所释出的 RPM 文件,并不能用在其他的 distributions 上。举例来说,Red Hat 释出的 RPM 文件,通常无法直接在 SuSE 上面进行安装的。更有甚者,相同 distribution 的不同版本之间也无法互通,例如 CentOS 6.x 的 RPM 文件就无法直接套用在 CentOS 7.x 。

因此,这样可以发现这些软件管理机制的问题是:

1.  软件文件安装的环境必须与打包时的环境需求一致或相当

2.  需要满足软件的相依属性需求

3.  卸载时需要特别小心,最底层的软件不可先移除,否则可能造成整个系统的问题


那怎么办?如果我真的想要安装其他 distributions 提供的好用的 RPM 软件文件时? 呵呵!还好,还有 SRPM 这个东西!SRPM 是什么呢?顾名思义,他是 Source RPM 的意思,也就是这个 RPM 文件里面含有源码。特别注意的是,这个SRPM 所提供的软件内容『并没有经过编译』, 它提供的是源码!

通常 SRPM 的扩展名是以 ***.src.rpm 这种格式来命名的。不过,既然 SRPM 提供的是原始码,那么为什么我们不使用 Tarball 直接来安装就好了?这是因为 SRPM 虽然内容是原始码, 但是他仍然含有该软件所需要依赖说明、以及所有 RPM 文件所提供的数据。同时,他与 RPM 不同的是,它也提供了参数配置文档 (就是 configure 与 makefile),所以如果我们下载的是 SRPM ,那么要安装该软件时,你就必须要:

1.  先将该软件以 RPM 管理的方式编译,此时 SRPM 会被编译成为 RPM 文件

2.  然后将编译完成的 RPM 文件安装到 Linux 系统当中

怪了,怎么 SRPM 这么麻烦呢!还要重新编译一次,那么我们直接使用 RPM 来安装不就好了?通常一个软件在发布的时候,都会同时发布该软件的 RPM 与 SRPM 。我们现在知道 RPM 文件必须要在相同的 Linux 环境下才能够安装,而 SRPM 既然是原始码的格式,自然我们就可以通过修改 SRPM 内的参数配置档,然后重新编译生成能适合我们 Linux 环境的 RPM 文件,如此一来,不就可以将该软件安装到我们的系统当中,而不必与原作者打包的 Linux 环境相同了?这就是 SRPM 的用处了!


为何说 CentOS 是『社群维护的企业版』呢?

 Red Hat 公司的 RHEL 发布后,连带会将 SRPM 发布出来。 社群的朋友就将这些 SRPM 收集起来并重新编译成为所需要的软件,再重复发布,成为 CentOS,所以才能号称与 Red Hat 的 RHEL 企业版同步啊!真要感谢 SRPM 哩!如果你想要理解 CentOS 是如何编译一支程序的, 也能够通过学习 SRPM 内含的编译参数,来学习的啊!


本文主要描述如何通过软件包的源代码src.rpm构建自己的rpm软件安装包。

 从软件运行的结构来说,一个软件主要可以分为三个部分:可执行程序、配置文件和动态库。当然还有可能会有相关文档、手册、供二次开发用的头文件以及一些示例程序等等,其他部分都是可选的,只有可执行文件是必须的。

 关于如何制作rpm软件包的方法,网上教程也一大堆,谈及最多的当属rpmbuild这个命令行工具。

rpm的打包流程相比deb的要稍微麻烦一些,因为它对打包目录有一些严格的层次上的要求。如果你的rpm的版本<=4.4.x,那么rpmbuid工具其默认的工作路径是/usr/src/redhat,这就使得普通用户不能制作rpm包,因为权限的问题,在制作rpm软件包时必须切换到root身份才可以。

从rpm从4.5.x版本开始,将rpmbuid的默认工作路径移动到用户家目录下的rpmbuild目录里,即$HOME/rpmbuild,并且推荐用户在制作rpm软件包时尽量不要以root身份进行操作,因为在制作RPM包的过程中,将会把软件编译和安装到系统中,这样可能会破坏系统。

二、实验环境

操作系统: CentOS7.x Minimal

编译安装软件:nginx-1.15.0-1.el7_4.ngx.src.rpm

虚拟机: xx.xx.xx.xx (能联网)

三、 安装编译环境

nginx源码都是用C/C++写的,所以需要在编译用的CentOS 7服务器上安装gcc和gcc-c++等相关软件包

安装常用工具

# yum -y install vim  wget

安装编译工具

# yum -y install rpm-build  gcc  make  redhat-lsb-core   libuuid-devel

安装nginx依赖包

#  yum -y install openssl openssl-devel libxml2-devel libxslt-devel perl-devel perl-ExtUtils-Embed libtool zlib zlib-devel pcre pcre-devel patch

添加用于编译src.rpm的用户

# useradd builder

四、用src.rpm编译生成nginx安装包

# wget  http://120.52.51.13/nginx.org/packages/mainline/centos/7/SRPMS/nginx-1.15.0-1.el7_4.ngx.src.rpm

# rpm -qpi   nginx-1.15.0-1.el7_4.ngx.src.rpm


#  cp  nginx-1.15.0-1.el7_4.ngx.src.rpm  /home/builder

#  su - builder

编译方式一:直接生成安装用的rpm安装包

 $ rpmbuild --rebuild --clean nginx-1.15.0-1.el7_4.ngx.src.rpm

$ ll  -R

可以看到,程序根据操作系统的架构,在 /home/builder/rpmbuild/RPMS/x86_64/ 目录下编译生成用于安装的rpm包。


编译方式二:生成源码包


$ rpm -ivh nginx-1.15.0-1.el7_4.ngx.src.rpm

$ ll -R

用root用户,对生成的 nginx-1.15.0.tar.gz 包做编译安装,这没什么好说的。


编译方式三:通过spec 文件,生成用于安装的rpm包

$ rpm -ivh nginx-1.15.0-1.el7_4.ngx.src.rpm

$ ll  -R

$ cd /home/builder/rpmbuild/SPECS/

$ rpmbuild -bb nginx.spec

$ /home/builder

$  ll  -R

细心的你可能会发现,咦,怎么和方式一生成安装用的rpm包方式一样?

其实不一样,相比方式一,在 rpmbuild -bb nginx.spec 之前,我们是可以编辑修改nginx.spec 之前,自定一些东西的,只是我们这里用的默认的nginx.spec文件而已,关于nginx.spec文件,不是本文的关注点,感兴趣可以查看相关文档。


总结一下:

src.rpm包的好处是,一定程度上跨平台,在类RedHat系列,如RedHat、Fedora、CentOS、openSUSE、SUSE企业版、PCLinuxOS以及Mandriva Linux、Mageia等操作系统上,不管哪个版本,下载某个软件的src.rpm包,编译成用于安装rpm包,那么就适配这个操作系统了。

如你将nginx-1.15.0-1.el7_4.ngx.src.rpm在 CentOS6.5上编译成安装用的rpm包,那么就可以在CentOS6.5上安装,如你将nginx-1.15.0-1.el7_4.ngx.src.rpm在 CentOS7.5上编译成安装用的rpm包,那么就可以在CentOS7.5上安装。

如果你将nginx-1.15.0-1.el7_4.ngx.src.rpm在CentOS6.5上编译成安装用的rpm包,在CentOS7.5上安装,基本不行!



五、安装nginx


$  su  -root  

# rpm -ivh /home/builder/rpmbuild/RPMS/x86_64/nginx-1.15.0-1.el7_4.ngx.x86_64.rpm

# nginx -V 2>&1 | sed 's/ --/\n--/g' | egrep --color '.*path.*|$'

#   rpm -qa --scripts nginx



# rpm -qi  nginx

你在哪台服务器上做的编译,包中获取了你的主机名。



# systemctl start nginx

# systemctl enable nginx

# systemctl status nginx




六、参考

软件安装: RPM, SRPM 与 YUM 功能

http://cn.linux.vbird.org/linux_basic/0520rpm_and_srpm.php#intro_whatisrpm


rpmbuild命令

http://man.linuxde.net/rpmbuild


rpmbuild制作rpm 包

https://blog.csdn.net/u012373815/article/details/73257754


一堂课玩转rpm包的制作

http://blog.chinaunix.net/uid-23069658-id-3944462.html


How to compile and install nginx1.15.3 on CentOS7

https://www.jianshu.com/p/1a83110786b1


玩转rpm包的制作

https://blog.csdn.net/weixin_37871174/article/details/79258383


Linux 安装.src.rpm源码包的方法

https://www.cnblogs.com/einyboy/archive/2012/09/13/2683015.html


CentOS 7内核源码包(kernel.src.rpm)的修改和打补丁编译

https://www.sulabs.net/?p=773


鸟哥的 Linux 私房菜:基础学习篇 第四版

https://wizardforcel.gitbooks.io/vbird-linux-basic-4e/content


修改、重新生成和安装src.rpm源码包

http://abcdxyzk.github.io/blog/2014/10/30/tools-src-rpm

https://haohetao.iteye.com/blog/684589


在 CentOS 下设置一个创建 RPM 的环境

https://wiki.centos.org/zh/HowTos/SetupRpmBuildEnvironment


Rebuild a Source RPM

https://wiki.centos.org/HowTos/RebuildSRPM

https://wiki.centos.org/zh/HowTos/RebuildSRPM


Redhat RPM Source Packages

https://aplawrence.com/BGarlock/rpm-bg.html


Linux : How to install source rpm on RHEL/CentOS

https://www.itechlounge.net/2012/12/linux-how-to-install-source-rpm-on-rhelcentos/

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 203,937评论 6 478
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,503评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 150,712评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,668评论 1 276
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,677评论 5 366
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,601评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,975评论 3 396
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,637评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,881评论 1 298
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,621评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,710评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,387评论 4 319
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,971评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,947评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,189评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 44,805评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,449评论 2 342