前言
如果我们在Linux社区花费一些时间,我们可以看到关于哪一个Linux发行版本是最好的许多观点。通常,这些讨论十分没有价值,关注一些例如桌面背景是否可爱(一些人因为它的默认颜色主题不使用它)以及其它的琐碎的事情上。
决定发行版本质量最重要的事情是 包系统(packaging system)和 活跃的发行版本支持社区。随着我们在Linux上花费更多的时间,我们看到它的软件格局非常动态。经常发生变化。大多数顶级的Linux发行版本每六个月发布新版本 并且 许多个人项目每日更新。为了这场软件风暴能够持续下去,我们需要一款包管理的工具。
包管理 是 在系统上安装和维护软件的方法。如今,大多数人都可以通过从Linux发行商安装软件包来满足其所有软件需求。这与Linux早期形成了对比,当时为了安装软件 不得不下载并且编译 源代码。这并不是说编译源代码有什么问题,事实上,访问源代码是Linux的一大奇迹。这给予了每个人机会来检查以及改进系统。只是使用预编译程序包更加简单和快速。
在此章节,我们将会看一些包管理命令行工具。尽管所有主要发行版都提供了功能强大且复杂的图形程序来维护系统,但是了解命令行程序也很重要。它可以执行图形化程序难以(或不可能)的许多任务。
包系统(packaging) 不同的发行版本使用不同的包系统。并且作为一个通用的规则,用于一个发行版本的包不能被另一个发行版本兼容。大多数发行版本都属于包技术的两个阵营之一:Debian的.deb阵营以及Red Hat的.rpm阵营。也有一些重要的例外,比如 Gentoo, Slackware, 和 Foresight,但大多数其他系统使用表14-1中所示的两个基本系统之一。
Table 14-1: Major Packaging System Families
| Packaging System | Distributions (partial listing) |
|---|---|
| Debian style (.deb) | Debian, Ubuntu, Xandros, Linspire |
| Red Hat style (.rpm) | Fedora, CentOS, Red Hat Enterprise Linux, openSUSE, Mandriva, PCLinuxOS |
包系统
包系统(packaging)如何工作
专有软件行业中发行的软件通常需要购买一块安装介质(例如“安装磁盘”),然后运行“安装向导”以在系统上安装新的应用程序。 Linux 不以这种形式安装。大部分由发行商以软件包文件的形式提供,其余以源代码形式提供,可以手动安装。
包文件
包系统中软件基本单元是包文件。软件包文件是构成软件包的文件的压缩集合。一个包可能包含许多程序和支持这些程序的数据文件。除要安装的文件外,软件包文件还包括有关软件包的元数据,例如关于包的文本描述和其内容。此外,许多软件包都包含安装前和安装后脚本,这些脚本在安装软件包之前和之后执行配置任务。
软件包文件是由一个称为软件包维护者的人创建的,通常是(但并非总是)发行商的雇员。包维护者从上游提供商处(upstream provider,程序的作者)以源代码的形式获取软件,进行编译,并创建程序包元数据和任何必要的安装脚本。通常,程序包维护人员会对源代码进行修改,来改善程序与Linux发行版其他部分的集成。
仓库(Repositories)
虽然一些软件项目选择执行自己的包以及发布,但是大多数包当今是由发行商以及感兴趣的第三方创建的。软件包在中央存储库中可供分发用户使用,其中可能包含成千上万个软件包,每个软件包都是为分发而专门构建和维护的。 发行版可以为软件开发生命周期的不同阶段维护几个不同的库。 例如,通常会有一个测试库,其中包含刚构建的程序包,供勇敢的人使用,这些人在发布程序包以进行一般分发之前寻找bug。发行版通常有开发仓库,该存储库中保存着要包含在发行版下一个主要版本中的在制品软件包。 发行版可能还具有相关的第三方仓库。由于法律原因,譬如专利或者数字版权管理Digital Rights Management (DRM) 反破(po) 解问题,不能包含在发行版中。也许最广为人知的例子是加密的DVD支持,这在美国是非法的。第三方存储库在不适用软件专利和反规避法律的国家/地区运营。这些仓库经常完全独立于他们支持的发行版,并且为了使用,必须了解他们并手动将它们包含在包管理系统的配置文件中。
依赖
程序很少独立存在;相反,他们依靠其他软件组件的存在来完成工作。常见的活动(例如输入/输出)由许多程序共享的例程处理。这些例程存储在所谓的共享库中,该库为多个程序提供基本服务。如果程序包需要共享资源(例如共享库),则称其具有依赖。现代软件包管理系统都提供了某种依赖关系解析方法,以确保在安装软件包同时也安装了其所有依赖。
高等级与低等级包工具 软件包管理系统通常由两种工具组成:处理诸如安装和删除软件包文件之类的任务的低级工具,以及执行元数据搜索和依赖关系解析的高级工具。此章节我们将观察Debian类型系统(例如Ubuntu)支持的工具 以及 最近Red Hat产品使用的工具。虽然所有的Red Hat类型发行版本依赖于相同的低级工具(rpm),但是他们使用不同的高级工具,Fedora,Red Hat Enterprise Linux,CentOS使用yum,其他Red Hat类型的发行版提供了具有类似功能的高级工具(请参阅表14-2)。
Table14-2: Packaging System Tools
| Distributions | Low-Level Tools | High-Level Tools |
|---|---|---|
| Debian style | dpkg | apt-get , aptitude |
| Fedora, Red Hat Enterprise Linux, CentOS | rpm | yum |
通常包管理任务
命令行包管理工具可以执行许多操作。我们将查看其中最为常见的。值得注意的是低级工具也提供了包文件的创建,在讨论之外。 在接下来的讨论中,package_name代指包的实际名称,相反的package_file指包含在包中的文件。
在仓库中查找包
通过使用高级工具来搜索仓库的元数据,它可以通过名称或者描述来定位到包。
Table 14-3: Package Search Commands
| Style | Command(s) |
|---|---|
| Debian | apt-get update apt-cache search search_string |
| Red Hat | yum search search_string |
例子:在Red Hat系统yum仓库中搜索文本编辑器emacs : yum search emacs
在仓库中安装包
高级工具允许从存储库中下载软件包并以完全的依赖关系解决方案进行安装
Table 14-4: Package Installation Commands
| Style | Command(s) |
|---|---|
| Debian | apt-get update apt-get install package_name |
| Red Hat | yum install package_name |
例子:在Debian类型系统 apt 仓库中安装文本编辑器emacs :
apt-get update; apt-get install emacs
从包文件中安装包
如果已经从不是仓库的源下载了包文件,可以使用低级工具直接安装(虽然没有考虑依赖): Table 14-5: Low-Level Package Installation Commands
| Style | Command |
|---|---|
| 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
注:因为使用低级工具来执行安装,没有执行依赖解决方案。如果rmp遇到了依赖缺失的情况,rpm将会报错并退出。
移除包
高级工具以及低等级工具都可以卸载包
Table14-6: Package Removal Commands
| Style | Command |
|---|---|
| Debian | apt-get remove package_name |
| Red Hat | yum erase package_name |
例子:从Debian类型系统中卸载emacs包:
apt-get remove emacs
从仓库中升级包
最常见的软件包管理任务是使系统与最新软件包保持同步。高级工具在一个单独的步骤中可以执行这个重要的任务。
Table 14-7: Package Update Commands
| Style | Command |
|---|---|
| Debian | apt-get update; apt-get upgrade |
| Red Hat | yum update |
例子:将所有可用更新应用于Debian风格系统上已安装的软件包:
apt-get update; apt-get upgrade
从包文件中升级包
如果已经从不是仓库的源下载了更新的包文件,可以安装来替换上一个版本
Table 14-8: Low-Level Package Upgrade Commands
| Style | Command |
|---|---|
| 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
注:dpkg与rpm相比,没有特定的选项来升级软件包而不是安装软件包。
列出安装的包
以下命令可以列出在系统上安装的所有包:
Table 14-9: Package Listing Commands
| Style | Command |
|---|---|
| Debian | dpkg --list |
| Red Hat | rpm -qa |
确定一个包是否被安装
低级工具可以用来展示指定包是否被安装:
Table 14-10: Package Status Commands
| Style | Command |
|---|---|
| Debian | dpkg --status package_name |
| Red Hat | rpm -q package_name |
例子:在Debian类型系统上确定emacs是否被安装
dpkg --status emacs
展示关于安装包的信息
如果知道安装包的名称,以下命令可以展示包的描述信息。
Table 14-11: Package Information Commands
| Style | Command |
|---|---|
| Debian | apt-cache show package_name |
| Red Hat | yum info package_name |
例子:从Debian类型系统中查看emacs包描述:
apt-cache show emacs
查找哪个包安装的文件
为了确定特定的文件安装对应着哪个包,使用以下命令:
Table 14-12: Package File Identification Commands
| Style | Command |
|---|---|
| Debian | dpkg --search file_name |
| Red Hat | rpm -qf file_name |
例子:在Red Hat类型系统中查看哪个包安装了/usr/bin/vim文件:
rpm -qf /usr/bin/vim