第14章:包管理
如果我们在 Linux 社区花上一点时间,就可以听到很多关于哪些发行版是「最佳」的意见。通常这些讨论都很愚蠢,话题聚焦在诸如桌面背景是否漂亮(有些人不想用 Ubuntu 是因为其默认的色彩方案!)和其它琐碎的事情上。
发行版质量的决定性因素是包[管理]系统(packaging system)和发行版支持社区的活跃程度。当我们在 Linux 上花费更多时间,我们看到其软件风貌是非常动态的。事物总是在持续变更。多数顶级 Linux 发行版每六个月就会发行新版本,大量独立的程序每天都在更新。为了跟上这样快节奏的软件暴风雪,我们需要优秀的包管理(package management)工具。
包管理是在系统中安装维护软件的一种方式。今天,大多数人能通过发行版安装包(packages)来满足软件需求。和早期 Linux 相比,那时候还需要下载并编译源码(source code)来安装软件。编译源码一点儿都没问题,事实上,可以接入源码是 Linux 最伟大的奇迹。它给予我们检验和改进系统的能力。拥有预编译包,只不过能更快更容易的处理罢了。
本章中,我们将看一些用来管理包的命令行工具。所有主要的发行版都提供强大且成熟的图形程序用以维护系统,不过学习命令行程序一样重要。它们可以执行那些图形程序难以(或不可能)完成的任务。
包系统
不同的发行版使用不同的包装系统,并且作为一个衡量标准,用于一个发行版的包不兼容于另一发行版的。多数发行版会堕入两大包技术中的一个:Debian 的 .deb 阵营和 Red Hat 的 .rpm 阵营。还有几个重要的例外,如 Gentoo、Slackware、Arch,但其他大部分都在用两大基本系统之一,如表 14-1。
表 14-1:主要包系统家族
包系统
发行版(列出部分)
Debian 风格(.deb)
Debian, Ubuntu, Linux Mint, Raspbian
Red Hat 风格(.rpm)
Fedora, CentOS, Red Hat Enterprise Linux, OpenSUSE
包系统如何工作
专有软件工业中发行软件的方式,通常需要购买一个如「安装盘」的安装介质或者浏览供货方的网站以下载产品,并运行安装向导,以便在系统中安装新的应用程序。
Linux 的工作方式不同于此。实际上所有的 Linux 系统的软件都可以在互联网上找到。大部分会有发行方以包文件(package files)的形式提供,其余则会有可用的源码,以供手动安装。我们会在第 23 章「编译程序」中介绍如何以编译源码的方式安装软件。
包文件
包系统中的软件基本单位是包文件(package file)。一个包文件是一个用来组成软件包的压缩过的文件集。包通常由一些程序和支持程序的数据文件组成。除了被安装的文件之外,包文件还会包含一些包的元数据(metadata),如关于包的文本描述和它的内容。另外,许多包会包含预安装和安装后的脚本,以便在安装之前和之后执行配置任务。
包文件由一个包维护人员(package maintainer)创建,通常(但不是总是)是发行版的供货方的某个职员。包维护人员从上游提供商(upstream provider 即程序的作者)处获得源码形式的软件,编译,并创建包元数据以及必要的安装脚本。通常,包维护员会修改原始的源码,以改进程序与发行版其它部分的集成性能。
仓库
一些软件项目选择执行其自身的包和发行,更多的包则是由发行版供货方和感兴趣的第三方所创建。一个发行版的中央仓库中会包含数以千计的对用户可用的包,每个都是经专门构建并得到维护,以供发行。
一个发行版可以为软件开发生命周期的不同阶段维护几个不同的仓库。例如,通常会有一个「测试」仓库,包含的软件,仅供在发行包之前寻找 bug 的用户使用。一个发行版通常会有一个「开发」仓库,其中保存了旨在包含在发行版的下一个主要版本中的正在进行的工作包。
一个发行版还可以关联第三方仓库。这些通常被提供那些出于法律原因(例如专利或 DRM 反规避问题)而不能包含在发行版中的软件所需要。或许最知名的案例就是加密 DVD 支持,在美国,它是非法的。第三方仓库在那些软件专利和反规避法不适用的国家或地区运营。这些仓库通常是完全独立于它们所支持的发行版,要使用这些,就必须要了解它们并手动将其加入到包管理系统的配置文件中。
依赖关系
很少有程序是「独立」的;它们依靠其它软件组件的存在来完成它们的工作。共同的活动,如输入输出,由许多程序常规共享所处理。这些常规保存在被称为共享库(shared libraries)的地方,共享库负责提供基本的服务给多个程序。如果一个包需要一个共享资源,如共享库,则被称为有一个依赖项(dependency)。现代包管理系统都会提供某种依赖解决方案(dependency resolution)以保证当一个包被安装时,其依赖项都会被安装。
高级别和低级别的包工具
包管理系统通常由两种类型的工具组成。
低级别工具,处理诸如安装移除包文件之类的任务
高级别工具,执行检索元数据和依赖解决方案
本章中,我们将看到 Debian 系的系统(如 Ubuntu 及其它)和 Red Hat 所提供的工具。Red Hat 系的发行版依赖同一个低级别程序 rpm
,同时,也使用不同的高级别工具。我们将会讨论被 RHEL 和 CentOS 等其它 Red Hat 系所用的高级别程序 yum
,及其相对应的特性(如表 14-2)。
表 14-2:包系统工具
发行版
低级别工具
高级别工具
Debian 系
dpkg
apt
, apt-get
, aptitude
Fedora, RHEL, CentOS
rpm
yum
, dnf
常用包管理任务
命令行包管理工具可以执行很多操作。来看一下最常用的。注意低级别工具还支持创建包文件,不过这超出了本书的讨论范围。
在以下的讨论中,术语 package_name
指包的实际名称,而 package_file
是指包含包的文件名称。
在仓库中找到一个包
使用高级别工具,可以通过检索包的名称或描述来定位,见表 14-3。
风格
命令
Debian
apt-get update
apt-cache search searching_string
Red Hat
yum search searching_string
如,要检索 yum
仓库中的 emacs 文本编辑器,我们可以用这个命令:
从仓库中安装一个包
高级别工具许可从仓库下载一个包,安装这个包及其所有依存关系。见表 14-4。
表 14-4:包安装命令
风格
命令
Debian
apt-get update
apt-get install package_name
Red Hat
yum install package_name
如,在 Debian 系统中从一个 apt
仓库安装 emacs 文本编辑器,用下面这个命令:
从一个包文件安装一个包
如果不是从仓库中下载了一个包文件,(尽管没有依赖关系解决方案)可以直接用低级别工具安装。见表 14-5。
表 14-5:低级别包安装命令
风格
命令
Debian
dpkg -i package_file
Red Hat
rpm -i package_file
如果已经从一个非仓库站点下载了 emacs-22.1-7.fc7-i386.rpm
包文件,可以通过这种方式安装:
注意:因为该技术使用了低级别
rpm
程序来执行安装,没有执行依赖关系解决方案。如果rpm
发现缺失依赖,会报错并退出。
移除一个包
可以通过高级别或低级别工具卸载包。高级别工具如表 14-6 所示。
表 14-6:包移除命令
风格
命令
Debian
apt-get remove package_name
Red Hat
yum erase package_name
如需从 Debian 系的系统中卸载 emacs 包,我们用这个命令:
从仓库更新包
最常用的包管理任务是保持系统的包为最新版本。高级别工具用一个步骤来执行这一关键任务,见表 14-7。
表 14-7:包更新命令
风格
命令
Debian
apt-get update; apt-get upgrade
Red Hat
yum update
例如要在 Debian 系的系统中更新系统中所有的包,我们可以用这个命令:
从包文件升级包
如果从一个非仓库源头下载了一个更新版本的包,可以安装替换之前的版本,见表 14-8。
表 14-:低级别包升级命令
风格
命令
Debian
dpkg -i package_file
Red Hat
rpm -U package_file
例如,在 Red Hat 系统中更新 emacs 到 emacs-22.1-7.fc7-i386.rpm
文件所包含的版本,用下列命令:
注意:对比
rpm
,dpkg
没有一个特别的选项供升级包。
列出已安装的包
表 14-9 列出的命令,可以让我们用来列出系统中所有已安装的包。
表 14-9:包列表命令
风格
命令
Debian
dpkg -l
Red Hat
rpm -qa
检查一个包是否被安装
表 14-10 列出了可以用来显示某个特定的包是否被安装的低级别工具。
表 14-10:包状态命令
风格
命令
Debian
dpkg -s package_name
Red Hat
rpm -q package_name
例如要在 Debian 系的系统中检查是否安装了 emacs 包,可以用这条命令:
显示一个已安装包的信息
如果知道一个已安装包的名字,可以用表 14-11 中的命令显示该包的描述。
表 14-11:包信息命令
风格
命令
Debian
apt-cache show package_name
Red Hat
yum info package_name
例如要察看 Debian 系的系统中 emacs 包的描述,可以用这条命令:
判断是哪个包安装的文件
要判定特定文件是由哪个包负责安装的,我们可以用表 14-12 中的命令。
表 14-12:包文件鉴定命令
风格
命令
Debian
dpkg -S file_name
Red Hat
rpm -qf file_name
如果要在 Red Hat 系统中察看哪个包安装了 /usr/bin/vim
文件,可以用这条命令:
总结
在接下来的章节中,我们将探索很多不同的程序,它们广泛分布于不同的应用领域。系统会默认安装其中的大部分程序,同时,我们需要安装那些必须用到的而没有被安装的程序。有了我们新近掌握的包管理知识(和理解),安装和管理我们所需的程序,应该就不成问题了。
Linux 软件安装之谜
从其它平台迁移过来的用户,有时可能会成为受害者,会认为在 Linux 安装软件很困难,而且不同的发行版使用不同的包装方案也是一个障碍。好吧,是一个障碍,但是仅对那些想以仅有二进制版本发行秘密软件的专属软件提供者而言。
Linux 软件生态系统基于开源的理念。如果一个程序开发人员发行了某个程序的源代码,类似于一个与发行版相关联的人将打包一个程序,并将其纳入他们的软件仓库中。这种方式保证了程序能很好的集成到发行版中,并给予软件用户「一站式采购」的方便,比起用户必须去每个程序的网站上检索要方便。近来主要的专属平台供货方也已经开始模仿该理念建立应用程序商店了。
设备驱动程序的处理方式大致相同,只是它们不是发行版中的单独项目,而是成为 Linux 内核的一部分。一般说来,Linux 中没有「驱动盘」这种东西。无论内核是否支持一个设备,内核支持非常多的设备。事实上,比 Windows 更多。当然,如果不支持你需要的特定设备,这无关紧要。发生这一情况时,需要了解一下原因。缺乏驱动支持通常由以下三者之一导致:
设备太新。许多硬件厂商并不积极支持 Linux 开发,需要由 Linux 社区成员给内核写驱动代码。这需要时间。
设备太另类。不是所有的发行版都包含任一可能的设备驱动。每个发行版建立其自身的内核,由于内核有非常强的可配置性(这就是使得 Linux 能过运行在小到腕表大到大型服务器的原因),可能会忽略某个特定的设备。通过查找下载驱动程序的源代码,你(对,就是你自己)可以编译安装驱动。这个过程不是非常困难,但是涉及很多(知识)。在后续章节中我们会谈到如何编译软件。
硬件厂商隐藏了某些东西。它既没有发布 Linux 驱动程序的源代码,也没有发布技术文档供人们创建驱动。 这意味着硬件供应商正试图保密设备的编程接口。由于我们不希望在我们的计算机中使用秘密设备,因此最好避免使用此类产品。
扩展阅读
花些时间去了解你所用发行版的包管理系统。每个发行版都会提供其自身包管理工具的文档。另外,这里有一下普通的资源:
Last updated
Was this helpful?