开发者社区> 技术小胖子> 正文
阿里云
为了无法计算的价值
打开APP
阿里云APP内打开

Linux-什么是二进制包,源码包,RPM包,软件仓库

简介:
+关注继续查看

博文说明【前言】:

    本文将通过个人口吻介绍什么是二进制包,RPM包,源码RPM包(SRPM包),源码包,以及RPM常用命令,源码rpm的安装(*.src.rpm),源码包的安装步骤知识(./configure,make,make install)相关知识。

     在目前时间点【2017年6月12号】下,所掌握的技术水平有限,可能会存在不少知识理解不够深入或全面,望大家指出问题共同交流,在后续工作及学习中如发现本文内容与实际情况有所偏差,将会完善该博文内容。


本文参考文献引用链接:

1、http://man.linuxde.net/rpm
2、http://blog.csdn.net/simplekaizai/article/details/70055719
3、http://blog.csdn.net/u014242496/article/details/51645812【rpm包格式】
4、http://www.2cto.com/os/201501/366397.html
5、http://blog.csdn.net/u010154760/article/details/45955857【推荐,必看】
6、https://my.oschina.net/weiweiblog/blog/488919【源码包三步讲解】
7、http://www.cnblogs.com/einyboy/archive/2012/09/13/2683015.html【讲解安装src.rpm】
8、https://yq.aliyun.com/articles/43220【如何将源码包制作成RPM包】 后期新写一篇博文
9、http://www.gkstk.com/article/wk-78500000726568.html【Linux软件包管理基本操作命令入门】
10、http://studys.blog.51cto.com/9736817/1608958【必看,软件仓库讲解】
11、http://os.51cto.com/art/201109/291547.htm



正文:

从事Linux运维工作的小伙伴们必须要和软件安装打交道,我们知道将软件安装到服务器上有多种方法,比如源码包方式单独安装(一般格式为xx.tar.gz),rpm包形式单独安装(一般格式为xx.rpm),通过Linux发行版本提供的软件包管理软件进行安装(例如RHEL和Centos的yum,SUSE的yast和zypper,ubuntu的apt等等),那么我们安装的这些软件包有什么区别呢。


在Linux中,我们将软件包分为三种类型,分别是二进制包、RPM包、源码包。


一:二进制包

1、概念:

二进制包是软件包的一种形式,二进制包是已经经过编译,可以马上运行的程序软件包。你只需要下载和解包(安装)它们以后,就马上可以使用。软件包的内容是01二进制代码(一般以16进制显示),也就是说,这些文件是计算机能直接识别的(计算机只能识别处理01二进制)


2、格式:

格式1:xxxx-devel-6b-33.x86_64.rpm格式(rpm -ivh安装之后能直接使用),

格式2:mysql-5.5.32-linux2.6-x86_64.tar.gz格式(tar -zxvf解压之后就能直接使用),这里注意和源码包的区别,二进制格式的包名字很长,一般都会带有版本号、适应平台、适应的硬件类型等,而源码格式仅仅就是一个版本号的tar包,例如httpd-2.4.25.tar.gz。   


我们一般说的二进制包其实默认指的就是RPM包,也就是说二进制包包含RPM包,RPM包是二进制包的一个子集
 

3、特性:

我们可以使用UE编辑器,打开/bin下的文件查看,打开Windows中的.exe文件查看,打开rpm包查看,你会发现,这些文件的内容都是01二进制代码(一般以16进制显示),也就是说,这些文件是计算机能直接识别的(计算机只能识别处理01二进制)



二:RPM包


1、概念:

在一个操作系统下,需要安装实现各种功能的软件包。这些软件包一般都有各自的程序,但是同时也有错综复杂的依赖关系。同时还需要解决软件包的版本,以及安装,配置,卸载的自动化问题。为了解决这些问题,RedHat针对自己的系统提出了一个较好的办法来管理成千上百的软件。这就是RPM管理系统。在系统中安装了rpm管理系统以后,只要是符合rpm文件标准的打包的程序都可以方便的安装,升级,卸载


也就是说rpm原本是Red Hat公司专门用来管理Red Hat的Linux发行版本的各项程序套件的管理程序,由于它遵循GPL规则且功能强大方便,因而广受欢迎。逐渐受到其他Linux发行版本的采用。RPM套件管理方式的出现,让Linux易于安装,升级,间接提升了Linux的适用度。
而yum(Yellowdog Update  Manager)是RPM的前端工具,是基于RPM的一个管理工具,他能自动的解决安装rpm包产生的依赖关系。

RPM包也就是二进制包的一种,rpm包很好区分,以rpm结尾的一般都是rpm包
注意:RPM分为两种,分别是:package和srcpackage,也就是binary rpm和source rpm;前者是已经编译好的二进制包,可以直接安装使用,而后者是包含了源代码的rpm包,需要重组rebuild之后才可以安装使用,其实从严谨的角度上来说,*.src.rpm算是特殊的源码包,特殊在它能直接生成rpm包

2、格式:

格式1:name-version-release.arch.rpm

格式2:name-version-release.arch.src.rpm


name:表示包的名称,包括主包名和分包名
version:表示包的版本信息
release:用于标识rpm包本身的发行号,可还包含适应的操作系统
arch:表示主机平台,noarch表示此包能安装到所以平台上面
i386指这个软件包适用于intel 80386以上的x86架构的计算机(AI32)
i686指这个软件包适用于intel 80686以上(奔腾pro以上)的x86架构的计算机(IA32)
noarch指这个软件包于硬件架构无关,可以通用。    

i686软件包的程序通常针对80686及以上CPU进行了优化,所以,通常可以向前兼容,但是不支持向后兼容。而i386的包在x86机器上都可以用,支持向前兼容。不过现在的计算机,奔腾pro以下的CPU已经很少用,通常配置的机器都使用i686软件包,也就是说我们认为i686的效率会更高
总结下就是说i686软件包不能在i386平台上运行,而i386的软件包没有限制,可以在任何平台上运行使用

可能会有人会向前向后兼容不太清楚,解释一下:

向后兼容=向后看,向历史兼容,也就是现在的新版本能读取运行旧版本的数据,例如win10能向后兼容win7的软件,win7能向后兼容win xp的软件,office 2016能够打开office2010的文件,64位的CPU能够向后兼容处理针对32位CPU所开发的32位应用程序

向前兼容=向前看,向新版本或新数据兼容,向新事物兼容,或者说新版本生成的数据,能够在旧版本上运行处理,例如针对32位CPU开发的应用程序不能再64位CPU上运行,那么这里这个应用程序就是向前不兼容,如果假设能运行,那么就是向前兼容的,office 2007能够处理office 2016产生的数据,我们就说是向前兼容

示例:
gd-devel-2.0.35-11.el6.x86_64.rpm
gd是这个包的主包名,devel是这个包的分包名,     
2.0.35是表示版本信息,2为主版本,0为此版本,35为修订号,
11.el6中的11是表示发行号,el6表示是RHEL6,
x86_64是表示包适合的平台,如果是noarch这表示与平台无关

3、特性:
RPM包优点:
1)RPM包管理简单,只需要通过几个简单的命令就可以实现软件包的安装升级卸载和查询
2)安装速度比源码包形式快(源码包主要是make编译花费时间较长)
RPM包缺点:
1)RPM包是事先已经经过编译的二进制包,可以直接安装使用,因此无法再看到源码
2)如上所述,功能已经被固定,无法灵活的删除或新增功能
3)RPM包存在很强的依赖性,大部分RPM包的顺利安装需要安装很多个依赖RPM包
4)卸载软件包的时候,如果不小心,会卸载涉及到依赖关系,很有可能就会卸载移除掉系统所需软件,导致系统奔溃

对于已经编译成二进制的rpm包,由于操作系统环境不同,一般不能混用。
但是以src.rpm形式发行的软件包,由于需要安装时进行本地编译,所以通常可以在不同系统下安装。


【补充】:源码rpm包(*.src.rpm)和下文所说的tar包形式的源码包有什么区别,以及如何安装*.src.rpm?

解释:

1、tar包形式包含的内容是明文可见的源代码,如果有足够的能力,可以自行修改源代码,并且在安装的时候可以自由选择要安装的所需功能(./configure中的各种参数),并且卸载移除的时候也比较方便

2、源码rpm包即*.src.rpm结尾的这类软件包是包含了源代码的rpm包,使用rpm -ivh来进行安装,生成源程序和SPEC文件,能够直接生成RPM包,而tar形式源码包是不支持生成RPM包的。针对src.rpm文件,我们有两大种安装方式。


源码rpm包(*.src.rpm)的安装:


1)、将rpm文件移动到指定目录下执行,这里是移动到/usr/src/packages/SRPMS目录(SUSE系统)下,使用重组命令rpmbuild --rebuild --clean setarch-1.3-1.src.rpm,将源代码直接编译成普通的二进制rpm包.执行之后可以到/usr/src/packages/RPMS/x86_64目录下找到可用的二进制rpm包setarch-1.3-1.x86_64.rpm进行安装。
重组命令:rpmbuild --rebuild *.src.rpm 或者 rpm --rebuild *.src.rpm 或者 rpm --recompile *.src.rpm)

示例(以SUSE系统安装setarch-1.3-1.src.rpm为例):
suse11sp3-1:~ # cp setarch-1.3-1.src.rpm /usr/src/packages/SRPMS/
suse11sp3-1:~ # cd /usr/src/packages/SRPMS/
suse11sp3-1:/usr/src/packages/SRPMS # rpmbuild --rebuild --clean setarch-1.3-1.src.rpm
suse11sp3-1:/usr/src/packages/SRPMS # cd ../RPMS/x86_64
suse11sp3-1:/usr/src/packages/RPMS/x86_64 # rpm -ivh setarch-1.3-1.x86_64.rpm


2)、在非指定目录下直接执行rpm -ivh *.src.rpm,切换至/usr/src/packages/SPECS目录下,执行rpmbuild命令执行spec文件,具体使用什么参数控制生成源码包还是rpm包,请自行选择(-ba参数可以同时生成tar.gz格式的源码包以及rpm包,-bp是只生成tar.gz格式源码包,-bb是只生成二进制格式rpm包,并且默认的rpmbuild为i386平台,如果软件包是i686平台软件包,则需指定到别的平台,指定参数为--target=i686)
注释:直接执行rpm -ivh *.src.rpm之后实际会生成*.tar.gz的源码包和spec文件,其他文件(例如rpm包等)需要执行其他命令生成。

示例(以SUSE系统安装setarch-1.3-1.src.rpm为例):
suse11sp3-1:~ # rpm -ivh setarch-1.3-1.src.rpm 
suse11sp3-1:~ # cd /usr/src/packages/SPECS

suse11sp3-1:/usr/src/packages/SPECS # rpmbuild -bb [–target=i686] setarch.spec  #这里是直接生成RPM包(-bb参数)
suse11sp3-1:/usr/src/packages/SPECS # cd ../PRMS/x86_64
suse11sp3-1:/usr/src/packages/RPMS/x86_64 # rpm -ivh setarch-1.3-1.x86_64.rpm
or
suse11sp3-1:/usr/src/packages/SPECS # rpmbuild -bp [–target=i686] setarch.spec  #这里是直接生成源码包(-bp参数)
suse11sp3-1:/usr/src/packages/SPECS # cd ../BUILD/your-package
suse11sp3-1:/usr/src/packages/BUILD/setarch-1.3 # ./configure
suse11sp3-1:/usr/src/packages/BUILD/setarch-1.3 # make
suse11sp3-1:/usr/src/packages/BUILD/setarch-1.3 # make install 


三:源码包

1、概念:

源码包是Linux中软件包的另一种形式,需要在计算机上进行编译以后才可以产生可以直接运行的二进制程序。源代码包里面包括了程序的程序代码,一般就是我们能认识的C语言文件,因此在安装源码包的时候通常会检索系统中是否正确安装gcc编译器,并且源代码安装的时间会比较长。

源码包一般的安装过程是:
1)、解压、
2)./config、
3)make、
4)make install、
5)

ln -sv /usr/local/xxx/lib/xxx  /usr/lib64/xxx  【动态链接库文件较少的情况下】或者

vim /etc/ld.so.conf   文件末尾追加/usr/local/xxxx/lib,保存退出后执行ldconfig 【建议这种方式】

6)vim /etc/profile,文件末尾添加PATH=/usr/local/xxx/bin:$PATH,然后 source /etc/profile

2、格式:

*.tar.gz、*.tgz、*.bz2

源码包的格式一般是一个版本号的tar包,例如httpd-2.4.25.tar.gz,文件名包含信息没有上述提到的二进制包多

3、特性:
tar包形式的源码包包含的内容是明文可见的源代码,如果有足够的能力,可以自行修改源代码,并且在安装的时候可以自由选择要安装的所需功能(./configure中的各种参数)及路径等,并且卸载移除的时候也比较方便。 建议在安装线上的生产服务器软件包时都用源码安装,这是因为源码安装可以自行调整编译参数,能够最大化地定制安装结果。
但是使用源码包也存在一些缺点不足,例如:
1)安装过程步骤过多,尤其安装较大及较多软件时,添加各种参数时容易出现问题
2)编译时间较长,执行make编译的时间通常较长,一会都会比安装二进制包时间长
3)因为编译手动安装,涉及系统环境比较复杂,可能会出现各种问题,一旦出现问题,新手很难解决(一般都会出现问题)

【补充】:./configure、make、make install等概念讲解

./configure
1)、定义需要的功能选项
2)、检测系统环境是否符合安装要求
3)、把定义好的功能选项和检测环境系统信息都写入Makefile文件,用于后续的编辑
注意1:每个源码包都会有configure命令,就算极个别没有这个命令也会用其他的命令取代(例如openssl的./config)
注意2:执行过./configure之后,会生成Makefile文件,make和make install都是依赖这个文件进行编译安装的

make
1)将源码包翻译成机器能识别的语言(也就是将源代码-->可执行的二进制文件,类似生成Windows中的.exe可执行文件)
2)一旦编译出错,需要修改之后再次编译,请使用make clean,清除之前的编译产生的缓存文件。
注意:这一步执行时间一般是最长的。

make install
1)真正的安装(例如在windows中执行qq.exe或者wechat.exe安装qq和微信到电脑)
2)一旦这步出错,需要执行make clean,并删除对应的目录(例如./configure使用--prefix参数指定安装到/usr/local/openssl,则需要删除该目录)


四:软件源/软件仓库(repository)


1、概念:

软件源,顾名思义就是软件的来源,软件的来源就是存放各种软件包的软件仓库或者官方发布的ISO文件,其中包含各种应用软件。


多数Linux发行版都有自己的软件安装、配置方案,同时还有各自的软件包管理系统。为了省去用户四处寻找合适软件安装包的麻烦,这些发行版将常用的软件集中到一个服务器上,并为用户提供了自动下载、安装软件的接口,这就是我们所说的“软件仓库”。为了方便大众访问,人们为这些软件仓库建立了大量的“镜像”,使世界各地的用户都能方便地使用。不同发行版的软件仓库一般不同,如用户接口各异、软件丰富程度不同、镜像分布不同等等


软件仓库管理软件,例如yum和zypper,配置文件格式为*.repo,可以在仓库中自动地定位并获取正确的RPM软件包。多数Linux发行版都有自己的软件安装、配置方案,同时还有各自的软件仓库管理系统,例如RHEL的yum,suse的zypper,Debian和Ubuntu的apt。


2:、格式:

软件仓库有几种类型:

1)、在线网络访问获取方式,包含各类软件的二进制包或者源码包,可以自定义软件种类及数量,软件仓库的获取方式可以是http、FTP、nfs等,一般官方也会提供这种软件仓库。

2)、离线本地访问获取方式,官方发行版本的离线ISO文件,内部包含的软件都是经过筛选的,挂载出来后也可以称之为是一个软件仓库

软件仓库的的配置文件格式一般是:*.repo(RHEL的yum,SUSE的zypper)


3、特性:

软件仓库中包含的不止只有软件包,还有其他信息(软件包的信息,位置信息,软件包的依赖关系,索引文件等),就好比我们实际生活中的图书馆,不可能把书塞进去就可以,我们会有一个表格,详细记录每本书的摘要信息(作者,发表时间,国家等),所属类别,所在位置等信息,以后就可以快速的检索到该书

在Linux操作系统中,软件包的安装其实是文件的拷贝,即把软件所用的各个文件拷贝到特定目录。当然RPM安装软件包,也不例外。但RPM更“先进”一些,因为它在安装前,还会执行检查软件包的依赖(Dependency)、检查软件包的冲突(Conflicts)。最后才将软件包里面的相关文件解出并存放到相应位置。也就是说软件仓库中包括了所有RPM包的头信息(header)描述,比如依赖性等。客户端使用例如yum等仓库管理软件在安装的时候就会去下载header文件并加以分析,这样才能自动地从服务端下载相关软件,并正确地完成安装任务。

注意:Linux软件包的基本组成部分通常有:共享库、应用程序、依赖关系,服务和文档。对软件包的使用和管理被称为包管理。


五:补充知识点

1、软件包卸载:

1)源码包卸载:直接删除安装目录即可,不会残留任何垃圾,如果创建了软链接及编辑了额外文件请自行记录移除。
2)RPM包卸载:rpm -e 软件名(注意,这里不要带.rpm,带的是安装后系统显示的软件名)
不过RPM卸载软件包的时候,如果不小心,会卸载涉及到依赖关系,很有可能就会卸载移除掉系统所需软件,导致系统奔溃,所以卸载的时候务必小心




结尾:


     感谢阅读,祝有收获的一天,谢谢!




      本文转自1清风揽月1  51CTO博客,原文链接:http://blog.51cto.com/watchmen/1934608,如需转载请自行联系原作者





版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。

相关文章
7.1 Linux软件包
Linux下的软件包众多,且几乎都是经 GPL 授权、免费开源(无偿公开源代码)的。这意味着如果你具备修改软件源代码的能力,只要你愿意,可以随意修改。
38 0
linux|rpm命令安装软件包
1、cd配置centos的ISO文件 image.png 2、挂载cdrom [root@localhost Packages]# mount /dev/cdrom /media 3、利用wc统计一下rpm按照包的个数 image.png 查看某文件是否安装 [root@localhost Packages]# rpm -qa | grep yp-tools image.png 参数说明: -q 表示查询 --query -a --all -f,--file FILE 查询结果为空表示此文件没有安装。
941 0
linux软件卸载
 linux系统可不像windows那么方法可以直接在控制页面中或程序管理中删除不要的软件了,在linux中必须使用命令方式来删除软件。一、RPM包安装的软件  1、确定软件版本  rpm -qa|grep softname*  softname为软件名称,不确定部分可使用*通配符。接着就会有相关的软件包列表。  2、卸载软件包  rpm -e softname_version  softna
966 0
制作Linux RPM包
    RPM是Redhat Package Manage的缩写。透过RPM的管理,使用者可以把Source Code包装成一种Source和Binary的档案形式。
860 0
21114
文章
0
问答
文章排行榜
最热
最新
相关电子书
更多
低代码开发师(初级)实战教程
立即下载
阿里巴巴DevOps 最佳实践手册
立即下载
冬季实战营第三期:MySQL数据库进阶实战
立即下载