第15章:软件包管理
如果我们在 Linux 社区里已经混了一段时间了,会看到很多关于哪个 Linux 发行版是“最佳”的争论。这些争论通常非常幼稚,集中在一些像桌面背景的漂亮程度(一些人不使用 Ubuntu,只是因为 Ubuntu 默认主题颜色是棕色的!)和其它的琐碎东西上。
Linux 发行版本质量最重要的决定因素是软件包管理系统和其支持社区的持久性。随着我们花更多的时间在 Linux 上,我们会发现它的变化是非常快的。大多数一线Linux 发行版每隔六个月发布一个新版本,并且许多独立的程序每天都会更新。为了能和这些如暴风雪一般多的软件保持联系,我们需要一些好工具来进行软件包管理。
软件包管理是指系统中一种安装和维护软件的方法。今天,通过 Linux 发行版中安装的软件包,已能满足许多人的需求。这不同于早期的 Linux,人们需要下载和编译源码来安装软件。编译源码没有任何问题,事实上,拥有对源码的访问权限是 Linux 的伟大奇迹。它赋予我们提高系统性能的能力。只是若有一个预先编译好的软件包处理起来要相对容易快速些。这章中,我们将查看一些用于包管理的命令行工具。虽然所有主流 Linux 发行版都提供了强大且精致的图形管理程序来维护系统,但是学习命令行程序也非常重要。因为它们可以完成许多让图形化管理程序处理起来困难(或者不可能)的任务。
15.1 包管理系统
不同的 Linux 发行版使用不同的包管理系统,一般而言,大多数发行版分别属于两大包管理技术阵营:Debian 的".deb",和红帽的".rpm"。也有一些重要的例外,比方说 Gentoo,Slackware,和 Foresight,但大多数会使用这两个基本系统中的一个。
包管理系统 | 发行版 (部分列表) |
---|---|
Debian Style (.deb) | Debian, Ubuntu, Xandros, Linspire |
Red Hat Style (.rpm) | Fedora, CentOS, Red Hat Enterprise Linux, OpenSUSE, Mandriva, PCLinuxOS |
15.2 软件包管理系统是怎样工作的
在商业化软件中,获取软件的最新版本通常需要买一张安装媒介,比方说"安装盘",然后运行一个"安装向导",来在系统中安装新的应用程序。
Linux 不是这样。Linux 系统中几乎所有的软件都可以在互联网上找到。其中大多数软件由发行商以包文件的形式提供,剩下的则以源码形式存在,可以手动安装。在后面章节里,我们将会谈谈怎样通过编译源码来安装软件。
15.3 包文件
在包管理系统中软件的基本单元是包文件。包文件是一个构成软件包的文件压缩集合。一个软件包可能由大量程序以及支持这些程序的数据文件组成。除了安装文件之外,软件包文件也包括这个包的元数据,也就是对软件包的说明。另外,许多软件包还包括预安装和安装后脚本,这些脚本用来在软件安装之前和之后执行配置任务。
软件包文件是由软件包维护者创建的,他通常是(但不总是)一名软件发行商的雇员。软件维护者从上游提供商(程序作者)那里得到软件源码,然后编译源码,创建软件包元数据以及所需要的安装脚本。通常,软件包维护者要把所做的修改应用到最初的源码当中,来提高此软件与 Linux发行版其它部分的融合性。
15.4 包仓库
虽然某些软件项目选择执行他们自己的打包和发布策略,但是现在大多数软件包是由发行商和感兴趣的第三方创建的。系统发行版的用户可以在一个中心包仓库中得到这些软件包,包仓库可能包含了成千上万个软件包,每一个软件包都是专门为这个系统发行版建立和维护的。
因软件开发生命周期不同阶段的需要,一个系统发行版可能维护着几个不同的包仓库。例如,通常会有一个"测试"包仓库,其中包含比较新的软件包,它们想要勇敢的用户来使用,在这些软件包正式发布之前,让用户查找错误。系统发行版经常会有一个"开发版"包仓库,这个库中保存着注定要包含到下一个主要版本中的半成品软件包。
一个系统发行版可能也会拥有相关第三方的包仓库。这些库需要支持一些因法律原因,比如说专利或者是 DRM 反规避问题,而不能被包含到发行版中的软件。可能最著名的案例就是对加密DVD的播放支持,在美国这是不合法的。第三方包仓库在一些软件专利和反规避法案不生效的国家中设立并分发资源。这些库通常完全地独立于它们所支持的包仓库,要想使用它们,你必须了解它们,手动地把它们包含到软件包管理系统的配置文件中。
15.5 依赖性
程序很少独立工作;他们需要依靠其他程序的组件来完成他们的工作。程序所共有的活动,如输入/输出,就是由一个被多个程序调用的子例程处理的。这些子例程存储在动态链接库中。动态链接库为多个程序提供基本服务。如果一个软件包需要一些共享的资源,如一个动态链接库,它就被称作有一个依赖。现代的软件包管理系统都提供了一些依赖项解析方法,以确保安装软件包时,其所有的依赖也被安装。
15.6 上层和底层软件包工具
软件包管理系统通常由两种工具类型组成:底层工具用来处理这些任务,比方说安装和删除软件包文件,和上层工具,完成元数据搜索和依赖解析。在这一章中,我们将看一下由 Debian 风格的系统(比如说 Ubuntu,还有许多其它系统)提供的工具,还有那些由 Red Hat 产品使用的工具。虽然所有基于 Red Hat 风格的发行版都依赖于相同的底层程序(rpm),但是它们却使用不同的上层工具。在我们的讨论中,我们将研究 Fedora, Red Hat 企业版,和 CentOs 所使用的 yum 。其它 Red Hat 风格的发行版提供了带有类似 yum 的其他上层工具。
发行版 | 底层工具 | 上层工具 |
---|---|---|
Debian-Style | dpkg | apt-get, aptitude |
Fedora, Red Hat Enterprise Linux, CentOS | rpm | yum |
15.7 常见软件包管理任务
通过命令行软件包管理工具可以完成许多操作。我们将会看一下最常用的工具。注意底层工具也支持软件包文件的创建,这个话题超出了本书叙述的范围。在以下的讨论中,"package_name"这个术语是指软件包实际名称,而不是指"package_file",它是包含在软件包中的文件的名字。
15.8 查找包仓库中的软件包
使用上层工具来搜索包仓库元数据,可以根据软件包的名字和说明来定位它。
风格 | 命令 |
---|---|
Debian | apt-get update; apt-cache search search_string |
Red Hat | yum search search_string |
例如:搜索一个 yum 包仓库来查找 emacs 文本编辑器,使用以下命令:
yum search emacs
15.9 从包仓库中安装一个软件包
上层工具允许从一个资、包仓库中下载一个软件包,并经过完全依赖解析来安装它。
风格 | 命令 |
---|---|
Debian | apt-get update; apt-get install package_name |
Red Hat | yum install package_name |
例如:从一个 apt 包仓库来安装 emacs 文本编辑器:
apt-get update; apt-get install emacs
15.10 通过软件包文件来安装软件
如果从某处而不是从包仓库中下载了一个软件包文件,可以使用底层工具来直接(不经过依赖解析)安装它。
风格 | 命令 |
---|---|
Debian | dpkg --install package_file |
Red Hat | rpm -i package_file |
例如:如果已经从一个并非包仓库的网站下载了软件包文件 emacs-22.1-7.fc7-i386.rpm,则可以通过这种方法来安装它:
rpm -i emacs-22.1-7.fc7-i386.rpm
注意:因为这项技术使用底层的 rpm 程序来执行安装任务,所以没有运行依赖解析。如果 rpm 程序发现缺少了一个依赖,则会报错并退出。
15.11 卸载软件
可以使用上层或者底层工具来卸载软件。下面是可用的上层工具。
风格 | 命令 |
---|---|
Debian | apt-get remove package_name |
Red Hat | yum erase package_name |
例如:从 Debian 风格的系统中卸载 emacs 软件包:
apt-get remove emacs
15.12 经过包仓库来更新软件包
最常见的软件包管理任务是保持系统中的软件包都是最新的。上层工具仅需一步就能完成这个至关重要的任务。
风格 | 命令 |
---|---|
Debian | apt-get update; apt-get upgrade |
Red Hat | yum update |
例如:更新安装在 Debian 风格系统中的软件包:
apt-get update; apt-get upgrade
15.13 经过软件包文件来升级软件
如果已经从一个非包仓库网站下载了一个软件包的最新版本,可以安装这个版本,用它来替代先前的版本:
风格 | 命令 |
---|---|
Debian | dpkg --install package_file |
Red Hat | rpm -U package_file |
例如:把 Red Hat 系统中所安装的 emacs 的版本更新到软件包文件 emacs-22.1-7.fc7-i386.rpmz 所包含的 emacs 版本。
rpm -U emacs-22.1-7.fc7-i386.rpm
注意:rpm 程序安装一个软件包和升级一个软件包所用的选项是不同的,而 dpkg 程序所用的选项是相同的。
15.14 列出所安装的软件包
下表中的命令可以用来显示安装到系统中的所有软件包列表:
风格 | 命令 |
---|---|
Debian | dpkg --list |
Red Hat | rpm -qa |
15.15 确定是否安装了一个软件包
这些底端工具可以用来显示是否安装了一个指定的软件包:
风格 | 命令 |
---|---|
Debian | dpkg --status package_name |
Red Hat | rpm -q package_name |
例如:确定是否 Debian 风格的系统中安装了这个 emacs 软件包:
dpkg --status emacs
15.16 显示所安装软件包的信息
如果知道了所安装软件包的名字,使用以下命令可以显示这个软件包的说明信息:
风格 | 命令 |
---|---|
Debian | apt-cache show package_name |
Red Hat | yum info package_name |
例如:查看 Debian 风格的系统中 emacs 软件包的说明信息:
apt-cache show emacs
15.17 查找安装了某个文件的软件包
确定哪个软件包对所安装的某个特殊文件负责,使用下表中的命令:
风格 | 命令 |
---|---|
Debian | dpkg --search file_name |
Red Hat | rpm -qf file_name |
例如:在 Red Hat 系统中,查看哪个软件包安装了/usr/bin/vim 这个文件
rpm -qf /usr/bin/vim
15.18 总结归纳
在随后的章节里面,我们将探讨许多不同的程序,这些程序涵盖了广泛的应用程序领域。虽然大多数程序一般是默认安装的,但是若所需程序没有安装在系统中,那么我们可能需要安装额外的软件包。通过我们新学到的(和了解的)软件包管理知识,我们应该能够安装和管理所需程序。
Linux 软件安装谣言
从其它平台迁移过来的用户有时会成为谣言的受害者,说是在 Linux 系统中,安装软件有些困难,并且不同系统发行版所使用的各种各样的打包方案是一个障碍。如果说它是一个障碍,那只是针对于那些希望把他们的商业软件只以二进制版本发行的专有软件供应商。
Linux 软件生态系统是基于开放源代码理念。如果一个程序开发人员发布了一款产品的源码,那么与系统发行版相关联的开发人员可能就会把这款产品打包,并把它包含在他们的包仓库中。这种方法保证了这款产品能很好地与系统发行版整合在一起,同时为用户“一站式采购”软件提供了方便,从而用户不必去搜索每个产品的网站。
设备驱动差不多也以同样的方式来处理,但它们不是系统发行版包仓库中单独的项目,它们本身是 Linux 系统内核的一部分。一般来说,在 Linux 当中没有一个类似于“驱动盘”的东西。Linux 内核要么支持一个设备,要不就不支持。Linux 内核支持很多设备,事实上,Linux 支持的设备数目多于 Windows 所支持的。当然,万一你需要的特定设备不被 Linux 支持,也于事无补。当那种情况发生时,你需要查找一下原因。缺少驱动程序支持通常是由以下三种情况之一导致:
设备太新。 因为许多硬件供应商没有积极地支持 Linux 的发展,那么编写内核驱动代码的任务就由一些 Linux 社区来承担,而这需要花费时间。
设备太奇异。 不是所有的发行版都包含每个可能的设备驱动。每个发行版会建立它们自己的内核,因为内核是可以配置的(这使得从手表到主机的每台设备上运行 Linux 成为可能),这样它们可能会忽略某个特殊设备。通过定位和下载驱动程序的源码,可能需要你自己(是的,由你)来编译和安装驱动。这个过程不是很难,而是需要参与的。我们将在随后的章节里来讨论编译软件。
硬件供应商隐藏信息。 他们既不发布应用于 Linux 系统的驱动程序代码,也不发布技术文档来让某人创建它。这意味着硬件供应商试图保密此设备的程序接口。因为我们不想在计算机中使用保密的设备,所以我建议删除这令人厌恶的硬件,把它和其它无用的东西都扔到垃圾桶里。