+ -
当前位置:首页 → 问答吧 → Linux扫盲班之-Linux的软件管理机制(完成)

Linux扫盲班之-Linux的软件管理机制(完成)

时间:2011-08-15

来源:互联网



这一期感谢Woodelf童鞋,是他帮我写的
上期讲到了Linux的启动过程,本期就来说说Linux系统的灵魂所在——软件包管理。

在Linux诞生之初,Linux内核上面跑的应用都需要用户自己进行编译,没有现在这样丰富的二进制包。而众所周知,Linux的软件包和Windows软件的区别之一就是依赖关系。

而所谓依赖关系,是指某个软件正常运行所需要的库文件或者基础。可以简单地用层次关系来理解,比如运行软件A,需要软件B,那么B就是A的依赖包。拿到Windows下面来类比的话,就比如说我装了个最新的大型3D游戏,它需要DX11支持,但是我的系统没有DX11,我就需要安装DX11运行组件。那么DX11就是这个游戏的依赖包,这样子理解应该就容易多了。

正因为Linux有着“臭名昭著”的错综复杂的依赖关系,而如果采用手工编译的话,难免会出现为了编译某个软件而需要连带编译N多依赖包的局面。虽然对于优秀的系统管理员来说,他可以对软件包的互相依赖很熟悉,甚至可以手动剔除不必要的依赖关系,但是普通用户却无法接受如此复杂的操作。再加上手工编译耗时耗力,可能还会有各种错误,于是就有了包管理器来对软件包进行维护。

补充个知识点,Linux的依赖关系可以分为两类,编译依赖和运行依赖。编译依赖指的是对软件进行编译所需要的依赖包。举个例子,比如我编译ibus输入法,需要我的系统安装了automake,autoconf等编译工具。而运行依赖则是指软件包正常运行所需要的依赖包,前面类比的Windows下面的DX11就是典型的运行依赖。而在编译完成之后,一般都可以安全删除编译依赖包,因为软件运行时候不再需要这些包。

熟悉了以上概念,那么下面的知识就好理解的多了。

包管理器分为两类,一类是底层包管理器,比如最有名的dpkg和rpm。所谓底层包管理器,就是说它具有包管理器的基本,比如安装,删除,升级软件,并且把软件信息添加到系统的包记录数据库。这些底层包管理器是上层包管理器的基础。但是它本身不具有解决依赖的能力。

第二类自然就是高级包管理器。比如Debian的apt-get和aptitude,RH/Fedora的yum,SUSE的zypper等等。高级的包管理不仅具有底层包管理器的功能,而且还具备自动解决依赖和联网升级的特性。这里指的联网升级,指的是通过软件源的配置来进行软件包的升级。而对于底层包管理器而言,它们只能用本地的包来替代现有的包。比如说我的系统里面firefox版本是5.0,我要用rpm升级到6.0,那我只能把6.0版本的rpm下载下来,再用rpm -Uvh firefox-6.0-i686.fc15.rpm命令来进行升级。另外,虽然说高级包管理器有更多功能,但是一般还是要调用底层包管理器的进程来进行安装升级等操作的。

因此,对于一般的预编译包发行版来说,系统至少内置了两套包管理器,一套底层,一套高级。但是也不是都如此,这点要注意。

可能有些新手会发现,拿Ubuntu来举例,如果他在终端运行了apt-get upgrade来进行升级,那么他的新立得无法打开了,会有诸如已经有另一个apt进程在运行之类的提示。这是因为包管理器在运行过程中,会把系统的包数据库加锁,使得无法再运行第二个包管理进程。这其实也是出于稳定性的考虑。如果两个包管理进程同时运行,同时读取和操作包数据库,那么很有可能导致数据库的错乱甚至损坏。因此,一般的包管理进程都有且只能有一个。

我下面要说的是对于以上内容的两个例外情况。

第一个是Slackware。Slackware虽然也有高级包管理工具,叫做slackpkg,但是这个包管理工具是不会解决依赖关系的,这跟Slackware的理念有关。Slackware的开发者认为,合格的系统管理员应当可以自行理清和解决依赖关系,所以它的包管理器不带依赖解决功能。虽然之前也曾有人讨论过是否应该给Slackware加上依赖处理功能,但是似乎还是反对的呼声多。所以在社区广为流传一句话,When you know Slackware you know Linux. When you know Red Hat, all you know is Red Hat。

第二个是Gentoo/Funtoo。众所周知,Gentoo/Funtoo是基于源代码的发行版,而它的包管理器是portage,包管理工具是emerge。而Gentoo是可以有多个emerge进程运行的。我猜测,它在编译过程中是不给数据库加锁的,只会在configure和安装过程中加锁。所以不管你开几个emerge,都没问题。

读过以上内容以后,相信各位也对包管理器有了进一步了解。有问题可以跟帖提问,我会一一解答。敬请期待下期Linux扫盲班。

作者: yszzf   发布时间: 2011-08-15

让你写个空标题……我先人工置顶吧。

作者: woodelf   发布时间: 2011-08-20

前来学习,每次必到

作者: gpf   发布时间: 2011-08-20

看好了,内容安排讲解得很清晰
等小弟有空排一下版,是有三大部分的内容吧……

作者: 楷楷楷   发布时间: 2011-08-20



我顺便想了解下Arch的包管理器的特点,就跟apt-get做一下简单对比吧。
woodelf介绍Arch时简略提到而已

作者: 楷楷楷   发布时间: 2011-08-20