包管理系统简介
曾几何时,软件都是通过 FTP 或邮件列表(即通过邮件列表发布源代码的补丁包)来分发的(最终这些发布方式在互联网的迅猛发展下都演化成为一个个现今常见的软件发布网站)。(一般在一个 tar 文件中)只有一个非常小的文件包含了创建二进制的说明。你需要做的是先解压这个包,然后仔细阅读当中的 README 文件, 然后通过./configure、make、make install进行软件安装。可以想象,为你系统上的每一个软件都执行上述的流程将是多么无聊费时,更不用说如果更新一个已经安装的软件将会多复杂,多么需要精力投入。
软件包(package)这个概念是用来解决在软件安装、升级过程中的复杂性的。包将软件安装升级中需要的多个数据文件合并成一个单独的文件,这将便于传输和(通过压缩文件来)减小存储空间,包中的二进制可执行文件已根据开发者所选择的编译标识预编译。包本身包括了所有需要的元数据,如软件的名字、软件的说明、版本号,以及要运行这个软件所需要的依赖包等等。
不同流派的 Linux 发行版都创造了它们自己的包格式,其中最常用的包格式有:
- .deb:这种包格式由 Debian、Ubuntu、Linux Mint 以及其它的变种使用。这是最早被发明的包类型。
- .rpm:这种包格式最初被称作 红帽包管理器(Red Hat Package Manager)(LCTT 译注: 取自英文的首字母)。使用这种包的 Linux 发行版有 Red Hat、Fedora、SUSE 以及其它一些较小的发行版。
- .tar.xz:这种包格式只是一个软件压缩包而已,这是 Arch Linux 所使用的格式。(LCTT 译注:这种格式无需特别的包管理器,解压即可)
尽管上述的包格式自身并不能直接管理软件的依赖问题,但是它们的出现将 Linux 软件包管理向前推进了一大步。
多年以前,非 Linux 世界的用户是很难理解软件仓库的概念的。甚至今时今日,大多数完全工作在 Windows 下的用户还是习惯于打开浏览器,搜索要安装的软件(或升级包),下载然后安装。但是,智能手机传播了软件商店(AppStore/应用)市场这样一个概念。智能手机用户获取软件的方式和包管理器的工作方式已经非常相近了。些许不同的是,尽管大多数软件商店还在费力美化它的图形界面来吸引用户,大多数 Linux 用户还是愿意使用命令行来安装软件。总而言之,软件仓库是一个中心化的可安装软件列表,上面列举了在当前系统中预先配置好的软件仓库里所有可以安装的软件。
在Linux发行版中,几乎每一个发行版都有自己的包管理器。常见的有:
- Debian的dpkg以及它的
- 前端apt(使用于Debian、Ubuntu)。
- Red Hat的RPM包管理器以及它的
- 前端dnf(使用于Fedora、 CentOS 8)
- 前端yum(使用于Red Hat Enterprise Linux、CentOS 7及以下)
- 前端ZYpp(使用于openSUSE)
- 前端urpmi(使用于Mandriva Linux、Mageia)
- 其他包管理器有
- ArchLinux中使用的Pacman
- Gentoo使用的基于源代码的Portage
- Mac系统下的Homebrew等
使用包管理器将大大简化在Linux发行版中安装软件的过程。
有了包管理器为什么还要有其前端工具?
包管理器如RPM与DPKG只能做到检查相依性,在安装或移除时告知相依性的不满足,接下来就需要用户自行去找出所需的组件来安装。 这样非常不方便,为了实现可以自动处理依赖性关系,并且一次安装所有依赖的软体包,无须繁琐地一次次下载、安装,前端工具如APT及YUM就诞生了。
基于 Debian 的包管理器
dpkg
dpkg 是Debian Packager的简写。为 Debian专门开发的套件管理系统,方便软件的安装、更新及移除。软件都是以.deb结尾的编译好的二进制包。所有源自“Debian”的“Linux ”发行版都使用 “dpkg”,例如 “Ubuntu”、“Knoppix ”等。
常用命令:
apt
APT(全称为Advanced Packaging Tools)与 YUM对应, 是Linux下的一款安装包管理工具。APT由几个名字以“apt-”打头的程序组成。apt-get、apt-cache 和apt-cdrom是处理软件包的命令行工具。
常用命令:
apt与apt-get命令的区别
Ubuntu 16.04 发布时,一个引人注目的新特性便是 apt 命令的引入。其实早在 2014 年,apt 命令就已经发布了第一个稳定版,只是直到 2016 年的 Ubuntu 16.04 系统发布时才开始引人关注。随着 apt install package 命令的使用频率和普遍性逐步超过 apt-get install package,越来越多的其它 Linux 发行版也开始遵循 Ubuntu 的脚步,开始鼓励用户使用 apt 而不是 apt-get。那么,apt-get 与 apt 命令之间到底有什么区别呢?如果它们有类似的命令结构,为什么还需要新的 apt 命令呢?是否 apt 真的比 apt-get 更好?普通用户应该使用新的 apt 命令还是坚持旧有习惯继续使用 apt-get 呢?
在开始对比 apt 与 apt-get 命令的区别之前,我们先来看看这两个命令的背景,以及它们要试图达到的目的。Debian 作为 Ubuntu、Linux Mint 和 elementary OS 等 Linux 操作系统的母板,其具有强健的「包管理」系统,它的每个组件和应用程序都内置在系统中安装的软件包中。Debian 使用一套名为 Advanced Packaging Tool(APT)的工具来管理这种包系统,不过请不要把它与 apt 命令混淆,它们之间是其实不是同一个东西。在基于 Debian 的 Linux 发行版中,有各种工具可以与 APT 进行交互,以方便用户安装、删除和管理的软件包。apt-get 便是其中一款广受欢迎的命令行工具,另外一款较为流行的是 Aptitude 这一命令行与 GUI 兼顾的小工具。
如果你已阅读apt-get 命令指南,可能已经遇到过许多类似的命令,如apt-cache、apt-config 等。如你所见,这些命令都比较低级又包含众多功能,普通的 Linux 用户也许永远都不会使用到。换种说法来说,就是最常用的 Linux 包管理命令都被分散在了 apt-get、apt-cache 和 apt-config 这三条命令当中。apt 命令的引入就是为了解决命令过于分散的问题,它包括了 apt-get 命令出现以来使用最广泛的功能选项,以及 apt-cache 和 apt-config 命令中很少用到的功能。在使用 apt 命令时,用户不必再由 apt-get 转到 apt-cache 或 apt-config,而且 apt 更加结构化,并为用户提供了管理软件包所需的必要选项。简单来说就是:apt = apt-get、apt-cache 和 apt-config 中最常用命令选项的集合。
通过 apt 命令,用户可以在同一地方集中得到所有必要的工具,apt 的主要目的是提供一种以「让终端用户满意」的方式来处理 Linux 软件包的有效方式。apt 具有更精减但足够的命令选项,而且参数选项的组织方式更为有效。除此之外,它默认启用的几个特性对最终用户也非常有帮助。例如,可以在使用 apt 命令安装或删除程序时看到进度条。apt 还会在更新存储库数据库时提示用户可升级的软件包个数。如果你使用 apt 的其它命令选项,也可以实现与使用 apt-get 时相同的操作。
虽然 apt 与 apt-get 有一些类似的命令选项,但它并不能完全向下兼容 apt-get 命令。也就是说,可以用 apt 替换部分 apt-get 系列命令,但不是全部。
apt 命令 | 取代的命令 | 命令的功能 |
apt install | apt-get install | 安装软件包 |
apt remove | apt-get remove | 移除软件包 |
apt purge | apt-get purge | 移除软件包及配置文件 |
apt update | apt-get update | 刷新存储库索引 |
apt upgrade | apt-get upgrade | 升级所有可升级的软件包 |
apt autoremove | apt-get autoremove | 自动删除不需要的包 |
apt full-upgrade | apt-get dist-upgrade | 在升级软件包时自动处理依赖关系 |
apt search | apt-cache search | 搜索应用程序 |
apt show | apt-cache show | 显示装细节 |
当然,apt 还有一些自己的命令:
新的apt命令 | 命令的功能 |
apt list | 列出包含条件的包(已安装,可升级等) |
apt edit-sources | 编辑源列表 |
需要大家注意的是:apt 命令也还在不断发展, 因此,你可能会在将来的版本中看到新的选项。
目前还没有任何 Linux 发行版官方放出 apt-get 将被停用的消息,至少它还有比 apt 更多、更细化的操作功能。对于低级操作,仍然需要 apt-get。既然两个命令都有用,那么我该使用 apt 还是 apt-get 呢?作为一个常规 Linux 用户,建议大家尽快适应并开始首先使用 apt。不仅因为广大 Linux 发行商都在推荐 apt,更主要的还是它提供了 Linux 包管理的必要选项。最重要的是,apt 命令选项更少更易记,因此也更易用,所以没理由继续坚持 apt-get。
基于 RPM 包格式的包管理器
rpm
RPM包管理员(简称RPM,全称为The RPM Package Manager或Redhat Package Manager)是在Linux下广泛使用的软件包管理器。使用RPM的发行版:
- Fedora和Red Hat Enterprise Linux
- openSUSE和SUSE Linux Enterprise
- Mandriva Linux和Mageia
- PCLinuxOS
RPM软件包分为二进制包(Binary)、源代码包(Source)和Delta包三种。二进制包可以直接安装在计算机中,而源代码包将会由RPM自动编译、安装。源代码包经常以src.rpm作为后缀名。RPM仅适用于安装用RPM来打包的软件,目前是GNU/Linux下软件包资源最丰富的软件包类型之一。
rpm的常用命令:
yum
yum是一个用于管理rpm包的后台程序,用python写成,可以非常方便的解决rpm的依赖关系。在建立好yum服务器后,yum客户端可以通过 http、ftp方式获得软件包,并使用方便的命令直接管理、更新所有的rpm包,甚至包括kernel的更新。
yum的常用命令:
查询相关:
dnf
DNF 是新一代的rpm软件包管理器。他首先出现在 Fedora 18 这个发行版中。而最近,它取代了yum,正式成为 Fedora 22 的包管理器。DNF包管理器克服了YUM包管理器的一些瓶颈,提升了包括用户体验,内存占用,依赖分析,运行速度等多方面的内容。DNF使用 RPM, libsolv 和 hawkey 库进行包管理操作。尽管它没有预装在 CentOS 和 RHEL 7 中,但你可以在使用 YUM 的同时使用 DNF 。
dnf的常用命令:
DNF 和 Yum 的区别
由于 Yum 中许多长期存在的问题仍未得到解决,这些问题包括性能差、内存占用过多、依赖解析速度变慢等。因此 Yum 包管理器已被 DNF 包管理器取代。
编号 | DNF(Dandified YUM) | YUM(Yellowdog Updater, Modified) |
1 | DNF 使用 libsolv 来解析依赖关系,由 SUSE 开发和维护 | YUM 使用公开的 API 来解析依赖关系 |
2 | API 有完整的文档 | API 没有完整的文档 |
3 | 由 C、C++、Python 编写的 | 只用 Python 编写 |
4 | DNF 目前在 Fedora、RHEL 8、CentOS 8、OEL 8 和 Mageia 6/7 中使用 | YUM 目前在 RHEL 6/7、CentOS 6/7、OEL 6/7 中使用 |
5 | DNF 支持各种扩展 | Yum 只支持基于 Python 的扩展 |
6 | API 有良好的文档,因此很容易创建新的功能 | 因为 API 没有正确的文档化,所以创建新功能非常困难 |
7 | DNF 在同步存储库的元数据时,使用的内存较少 | 在同步存储库的元数据时,YUM 使用了过多的内存 |
8 | DNF 使用满足性算法来解决依赖关系解析(它是用字典的方法来存储和检索包和依赖信息) | 由于使用公开 API 的原因,Yum 依赖性解析变得迟钝 |
9 | 从内存使用量和版本库元数据的依赖性解析来看,性能都不错 | 总的来说,在很多因素的影响下,表现不佳 |
10 | DNF 更新:在 DNF 更新过程中,如果包中包含不相关的依赖,则不会更新 | YUM 将在没有验证的情况下更新软件包 |
11 | 如果启用的存储库没有响应,DNF 将跳过它,并继续使用可用的存储库处理事务 | 如果有存储库不可用,YUM 会立即停止 |
12 | dnf update 和 dnf upgrade 是等价的 | 在 Yum 中则不同 |
13 | 安装包的依赖关系不更新 | Yum 为这种行为提供了一个选项 |
14 | 清理删除的包:当删除一个包时,DNF 会自动删除任何没有被用户明确安装的依赖包 | Yum 不会这样做 |
15 | 存储库缓存更新计划:默认情况下,系统启动后 10 分钟后,DNF 每小时会对配置的存储库检查一次更新。这个动作由系统定时器单元 dnf-makecache.timer 控制 | Yum 也会这样做 |
6 | 内核包不受 DNF 保护。不像 Yum,你可以删除所有的内核包,包括运行中的内核包 | Yum 不允许你删除运行中的内核 |
17 | libsolv:用于解包和读取资源库。hawkey: 为 libsolv 提供简化的 C 和 Python API 库。librepo: 提供 C 和 Python(类似 libcURL)API 的库,用于下载 Linux 存储库元数据和软件包。libcomps: 是 yum.comps 库的替代品。它是用纯 C 语言编写的库,有 Python 2 和 Python 3 的绑定。 | Yum 不使用单独的库来执行这些功能 |
18 | DNF 包含 29000 行代码 | Yum 包含 56000 行代码 |
19 | DNF 由 Ales Kozumplik 开发 | YUM 由 Zdenek Pavlas、Jan Silhan 和团队成员开发 |
zypp
Zypper 是用来管理 RPM 包的另外一个包管理器。这个包管理器主要用于 SUSE(和 openSUSE),在MeeGo、Sailfish OS、Tizen 上也有使用。它最初开发于 2006 年,已经经过了多次迭代。除了作为系统管理工具 YaST 的后端和有些用户认为它比 YUM 要快之外也没有什么好多说的。
zyppd的常用命令:
urpmi
urpmi是Mageia/MandrivaLinux及其派生发布版的软件包管理系统,用于安装、移除、升级和查询本机或远程(即提供软件包的服务器)的软件包。它解决了RPM包管理员容易让用户经常遇到相依性地狱的问题。它可以从官方或非官方的来源获得软件包(非官方来源如企鹅解放阵线)。它有一个图形前端:Rpmdrake。 除了被MandrivaLinux所使用外,它也被用在MageiaLinux(一个基于MandrivaLinux的派生版本),以及ROSALinux(同样是基于MandrivaLinux的分支)。
urpmi系列命令:
主要的 urpmi 配置文件 :
基于 Arch 的包管理器
Arch Linux 使用称为 pacman 的包管理器。和 .deb 以及 .rpm 不同,它使用更为传统的 LZMA2 压缩包形式 .tar.xz 。这可以使 Arch Linux 包能够比其它形式的压缩包(如 gzip)有更小的尺寸。自从 2002 年首次发布以来, pacman 一直在稳定发布和改善。使用它最大的好处之一是它支持 Arch Build System,这是一个从源代码级别构建包的构建系统。该构建系统借助一个叫 PKGBUILD 的文件,这个文件包含了如版本号、发布号、依赖等等的元数据,以及一个为编译遵守 Arch Linux 需求的包所需要的带有必要的编译选项的脚本。而编译的结果就是前文所提的被 pacman 所使用的 .tar.xz 的文件。
上述的这套系统技术上导致了 Arch 用户仓库(Arch User Respository)(AUR)的产生,这是一个社区驱动的软件仓库,仓库里包括有 PKGBUILD 文件以及支持补丁或脚本。这给 Arch Linux 带了无穷无尽的软件资源。最为明显的好处是如果一个用户(或开发者)希望他开发的软件能被广大公众所使用,他不必通过官方途径去在主流软件仓库获得许可。而不利之处则是它必须将依赖社区的流程,类似于 Docker Hub、 Canonical 的 Snap Packages,或者其它类似的机制。有很多特定于 AUR 的包管理器能被用来从 AUR 里的 PGKBUILD 文件下载、编译、安装。
使用 pacman 和官方软件仓库
Arch 的主要包管理器:pacman,使用标识位而不是像 yum 或 apt 一样使用命令词。例如,要搜索一个包,你要用 pacman -Ss 。和 Linux 上别的命令一样,你可以找到 pacman 的手册页和在线帮助。pacman 大多数的命令都使用了同步(-S)这个标识位。
参考链接: