文章目录


如果用户经常访问Linux社区,那么针对众多Linux发行版本中哪一版是最好的这一问题,一定听到过诸多观点,通常,有关此问题的讨论都显得非常无聊,因为他们都将侧重点放在诸如哪个版本的桌面背景最漂亮(有些人居然因为Ubuntu的默认配色方案而不选择使用它)以及其他鸡毛蒜皮的小事上。


其实,决定Linux发行版本质量最重要的因素是软件包系统和支持该发行版本社区的活力。进一步接触Linux,我们就会发现Linux发行版本每6个月就有一个新版本问世,而且许多个人程序每天都在更新。要向同步这些日新月异的软件,我们就需要好的工具进行软件包管理。


软件包管理是一种在系统上安装、维护软件的方法。目前,很多人通过安装Linux经销商发布的软件包来满足他们所有的软件需求。这与早期的Linux形成了鲜明的对比。因为在Linux早期,想要安装软件必须先下载源码,然后对其进行编译。这并不是说编译源代码不好,源代码公开恰是Linux吸引人的一大亮点。编译源代码赋予用户自主检查、提升系统的能力,只是使用预先编译的软件包会更快、更容易些。

一、软件包系统

不同的Linux发行版用的是不同的软件包系统,并且原则上,适用于一种发行版的软件包与其他版本是不兼容的。多数Linux发行版采用的不外乎两种软件包技术阵营,即Debian的​​.deb​​技术和Red Hat的​​.rpm​​技术。当然也有一些特例,比如Gentoo、Slackware和Foresight等,但多数版本采取的还是下表中所列的两个基本软件包系统。

主流软件包系统类

软件包系统

发行版本(只列举了部分)

Debian类(.deb技术)

Debian、Ubuntu、Xandros、LInspire

Red Hat(.rpm技术)

Fedora、CentOS、Red Hat Enterprise Linux、openSUSE、Mandriva、PCLinuxOS

二、软件包系统工作方式

在非开源软件产业中,给系统安装一个新应用,通常需要先购买“安装光盘”之类的安装介质,然后运行安装向导进行安装。
Linux并不是这样。事实上,Linux系统所有软件均可在网上找到,并且多数是以软件包的形式由发行商提供,其余则以可手动安装的源代码形式存在。

2.1软件包文件

包文件是组成软件包系统的基本软件单元,它是组成软件包的文件压缩而成的文件集。一个包可能包含大量的程序以及支持这些程序的数据文件,包文件既包含了安装文件,又包含了有关包自身及其内容的文件说明之类的软件包元数据。此外,许多软件包中还包含了安装软件包前后执行配置任务的安装脚本。
包文件通常由软件包维护者创建,该维护者通常(并不总是)是发行商的职员。包维护者从上游供应商(一般是程序的作者)获得软件源代码,然后进行编译,并创建包的元数据及其他必须的安装脚本。通常,包维护者会在初始源代码上做部分修改,从而提高该软件包与该Linux发行版本其他部分的兼容性。

2.2库

虽然一些软件项目选择自己包装和分销,但如今多数软件包均由发行商或感兴趣的第三方创建。Linux用户可以从其所使用的Linux版本的中心库中获得软件包。所谓的中心库,一般包含了成千上万个软件包,而且每一个都是专门为该发行版本建立和维护的。
在软件开发生命周期的不同阶段,一个发行版本可能会维护多个不同仓库。例如,通常会由一个测试库,该库里面存放的是刚创建的、用于条使者在软件包正式发布前查找漏洞的软件包。另外,一个发行版本通常还会有一个开发库,存放的是下一个公开发行的版本中所包含的开发中的软件包。
一个发行版本可能还会由相关的第三方库,这些库通常提供因法律原因,如专利或数字版权管理(DRM)等凡规避问题而不能包括在发行版中的软件,著名实例就是加密的DVD技术支持,该做法在美国是不合法。第三方库主要用在软件专利和反规避不适用的国家,这些库通常完全独立与它们所支持的Linux版本,用户必须充分了解后手动将其加入到软件包文件管理系统的的配置文件中才能使用它们。

2.3依赖关系

几乎没有任何一个程序是独立的。与之相反,程序之间相互依赖彼此完成既定工作。一些共有的操作,比如输入/输出操作,就是由多个程序共享的例程执行。这些例程存储在共享库里面,共享库里面的文件为多个程序提供必要的服务。如果一个软件包需要共享库之类的共享资源,说明其具有依赖性。现代软件包管理系统都提供依赖性解决策略,从而确保用户安装了软件包的同时也安装了其所有的依赖关系。

2.4高级和低级软件包工具

软件包管理系统通常包含两类工具–执行如安装、删除软件包文件等任务的低级工具和进行元数据搜索及提供依赖性解决的高级工具。

软件包系统工具

发行版本

低级工具

高级工具

Debian类

dpkg

apt-get、aptitude

Fedora、Red Hat Enterprise Linux、CentOS

rpm

yum

三、常见软件包管理任务

命令行软件管理工具可以完成许多操作,下面我们介绍一些较常见的。有一点要说明,低级工具也支持软件包文件的创建。
在下面的讨论中,单词​​​package_name​​​指软件包的实际名称,而​​package_file​​则是指包含该软件包的文件名。

3.1在库里面查找软件包

通过高级工具来搜索库元数据时,我们可以根据文件名或其描述来查找该包。

包搜索命令

系统类型

命令

Debian系统

apt-get update、apt-cache search search_string

Red Hat系统

yum search search_string

例如,在Red Hat系统的yum库中搜索emacs文本编辑器的代码如下:

yum search emacs

3.2安装库中的软件包

高级工具允许从库中下载、安装软件包,同时安装所有的依赖包。

软件包安装命令

系统类型

命令行

Debian系统

apt-get update、apt-get install package_name

Red Hat系统

yum install package_name

例如,在Debian系统上安装apt元数据库中的emacs文本编辑器的代码如下:

apt-get update;apt-get install

3.3安装软件包文件中的软件包

如果软件包文件并不是从库源中下载的,那么我们就可以使用低级工具安装(但并不安装依赖性关系)

低级软件包安装命令

系统类型

命令

Debian系统

dpkg --install package_file

Red Hat系统

rpm -i package_file

例如,当emacs-22.1-7.fc7-i386.rpm软件包从非库资源网站下载时,可采用如下方式安装与Red Hat系统中:

rpm -i emacs-22.1-7.fc7-i386.rpm

注意:由于该方法采用低级rpm工具安装,所以并不会解决依赖性关系。一旦rpm在安装过程中发现缺少依赖包,rpm就会跳出错误后退出。

3.4删除软件包

卸载软件包即可利用高级工具也可利用低级工具,高级工具的相关命令见下表:

软件包移除命令

系统类型

命令

Debian系统

apt-get remove paceage_name

Red Hat系统

yum erase package_name

例如,从Debian系统中卸载emacs软件包的代码如下:

apt-get

3.5更新库中的软件包

最常见的软件包管理任务是保持系统安装最新的软件包。高级工具仅需要一步便可完成此重要任务。

高级软件包更新命令

系统类型

命令

Debian系统

apt-get update、apt-get upgrade

Red Hat系统

yum update

3.6更新软件包文件中的软件包

如果软件包的更新版本已从非库源中下载,那么我就可以采用如下命令进行安装更新从而取代原版本。

低级软件包更新命令

系统类型

命令

Debian系统

dpkg --install package_file

Red Hat系统

rpm -U package_file

例如,将Red Hat系统上已经装好的emacs程序更新为emacs-22.1-7.fc7-i386.rpm软件包文件中的版本的代码如下:

rpm -U emacs-22.1-7.fc7-i386.rpm

注意:与​​rpm​​​命令不同,​​dpkg​​命令在更新软件包时并没有指定的参数选项,只有在安装软件包时才有

3.7列出已安装的软件包列表

下表中的命令用于显示系统上所有已安装的软件包列表:

软件包列表命令

系统类型

命令

Debian系统

dpkg --list

Red Hat系统

rpm -qa

3.8判断软件包是否安装

可以利用低级工具来判断系统是否已经安装某个软件的命令

软件包状态命令

系统类型

命令

Debian系统

dpkg --status package_name

Red Hat系统

rpm -q package_name

例如,判断emacs程序包在Debian系统中是否已安装的代码如下:

dpkg --status emacs

3.9显示已安装软件包的相关信息

在已知已安装的软件包的名称的情况下,便可以用下表中的命令显示该软件包的描述关系。

软件包信息查看命令

系统类型

命令

Debian系统

apt-cache show package_name

Red Hat系统

yum info package_name

例如,查看Debian系统上的emac软件包的描述信息的代码如下:

apt-cache show emacs

3.10查看某具体文件由哪个软件包安装得到

判断某个特定的文件是由哪个软件包负责安装的,可以采用如下命令:
查询文件所属命令

系统类型

命令

Debian系统

dpkg --search file_name

Red Hat系统

rpm -qf file_name

例如,查看Red Hat系统中哪个软件包安装了/usr/bin/vim目录下的文件的代码如下:

rpm -qf /usr/bin/vim