Top

D11:常见任务和基本工具之一

包管理

对于发行版的质量来说,最重要的决定因素是包管理系统和发行版社区的活力,而不是桌面背景的美观以及其他琐事。
大多数顶级Linux发行版每六个月发布一次新版本,每天都有许多单独的程序更新。所以需要一个好的软件包管理工具。
软件包管理是在系统上安装和维护软件的一种方法。早期的Linux用户必须下载并编译源代码才能安装软件。
目录:

包系统

不同的发行版使用不同的包管理系统,一般来说,一个发行版的包管理系统与另一个发行版不兼容。
大多数发行版属于两大包管理系统阵营之一: 也有例外,比如Gentoo、Slackware和Arch。

包系统如何工作

专有软件行业的软件分发方法通常是需要购买一个安装介质,比如安装光盘,或从供应商的网站下载产品,然后运行“安装向导”在系统上安装新的应用程序。
而Linux不是这样的,几乎所有Linux系统的软件都可以在互联网上找到,其中大部分是由发行商以包文件的形式提供,还有一些是以源代码的形式提供,可以手动安装。

包文件

包系统中软件的最基本单元是包文件(package file),包文件是组成软件包的文件的压缩集合。
一个包可能由许多支持这些程序的程序和数据文件组成。除了要安装的文件外,包文件还包括有关包的元数据,例如包及其内容的文本描述。
此外,许多软件包还包含安装前和安装后的脚本,这些脚本在软件包安装前后执行配置任务。

包文件由名为包维护人员(package maintainer)的人创建,通常(但不总是)是发行版供应商的员工。
软件包维护人员从上游供应商(程序的作者)处获得源代码形式的软件,对齐进行编译,并创建软件包元数据和任何必要的安装脚本。
通常,包维护人员会对原始源代码进行修改,以改进程序与Linux发行版其他部分的集成。

存储库

虽然一些软件项目选择执行自己的打包和分发,但如今大多数软件包都是由发行版供应商和感兴趣的第三方创建的。
软件包在中央存储库中提供给发行版的用户,其中可能包含数千个软件包,每个软件包都是为发行版专门构建和维护的。

发行版可以为软件开发生命周期的不同阶段维护多个不同的存储库。通常会有一个“测试”存储库,其中包含刚构建的软件包共勇士使用,他们在软件包发布之前寻找bug。
发行版通常还会有一个“开发”存储库,其中保存了预定要包含在发行版下一个主要发行版中的制品包(work-in-progress package)。

发行版也可能有相关的第三方存储库。通常是为了规避专利、数字版权管理反规避问题等法律问题。这些存储库在软件专利和反规避法律不适用的国家运营。

依赖关系

程序很少是“独立的”,相反,它们依靠其他软件组来完成工作。
例如输入/输出,由许多程序共享的程序处理,这些程序存储在所谓的共享库(shared librarise)中,共享库为多个程序提供基本服务。
如果一个包需要一个共享资源,比如一个共享库,那么它就被称为具有依赖关系。
现代软件包管理系统都提供了一些依赖项解析方法,以确保安装软件包时,其所有依赖项也都已安装。

高级和低级包工具

包管理系统通常由两类工具组成:
发行版 低级别工具 高级别工具
Debian style dpkg apt,apt-get,aptitude
Fedroa,RedHat Enterprise Linux,CentOS rpm yum,dnf

常见包管理任务

以下讨论中,术语package_name指包的实际名称,package_file是包含包的文件的名称。

在存储库中查找包

使用高级别工具搜索存储库元数据,可以根据包的名称或描述来定位包。例如:
风格 命令
Debian apt-get upgrade
apt-cache search search_string
RedHat yum search search_string
例如,以下命令在yum存储库中查找emacs文本编辑器:
yum search emace

从存储库安装包

高级工具允许从存储库下载包,并以完全依赖关系解析的方式安装:
风格 命令
Debian apt-get upgrade
apt-get install search_string
RedHat yum install search_string
例如,在Debian系统上,使用以下命令从apt存储库中安装emacs文本编辑器:
apt-get update; apt-get install emacs

从包文件安装包

如果包文件是从存储库以外的源下载的,则可以使用低级工具直接安装(没有依赖项解析):
风格 命令
Debian dpkg -i package_file
RedHat rpm -i package_file
例如,已经从非存储库网站下载了emacs-22.1-7.fc7-i386.rpm包文件,可以用以下命令安装它:
rpm -i emacs-22.1-7.fc7-i386.rpm
注意,由于低级别工具不执行依赖项解析,如果rpm发现缺少依赖项将会退出并给出错误提示。
类似于FreeBSD中的pkg add

移除包

使用高级工具删除包的命令为:
风格 命令
Debian apt-get remove package_name
RedHat yum erase package_name
例如:Debian系中卸载emacs包可以使用以下命令:
apt-get remove emacs

从存储库升级(updating)包

最常见的软件包管理任务是使系统保持最新版本的软件包。高级工具可以用一个步骤来完成这项重要任务:
风格 命令
Debian apt-get update; apt-get upgrade
RedHat yum update
例如:要将所有可用更新应用到Debian系统上已安装的软件包,可以执行以下命令:
apt-get update; apt-get upgrade

从包文件升级(upgrading)包

如果是从非存储库源下载了软件包的更新版本,可以安装该软件包以替换以前的版本:
风格 命令
Debian dpkg -i package_file
RedHat rpm -U package_file
例如:在RedHat上将现有的emacs安装更新为包文件emacs-22.1-7.fc7-i386.rpm中包含的版本,可以使用以下命令:
rpm -U emacs-22.1-7.fc7-i386.rpm
注意,dpkg没有一个特定的选项来“升级”软件包,而是像“安装”那样。

列出已安装的包

使用以下命令可以列出已经安装的软件包:
风格 命令
Debian dpkg -l
RedHat rpm -qa

确定是否安装了软件包

以下命令用来确定是否安装了某个软件包:
风格 命令
Debian dpkg -s package_name
RedHat rpm -q package_name
例如,要确定emacs软件包是否安装在Debian系统上,可以用以下命令:
dpkg --status emacs

显示已经安装的包的信息

如果已知已安装的软件包的名称,可以用以下命令显示软件包的说明:
风格 命令
Debian apt-cache show package_name
RedHat yum info package_name
例如,要在Debian风格的系统上查看emacs包的描述,我们可以使用以下命令:
apt-cache show emacs

查找文件是哪个包安装的

使用以下命令可以确定哪个软件包负责安装特定文件:
风格 命令
Debian dpkg -s file_name
RedHat rpm -qf file_name
例如,在RedHat系统上查看哪个软件包安装了/usr/bin/vim这个文件,可以使用以下命令:
rpm -qf /usr/bin/vim