什么是包(Packages),为什么要管理它们
要回答这个问题,我们需要回到三个最基本的问题上面来:
计算机
数据
程序
计算机需要获取数据和程序来做它应当做的事情,把数据和程序交给计算机,意味着把它们放进计算机的大容量存储里,现在,这又意味着放进硬盘里。数据和程序将会在硬盘里以文件的形式被存储。
而数据,数据不仅需要空间去存储它,更重要的是,它需要以程序能处理的格式存储。
最后,谈一谈程序,程序和数据一样,也需要一定的存储空间,但对于程序来说,以下几点更为重要:
程序可能需要数据才能运行,这些数据必须格式正确、命名规范,并且存储在硬盘中某个合适的位置以便程序能够访问它。
程序可能需要配置文件,这些配置文件能够控制程序的行为,使程序表现出定制化的行为。
程序在硬盘上也需要工作空间,其次,程序也像数据一样,需要有一个合适的命名,并且存放在硬盘中合适的位置。
程序也有可能需要依赖其他的程序。
尽管一个程序的正常运行并不需要文档参与,但带有说明文档的程序,能以人类容易阅读的方式让使用者了解程序的使用方法。
现在想一想,当我们需要在电脑上安装软件时,我们可能采取的方式可能有以下两种:
阅读程序的文档,把程序,配置文件,以及数据拷贝到你的电脑上,确保它们的命名规范,并且放在了硬盘上的合适位置,而且,硬盘有足够的空间来放下这些东西。接下来,按你的意愿修改一下配置文件,最后,运行程序。
让电脑为你做这些事。
如果你觉得第一种方式还OK啊,可以接受。但是你有没有想过你需要同时追踪多少个文件,在Linux系统中,一个程序有超过两万个文件是很正常的事情,有大量的文档需要你去阅读,大量的文件需要拷贝,还有配置。而且,当你想要更新软件版本的时候,你要怎么办?凡此种种,不一而足。
有些人会觉得第二种方式最简单啦:让电脑为你做这些事。RPM的出现,就是为了满足这些人的期待!
走进“包(Packages)”
计算机能像赶鸭子一样,很好地管理2万个以上的文件,这也是包管理软件擅长做的。不过,说了这么久,到底什么是包?
计算机眼中的包和我们日常生活中见到的包,其实是相似的,它们都能够把一些相关的东西放在同一个地方。在它们被使用前,它们都需要先被“打开”,在包上可以贴一个标签,以说明它里面装的是什么东西。
一般,包管理系统会把各种不同的文件,包括程序,数据,文档和配置信息,全部打包在一个特定格式的文件里,这个文件就叫一个包文件。以RPM为例,这个包文件叫做“package”,“.rpm文件”,或者直接就叫“RPM”,名字不同,但其实代表的是一样东西。一个包,包含了RPM安装所需要的所有东西。
一个rpm包通常包含下面这些类型的软件:
一系列只有单个任务的程序集合,通常也叫作“应用(Application)”,比如说字符处理程序,或者是一门编程语言。
操作系统的一个特定部分,例如,操作系统启动时的初始化脚本,或一个特别的命令行SHELL,或者是一个支持web服务器的软件。
使用包的好处
使用包的一个最明显的好处是包是作为一个整体被管理的,如果需要移动该包,只需要移动整个包,而不用担心会漏掉某些文件,尽管这是一个最明显的好处,但是却不是最大的好处。
使用包的最大的好处是,包本身携带了它应该如何被安装的信息。不仅可以携带安装的步骤信息,也可以携带卸载所需要的步骤信息。
管理你的包吧,不然你会被它管理。
尽管包的使用已经降低了软件安装的复杂度,但它还是做不到不用你任何的参与就能做到安装,卸载。跟踪哪些包已经安装在你的系统上了,这是件很必要的事情,特别是当你所要安装的包依赖于其他包时。
包的管理也需要你动手
你会发现,你对包的管理很可能就是在做以下这些事:
安装新的包。
更新包。
卸载包。
你需要总是做这些事情,也会很容易就无法对包的信息进行跟踪和掌握。你应该知道些什么有关于包的信息呢?
跟踪并管理包
很显然,你一定十分渴望看看在自己的操作系统上有哪些包已经安装了。
如果能获得你指定的某个包的信息,那就更好了。这些信息包括了从包开始安装的时间开始到一大串文件被安装结束。
能够通过多种方式获得包的信息也是激动人心的,技能找出一个包安装了什么文件,也能找出哪些包安装了某个特定的文件。
也应该能够查看一个包现在的安装方式和它之前的安装方式有何不同,误删文件是一件很平常的事,如果包管理器能够告诉你缺失了哪些文件,那么就能让你的软件正常运作起来。
配置文件包含的信息也让人很头疼,如果能够多注意这些配置文件,保证配置的改变不会丢失,那么,生活就会更愉悦了。
包管理,应该怎么做?
前文为你描述了一个美好的愿景:包管理,能够让你更容易安装、更新和删除包;以多种方式查看包的信息;确保正确安装了包;甚至追踪配置文件的改动。但是,你要怎么做到这些呢?
前文也已经提过,最好的方式去做这些事就是让你的电脑帮你做。很多公司和组织已经开发了包管理系统。包管理系统主要有两种实现方式:
- 一些包管理系统关注的是使用包的步骤。
- 另外一些包管理系统关注的是包所涉及的文件,并对这些文件进行修改追踪。
这两种实现方式有各自的优势,但也有各自的缺点。第一种方式,能更容易地安装新的包,但是删除旧包很困难,而且,几乎不可能得到任何关于已安装包的有意义的信息。
第二种方式得到已安装包的有用信息很容易,安装和删除包也比较容易。但这方式一个最不好的地方在于它无法在安装或删除包时执行一些特别的命令。
而实际上,没有一个包管理系统使用单独一种方式来实现,都是两种方式的组合实现,
RPM的设计目标
RPM的设计目标可以用一句话来概括:"something for everyone",尽管RPM存在的主要原因是Red Hat公司为了更方便地在它们的linux发行版中安装几百个包,但这并不是RPM存在的唯一理由。我们可以看看Red Hat公司在设计RPM时的需求:
使用安装和卸载更容易
正如我们在前文中可以看到的那样,安装一个包需要很多复杂的步骤。如果把这些事情交给人类来做,失败率是很高的。因此RPM的目的就是要帮助人们更简单地安装包,卸载包。
另一方面,RPM又需要给包的创建者足够的控制权让他们来控制这个包应该怎样安装。原因很简单:只要包的创建者多下一些功夫,那么这些包就能很好的安装和卸载。
使检验一个包是否正确安装更容易。
软件就像生活一样,总有许多意想不到的问题,RPM应该能够捕获到这些问题,比如说文件缺失或者文件非法修改。
使包的创建者创建包的时候更容易
节约了包创建者的很多时间和精力。
使包从源代码开始构建。
站在包创建者的角度上看,使RPM从源代码开始工作十分重要。为什么呢?
使用源代码,可以让他们把为了修改bug、添加新功能等等而添加的修改与之前的修改区分开来,这对于包构建者来说是一件好事,因为他们很多人不是软件的源作者。
把修改区分开,这样即使在几个月以后,依然能够明确地知道对包有过哪些改动
使其平台独立
包创建者需要做的一件繁杂的事就是使程序能够在不同类型的电脑上运行,RPM能够得到程序的源代码,加上一些必要的修改使其能够被正确构建,这是非常方便的。
包里面有什么东西
包名片
每个RPM包都有一些信息,用来作为自身的唯一标识。我们把这些信息叫做一个包名片,下面是两个包名片的样本例子:
- nls-1.0-1
- perl-5.001m-4
尽管这些名片看起来似乎是十分不同的,但是他们都遵循RPM包的包名片命名规则。每个包名片由以下三部分按顺序组成:
组成部分1:软件的名字
每个包名片以软件的名字开始,例如上例中,分别为nls和perl。
组成部分2:软件的版本
例如上例中,版本号分别为1.0和5.001m。
组成部分3:包的发布号
包的发布号反映出包在同一个版本号下重新构建的次数,重新的构建的原因可能是因为修复了一个Bug。习惯上,发布号从1开始。上例中的发布号分别为1和4。
与包有关的信息
包被创建的日期和时间。
对包的内容的说明。
包所需要安装的文件的总数。
分组的信息。
签名信息。
包中的文件信息
每个文件的名字以及它将要安装到哪个目录。
每个文件的权限。
文件的所有者以及所属的用户组
每个文件的MD5校验码
文件的内容