• 软件包管理
    • 15.1 软件包系统
    • 15.2 软件包管理系统工作方式
      • 15.2.1 包文件
      • 15.2.2 资源库
      • 15.2.3 依赖关系
      • 15.2.4 上层和底层软件包工具
    • 15.3 常见软件包管理任务
      • 15.3.1 查找资源库中的软件包
      • 15.3.2 从资源库中安装一个软件包
    • 从本地软件包安装一个软件包
      • 15.3.4 卸载软件
      • 15.3.5 更新资源库中的软件包
      • 15.3.6 更新本地包的软件包
      • 15.3.7 列出所有安装的软件包
      • 15.3.8 判断是否安装了一个软件包
      • 15.3.9 显示已安装软件包的信息
      • 15.3.10 查看某具体文件由哪个软件包安装得到
    • 15.4 本章总结
    • 拓展阅读

    软件包管理

    如果我们花些时间在 Linux 社区里,我们会得知很多针对, 类如在众多 Linux 发行版中哪个是最好的(等问题的)看法。这些讨论通常变得非常可笑,都集中在一些像桌面背景的漂亮程度(一些人不使用 Ubuntu,只是因为 Ubuntu 默认主题颜色是棕色的!)和其它的琐碎东西上。

    Linux 发行版本质量最重要的决定因素是软件包管理系统和其支持社区的持久性。随着我们花更多的时间在 Linux 上,我们会发现它的变化是非常快的。大多数一线 Linux 发行版每隔六个月发布一个新版本,并且许多独立的程序每天都会更新。为了能和这些如暴风雪一般多的软件保持联系,我们需要一些好工具来进行软件包管理。

    软件包管理是指系统中一种安装和维护软件的方法。今天,通过从 Linux 发行版中安装的软件包,已能满足许多人所有的软件需求。这不同于早期的 Linux,人们需要下载和编译源码来安装软件。编译源码没有任何问题,事实上,拥有对源码的访问权限是 Linux 的伟大奇迹。它赋予我们(其它每个人)检测和提高系统性能的能力。只是若有一个预先编译好的软件包处理起来要相对容易快速些。这章中,我们将查看一些用于包管理的命令行工具。虽然所有主流 Linux 发行版都提供了强大且精致的图形管理程序来维护系统,但是学习命令行程序也非常重要。因为它们可以完成许多让图形化管理程序处理起来困难(或者不可能)的任务。

    15.1 软件包系统

    不同的 Linux 发行版使用不同的打包系统,一般而言,大多数发行版分别属于两大包管理技术阵营:Debian 的”.deb”,和红帽的”.rpm”。也有一些重要的例外,比方说 Gentoo,Slackware,和 Foresight,但大多数会使用这两个基本系统中的一个。

    包管理系统 发行版 (部分列表)
    Debian 类 (.deb 技术) Debian, Ubuntu, Xandros, Linspire
    Red Hat 类(.rpm 技术) Fedora, CentOS, Red Hat Enterprise Linux, OpenSUSE, Mandriva, PCLinuxOS

    15.2 软件包管理系统工作方式

    在商业化软件中,获取软件的最新版本通常需要买一张安装媒介,比方说”安装盘”,然后运行一个”安装向导”,来在系统中安装新的应用程序。

    Linux 不是这样。Linux 系统中几乎所有的软件都可以在互联网上找到。其中大多数软件由发行商以包文件的形式提供,剩下的则以源码形式存在,可以手动安装。在后面章节里,我们将会谈谈怎样通过编译源码来安装软件。

    15.2.1 包文件

    在包管理系统中软件的基本单元是包文件。包文件是一个构成软件包的文件压缩集合。一个软件包可能由大量程序以及支持这些程序的数据文件组成。除了安装文件之外,软件包文件也包括关于这个包的元数据,如软件包及其内容的文本说明。另外,许多软件包还包括预安装和安装后脚本,这些脚本用来在软件安装之前和之后执行配置任务。

    软件包文件是由软件包维护者创建的,他通常是(但不总是)一名软件发行商的雇员。软件维护者从上游提供商(程序作者)那里得到软件源码,然后编译源码,创建软件包元数据以及所需要的安装脚本。通常,软件包维护者要把所做的修改应用到最初的源码当中,来提高此软件与 Linux 发行版其它部分的融合性。

    15.2.2 资源库

    虽然某些软件项目选择执行他们自己的打包和发布策略,但是现在大多数软件包是由发行商和感兴趣的第三方创建的。系统发行版的用户可以在一个中心资源库中得到这些软件包,这个资源库可能包含了成千上万个软件包,每一个软件包都是专门为这个系统发行版建立和维护的。

    因软件开发生命周期不同阶段的需要,一个系统发行版可能维护着几个不同的资源库。例如,通常会有一个”测试”资源库,其中包含刚刚建立的软件包,它们想要勇敢的用户来使用,在这些软件包正式发布之前,让用户查找错误。系统发行版经常会有一个”开发”资源库,这个资源库中保存着注定要包含到下一个主要版本中的半成品软件包。

    一个系统发行版可能也会拥有相关第三方的资源库。这些资源库需要支持一些因法律原因,比如说专利或者是 DRM 反规避问题,而不能被包含到发行版中的软件。可能最著名的案例就是对加密DVD的播放支持,在美国这是不合法的。第三方资源库在一些软件专利和反规避法案不生效的国家中设立并分发资源。这些资源库通常完全地独立于它们所支持的资源库,要想使用它们,你必须了解它们,手动地把它们包含到软件包管理系统的配置文件中。

    15.2.3 依赖关系

    程序很少独立工作;他们需要依靠其他程序的组件来完成他们的工作。程序所共有的活动,如输入/输出,就是由一个被多个程序调用的子例程处理的。这些子例程存储在动态链接库中。动态链接库为多个程序提供基本服务。如果一个软件包需要一些共享的资源,如一个动态链接库,它就被称作有一个依赖。现代的软件包管理系统都提供了一些依赖项解析方法,以确保安装软件包时,其所有的依赖也被安装。

    15.2.4 上层和底层软件包工具

    软件包管理系统通常由两种工具类型组成:底层工具用来处理这些任务,比方说安装和删除软件包文件,和上层工具,完成元数据搜索和依赖解析。在这一章中,我们将看一下由 Debian 风格的系统(比如说 Ubuntu,还有许多其它系统)提供的工具,还有那些由 Red Hat 产品使用的工具。虽然所有基于 Red Hat 风格的发行版都依赖于相同的底层程序(rpm),但是它们却使用不同的上层工具。在我们的讨论中,我们将研究Fedora, Red Hat 企业版,和 CentOs所使用的 yum 。其它Red Hat 风格的发行版提供了带有类似yum的其他上层工具。

    发行版本 低级工具 高级工具
    Debian 类 dpkg apt-get, aptitude
    Fedora, Red Hat Enterprise Linux, CentOS rpm yum

    15.3 常见软件包管理任务

    通过命令行软件包管理工具可以完成许多操作。我们将会看一下最常用的工具。注意底层工具也支持软件包文件的创建,这个话题超出了本书叙述的范围。在以下的讨论中,”package_name”这个术语是指软件包实际名称,而不是指”package_file”,它是包含在软件包中的文件名。

    15.3.1 查找资源库中的软件包

    使用上层工具来搜索资源库元数据,可以根据软件包的名字和说明来定位它。

    系统类型 命令
    Debian系统 apt-get update; apt-cache search search_string
    Red Hat系统 yum search search_string

    例如:搜索一个 yum 资源库来查找 emacs 文本编辑器,使用以下命令:

    1. yum search emacs

    15.3.2 从资源库中安装一个软件包

    上层工具允许从一个资源库中下载一个软件包,并经过完全依赖解析来安装它。

    系统类型 命令
    Debian 系统 apt-get update; apt-get install package_name
    Red Hat 系统 yum install package_name

    例如:从一个 apt 资源库来安装 emacs 文本编辑器:

    1. apt-get update; apt-get install emacs

    从本地软件包安装一个软件包

    如果从某处而不是从资源库中下载了一个软件包文件,可以使用底层工具来直接(没有经过依赖解析)安装它。

    系统类型 命令
    Debian 系统 dpkg —install package_file
    Red Hat 系统 rpm -i package_file

    例如:如果已经从一个并非资源库的网站下载了软件包文件 emacs-22.1-7.fc7-i386.rpm,则可以通过这种方法来安装它:

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

    注意:

    因为这项技术使用底层的 rpm 程序来执行安装任务,所以没有运行依赖解析。如果 rpm 程序发现缺少了一个依赖,则会报错并退出。


    15.3.4 卸载软件

    可以使用上层或者底层工具来卸载软件。下面是可用的上层工具。

    系统类型 命令
    Debian 系统 apt-get remove package_name
    Red Hat 系统 yum erase package_name

    例如:从 Debian 风格的系统中卸载 emacs 软件包:

    1. apt-get remove emacs

    15.3.5 更新资源库中的软件包

    最常见的软件包管理任务是保持系统中的软件包都是最新的。上层工具仅需一步就能完成这个至关重要的任务。

    系统类型 命令
    Debian 系统 apt-get update; apt-get upgrade
    Red Hat 系统 yum update

    例如:更新安装在 Debian 风格系统中的软件包:

    1. apt-get update; apt-get upgrade

    15.3.6 更新本地包的软件包

    如果已经从一个非资源库网站下载了一个软件包的最新版本,可以安装这个版本,用它来替代先前的版本:

    系统类型 命令
    Debian 系统 dpkg —install package_file
    Red Hat 系统 rpm -U package_file

    例如:把 Red Hat 系统中所安装的 emacs 的版本更新到软件包文件 emacs-22.1-7.fc7-i386.rpmz 所包含的 emacs 版本。

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

    注意:

    rpm 程序安装一个软件包和升级一个软件包所用的选项是不同的,而 dpkg 程序所用的选项是相同的。


    15.3.7 列出所有安装的软件包

    下表中的命令可以用来显示安装到系统中的所有软件包列表:

    系统类型 命令
    Debian 系统 dpkg —list
    Red Hat 系统 rpm -qa

    15.3.8 判断是否安装了一个软件包

    这些底端工具可以用来显示是否安装了一个指定的软件包:

    系统类型 命令
    Debian 系统 dpkg —status package_name
    Red Hat 系统 rpm -q package_name

    例如:确定是否 Debian 风格的系统中安装了这个 emacs 软件包:

    1. dpkg --status emacs

    15.3.9 显示已安装软件包的信息

    如果知道了所安装软件包的名字,使用以下命令可以显示这个软件包的说明信息:

    系统类型 命令
    Debian 系统 apt-cache show package_name
    Red Hat 系统 yum info package_name

    例如:查看 Debian 风格的系统中 emacs 软件包的说明信息:

    1. apt-cache show emacs

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

    确定哪个软件包对所安装的某个特殊文件负责,使用下表中的命令:

    系统类型 命令
    Debian 系统 dpkg —search file_name
    Red Hat 系统 rpm -qf file_name

    例如:在 Red Hat 系统中,查看哪个软件包安装了/usr/bin/vim 这个文件

    1. rpm -qf /usr/bin/vim

    15.4 本章总结

    在随后的章节里面,我们将探讨许多不同的程序,这些程序涵盖了广泛的应用程序领域。虽然大多数程序一般是默认安装的,但是若所需程序没有安装在系统中,那么我们可能需要安装额外的软件包。通过我们新学到的(和了解的)软件包管理知识,我们应该能够安装和管理所需程序。

    Linux 软件安装谣言

    从其它平台迁移过来的用户有时会成为谣言的受害者,说是在 Linux 系统中,安装软件有些困难,并且不同系统发行版所使用的各种各样的打包方案是一个障碍。唉,它是一个障碍,但只是针对于那些希望把他们的秘密软件只以二进制版本发行的专有软件供应商。

    Linux 软件生态系统是基于开放源代码理念。如果一个程序开发人员发布了一款产品的源码,那么与系统发行版相关联的开发人员可能就会把这款产品打包,并把它包含在他们的资源库中。这种方法保证了这款产品能很好地与系统发行版整合在一起,同时为用户“一站式采购”软件提供了方便,从而用户不必去搜索每个产品的网站。

    设备驱动差不多也以同样的方式来处理,但它们不是系统发行版资源库中单独的项目,它们本身是 Linux 系统内核的一部分。一般来说,在 Linux 当中没有一个类似于“驱动盘”的东西。Linux内核要么支持一个设备,要不就不支持。Linux 内核支持很多设备,事实上,Linux支持的设备数目多于 Windows 所支持的。当然,万一你需要的特定设备不被Linux支持,也于事无补。当那种情况发生时,你需要查找一下原因。缺少驱动程序支持通常是由以下三种情况之一导致:

    • 设备太新。 因为许多硬件供应商没有积极地支持 Linux 的发展,那么编写内核驱动代码的任务就由一些 Linux 社区来承担,而这需要花费时间。

    • 设备太奇异。不是所有的发行版都包含每个可能的设备驱动。每个发行版会建立它们自己的内核,因为内核是可以配置的(这使得从手表到主机的每台设备上运行 Linux 成为可能),这样它们可能会忽略某个特殊设备。通过定位和下载驱动程序的源码,可能需要你自己(是的,由你)来编译和安装驱动。这个过程不是很难,而是需要参与的。我们将在随后的章节里来讨论编译软件。

    • 硬件供应商隐藏信息。 他们既不发布应用于 Linux 系统的驱动程序代码,也不发布技术文档来让某人创建它。这意味着硬件供应商试图保密此设备的程序接口。因为我们不想在计算机中使用保密的设备,所以我建议删除这令人厌恶的硬件,把它和其它无用的东西都仍到垃圾桶里。

    拓展阅读

    花些时间来了解你所用发行版中的软件包管理系统。每个发行版都提供了关于自带软件包管理工具的文档。另外,这里有一些更普遍的资源:

    • Debian GNU/Linux FAQ 关于软件包管理一章对软件包管理进行了概述:http://www.debian.org/doc/FAQ/ch-pkgtools.en.html

    • RPM 工程的主页:http://www.rpm.org

    • 杜克大学 YUM 工程的主页:http://linux.duke.edu/projects/yum/

    • 了解一点儿背景知识,Wikipedia 上有一篇关于 metadata 的文章:http://en.wikipedia.org/wiki/Metadata