D11:常见任务和基本工具之一
包管理
对于发行版的质量来说,最重要的决定因素是包管理系统和发行版社区的活力,而不是桌面背景的美观以及其他琐事。
大多数顶级Linux发行版每六个月发布一次新版本,每天都有许多单独的程序更新。所以需要一个好的软件包管理工具。
软件包管理是在系统上安装和维护软件的一种方法。早期的Linux用户必须下载并编译源代码才能安装软件。
目录:
- 包系统
- 包系统如何工作
- 常见包管理任务
- 在存储库中查找包
- 从存储库安装包
- 从包文件安装包
- 移除包
- 从存储库升级(updating)包
- 从包文件升级(upgrading)包
- 列出已安装的包
- 确定是否安装了软件包
- 显示已经安装的包的信息
- 查找文件是哪个包安装的
包系统
不同的发行版使用不同的包管理系统,一般来说,一个发行版的包管理系统与另一个发行版不兼容。
大多数发行版属于两大包管理系统阵营之一:
- Debian的.deb阵营
Debian、Ubuntu、Linux Mint、Raspbian
- RedHat的.rpm阵营
Fedora、CentOS、RedHat Enterprise Linux、OpenSues
也有例外,比如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