软件包管理器的演变

软件包管理器在 Linux 软件管理中发挥着重要作用。本文将对比一些主要的软件包管理器。
241 位读者喜欢这篇文章。
A guide to packing and preparing for a tech conference

Opensource.com

每台计算机设备都使用某种形式的软件来执行其预期的任务。在软件的早期,产品都经过严格的错误和其他缺陷测试。在过去的十年左右,软件通过互联网发布,目的是通过应用软件的新版本来修复任何错误。在某些情况下,每个单独的应用程序都有自己的更新程序。在其他情况下,则由用户自己决定如何获取和升级软件。

Linux 很早就采用了维护一个中心位置的做法,用户可以在这里查找和安装软件。在本文中,我将讨论 Linux 上软件安装的历史,以及现代操作系统如何针对永无止境的 CVE 洪流保持更新。

在软件包管理器出现之前,Linux 上的软件是如何安装的?

历史上,软件是通过 FTP 或邮件列表提供的(最终这种分发方式会扩展到包括基本网站)。只有几个小文件包含了创建二进制文件的指令(通常在 tar 文件中)。您需要解压文件,阅读自述文件,只要您有 GCC 或其他形式的 C 编译器,您通常会运行一个 ./configure 脚本,其中包含一些属性列表,例如库文件的路径、创建新二进制文件的位置等。此外,configure 过程会检查您的系统是否存在应用程序依赖项。如果缺少任何主要要求,configure 脚本将退出,并且在满足所有依赖项之前,您将无法继续安装。如果 configure 脚本成功完成,则会创建一个 Makefile

一旦存在 Makefile,您将继续运行 make 命令(此命令由您正在使用的编译器提供)。make 命令有许多称为make 标志的选项,这些选项有助于优化系统生成的二进制文件。在计算的早期,这非常重要,因为硬件很难跟上现代软件的需求。今天,编译选项可以更加通用,因为大多数硬件对于现代软件来说已经足够充分了。

最后,在 make 过程完成后,您需要运行 make install(或 sudo make install)才能实际安装软件。您可以想象,为每个软件都这样做是耗时且乏味的——更不用说更新软件是一个复杂且可能非常繁琐的过程了。

什么是软件包?

软件包的发明是为了应对这种复杂性。软件包将多个数据文件收集到一个单独的存档文件中,以便于携带和存储,或者只是压缩文件以减少存储空间。软件包中包含的二进制文件是根据开发人员选择的合理默认值预编译的。软件包还包含元数据,例如软件的名称、其用途的描述、版本号以及软件正常运行所必需的依赖项列表。

几种 Linux 发行版创建了自己的软件包格式。一些最常用的软件包格式包括

  • .deb:此软件包格式由 Debian、Ubuntu、Linux Mint 和其他几个衍生发行版使用。它是第一个被创建的软件包类型。
  • .rpm:此软件包格式最初称为 Red Hat Package Manager。它由 Red Hat、Fedora、SUSE 和其他几个较小的发行版使用。
  • .tar.xz:虽然它只是一个压缩的 tarball,但这是 Arch Linux 使用的格式。

虽然软件包本身并不直接管理依赖项,但它们代表了 Linux 软件管理向前迈进的一大步。

什么是软件仓库?

几年前,在智能手机普及之前,如果用户没有参与 Linux 生态系统,那么软件仓库的概念对许多用户来说很难理解。时至今日,大多数 Windows 用户似乎仍然习惯于打开 Web 浏览器来搜索和安装新软件。然而,那些拥有智能手机的人已经习惯了软件“商店”的概念。智能手机用户获取软件的方式与软件包管理器的工作方式并无不同。虽然已经有人尝试为软件仓库制作有吸引力的 UI,但绝大多数 Linux 用户仍然使用命令行来安装软件包。软件仓库是系统配置使用的任何仓库中所有可用软件的集中列表。以下是一些搜索特定软件包仓库的示例(请注意,这些示例为了简洁起见已被截断)

使用 aurman 的 Arch Linux

user@arch ~ $  aurman -Ss kate

extra/kate 18.04.2-2 (kde-applications kdebase)
    Advanced Text Editor
aur/kate-root 18.04.0-1 (11, 1.139399)
    Advanced Text Editor, patched to be able to run as root
aur/kate-git r15288.15d26a7-1 (1, 1e-06)
    An advanced editor component which is used in numerous KDE applications requiring a text editing component

使用 YUM 的 CentOS 7

[user@centos ~]$ yum search kate

kate-devel.x86_64 : Development files for kate
kate-libs.x86_64 : Runtime files for kate
kate-part.x86_64 : Kate kpart plugin

使用 APT 的 Ubuntu

user@ubuntu ~ $ apt search kate
Sorting... Done
Full Text Search... Done

kate/xenial 4:15.12.3-0ubuntu2 amd64
  powerful text editor

kate-data/xenial,xenial 4:4.14.3-0ubuntu4 all
  shared data files for Kate text editor

kate-dbg/xenial 4:15.12.3-0ubuntu2 amd64
  debugging symbols for Kate

kate5-data/xenial,xenial 4:15.12.3-0ubuntu2 all
  shared data files for Kate text editor

最突出的软件包管理器有哪些?

如上面的输出所示,软件包管理器用于与软件仓库交互。以下是一些最突出的软件包管理器的简要概述。

基于 RPM 的软件包管理器

更新基于 RPM 的系统,特别是那些基于 Red Hat 技术的系统,有着非常有趣和详细的历史。事实上,当前版本的 yum(用于企业发行版)和 DNF(用于社区)结合了几个开源项目来提供其当前的功能。

最初,Red Hat 使用了一个名为 RPM(Red Hat Package Manager)的软件包管理器,它至今仍在使用。但是,它的主要用途是安装您本地拥有的 RPM,而不是搜索软件仓库。名为 up2date 的软件包管理器被创建出来,以告知用户软件包的更新,并使他们能够搜索远程仓库并轻松安装依赖项。虽然它达到了目的,但一些社区成员认为 up2date 存在一些重大缺陷。

当前版本的 yum 来自几个不同的社区努力。Yellowdog Updater (YUP) 是在 1999-2001 年由 Terra Soft Solutions 的人员开发的,作为 Yellow Dog Linux 的图形安装程序的后端引擎。杜克大学喜欢 YUP 的想法,并决定对其进行改进。他们创建了 Yellowdog Updater, Modified (yum),它最终被改编用于帮助管理大学的 Red Hat Linux 系统。Yum 的受欢迎程度不断提高,到 2005 年,估计 Linux 市场上有一半以上的人在使用它。今天,几乎每个使用 RPM 的 Linux 发行版都使用 yum 进行软件包管理(少数值得注意的例外除外)。

使用 yum

为了让 yum 从互联网仓库下载和安装软件包,文件必须位于 /etc/yum.repos.d/ 中,并且它们必须具有扩展名 .repo。这是一个示例 repo 文件

[local_base]
name=Base CentOS  (local)
baseurl=http://7-repo.apps.home.local/yum-repo/7/
enabled=1
gpgcheck=0

这是我的本地仓库之一,这解释了为什么 GPG 检查被关闭。如果此检查开启,则每个软件包都需要使用加密密钥签名,并且需要将相应的密钥导入到接收更新的系统中。因为我自己维护这个仓库,所以我信任这些软件包,并且不费心对它们进行签名。

一旦仓库文件就位,您就可以开始从远程仓库安装软件包。最基本的命令是 yum update,它将更新当前安装的每个软件包。这不需要特定的步骤来刷新有关仓库的信息;这是自动完成的。下面显示了命令的示例

[user@centos ~]$ sudo yum update
Loaded plugins: fastestmirror, product-id, search-disabled-repos, subscription-manager
local_base                             | 3.6 kB  00:00:00     
local_epel                             | 2.9 kB  00:00:00     
local_rpm_forge                        | 1.9 kB  00:00:00     
local_updates                          | 3.4 kB  00:00:00     
spideroak-one-stable                   | 2.9 kB  00:00:00     
zfs                                    | 2.9 kB  00:00:00     
(1/6): local_base/group_gz             | 166 kB  00:00:00     
(2/6): local_updates/primary_db        | 2.7 MB  00:00:00     
(3/6): local_base/primary_db           | 5.9 MB  00:00:00     
(4/6): spideroak-one-stable/primary_db |  12 kB  00:00:00     
(5/6): local_epel/primary_db           | 6.3 MB  00:00:00     
(6/6): zfs/x86_64/primary_db           |  78 kB  00:00:00     
local_rpm_forge/primary_db             | 125 kB  00:00:00     
Determining fastest mirrors
Resolving Dependencies
--> Running transaction check

如果您确定要 yum 执行任何命令而无需停止输入,则可以在命令中添加 -y 标志,例如 yum update -y

安装新软件包同样容易。首先,使用 yum search 搜索软件包的名称

[user@centos ~]$ yum search kate

artwiz-aleczapka-kates-fonts.noarch : Kates font in Artwiz family
ghc-highlighting-kate-devel.x86_64 : Haskell highlighting-kate library development files
kate-devel.i686 : Development files for kate
kate-devel.x86_64 : Development files for kate
kate-libs.i686 : Runtime files for kate
kate-libs.x86_64 : Runtime files for kate
kate-part.i686 : Kate kpart plugin

一旦您获得了软件包的名称,您就可以使用 sudo yum install kate-devel -y 简单地安装软件包。如果您安装了不再需要的软件包,则可以使用 sudo yum remove kate-devel -y 将其删除。默认情况下,yum 将删除软件包及其依赖项。

有时您可能不知道软件包的名称,但您知道实用程序的名称。例如,假设您正在查找实用程序 updatedb,它创建/更新 locate 命令使用的数据库。尝试安装 updatedb 会返回以下结果

[user@centos ~]$ sudo yum install updatedb
Loaded plugins: fastestmirror, langpacks
Loading mirror speeds from cached hostfile
No package updatedb available.
Error: Nothing to do

您可以通过运行以下命令来查找实用程序来自哪个软件包

[user@centos ~]$ yum whatprovides *updatedb
Loaded plugins: fastestmirror, langpacks
Loading mirror speeds from cached hostfile

bacula-director-5.2.13-23.1.el7.x86_64 : Bacula Director files
Repo        : local_base
Matched from:
Filename    : /usr/share/doc/bacula-director-5.2.13/updatedb

mlocate-0.26-8.el7.x86_64 : An utility for finding files by name
Repo        : local_base
Matched from:
Filename    : /usr/bin/updatedb

我在命令前面使用星号 * 的原因是 yum whatprovides 使用文件路径来匹配。由于我不确定文件位于何处,因此我使用星号来指示任何路径。

当然,yum 还有更多选项可用。我鼓励您查看 yum 的手册页以获取更多选项。

Dandified Yum (DNF) 是 yum 的较新版本。它在 Fedora 18 中引入,但尚未在企业发行版中采用,因此主要用于 Fedora(及其衍生发行版)。它的用法几乎与 yum 完全相同,但它的构建目的是为了解决性能不佳、API 文档不完善、依赖项解析缓慢/损坏以及偶尔的高内存使用率等问题。DNF 旨在作为 yum 的直接替代品,因此我不会重复这些命令——无论您在何处使用 yum,只需替换为 dnf 即可。

使用 Zypper

Zypper 是另一个旨在帮助管理 RPM 的软件包管理器。此软件包管理器最常与 SUSE(和 openSUSE)相关联,但也已被 MeeGoSailfish OSTizen 采用。它最初于 2006 年推出,并一直在迭代改进。除了 Zypper 被用作系统管理工具 YaST 的后端之外,没有什么可说的,并且一些用户发现它比 yum 更快。

Zypper 的用法与 yum 非常相似。要搜索、更新、安装或删除软件包,只需使用以下命令

zypper search kate
zypper update
zypper install kate
zypper remove kate

在如何将仓库添加到系统中,zypper 存在一些主要差异。与上面讨论的软件包管理器不同,zypper 使用软件包管理器本身添加仓库。最常见的方法是通过 URL,但 zypper 也支持从 repo 文件导入。

suse:~ # zypper addrepo http://download.videolan.org/pub/vlc/SuSE/15.0 vlc
Adding repository 'vlc' [done]
Repository 'vlc' successfully added

Enabled     : Yes
Autorefresh : No
GPG Check   : Yes
URI         : http://download.videolan.org/pub/vlc/SuSE/15.0
Priority    : 99

您可以使用类似的方式删除仓库

suse:~ # zypper removerepo vlc
Removing repository 'vlc' ...................................[done]
Repository 'vlc' has been removed.

使用 zypper repos 命令查看系统上仓库的状态

suse:~ # zypper repos
Repository priorities are without effect. All enabled repositories share the same priority.

#  | Alias                     | Name                                    | Enabled | GPG Check | Refresh
---+---------------------------+-----------------------------------------+---------+-----------+--------
 1 | repo-debug                | openSUSE-Leap-15.0-Debug                | No      | ----      | ----   
 2 | repo-debug-non-oss        | openSUSE-Leap-15.0-Debug-Non-Oss        | No      | ----      | ----   
 3 | repo-debug-update         | openSUSE-Leap-15.0-Update-Debug         | No      | ----      | ----   
 4 | repo-debug-update-non-oss | openSUSE-Leap-15.0-Update-Debug-Non-Oss | No      | ----      | ----   
 5 | repo-non-oss              | openSUSE-Leap-15.0-Non-Oss              | Yes     | ( p) Yes  | Yes    
 6 | repo-oss                  | openSUSE-Leap-15.0-Oss                  | Yes     | ( p) Yes  | Yes     

zypper 甚至具有类似的能力来确定哪个软件包名称包含文件或二进制文件。与 YUM 不同,它在命令中使用连字符(尽管这种搜索方法已被弃用)

localhost:~ # zypper what-provides kate
Command 'what-provides' is replaced by 'search --provides --match-exact'.
See 'help search' for all available options.
Loading repository data...
Reading installed packages...

S  | Name | Summary              | Type       
---+------+----------------------+------------
i+ | Kate | Advanced Text Editor | application
i  | kate | Advanced Text Editor | package  

与 YUM 和 DNF 一样,Zypper 具有比此处介绍的更丰富的功能集。请查阅官方文档以获取更深入的信息。

基于 Debian 的软件包管理器

作为目前维护的最古老的 Linux 发行版之一,Debian 的系统与基于 RPM 的系统非常相似。它们使用 .deb 软件包,这些软件包可以由名为 dpkg 的工具管理。dpkgrpm 非常相似,因为它旨在管理本地可用的软件包。它不进行依赖项解析(尽管它进行依赖项检查),并且没有可靠的方式与远程仓库交互。为了改善用户体验和易用性,Debian 项目委托了一个名为 Deity 的项目。这个代号最终被放弃并更改为 Advanced Package Tool (APT)

APT 于 1998 年发布了测试版本(在 1999 年 Debian 2.1 中出现之前),许多用户认为 APT 是基于 Debian 的系统的决定性特征之一。它以类似于基于 RPM 的系统的方式使用仓库,但 apt 历史上使用 /etc/apt/sources.list 来管理仓库,而不是 yum 使用的单个 .repo 文件。最近,它也从 /etc/apt/sources.d/ 中提取文件。按照基于 RPM 的软件包管理器中的示例,要在基于 Debian 的发行版上完成相同的事情,您有几个选项。您可以从终端手动编辑/创建上述位置的文件,或者在某些情况下,您可以使用 UI 前端(例如 Ubuntu 等提供的 Software & Updates)。为了向所有发行版提供相同的处理方式,我将仅介绍命令行选项。要在不直接编辑文件的情况下添加仓库,您可以执行以下操作

user@ubuntu:~$ sudo apt-add-repository "deb http://APT.spideroak.com/ubuntu-spideroak-hardy/ release restricted"

这将在 /etc/apt/sources.list.d 中创建一个 spideroakone.list 文件。显然,这些行会根据要添加的仓库而更改。如果您要添加个人软件包存档 (PPA),您可以这样做

user@ubuntu:~$ sudo apt-add-repository ppa:gnome-desktop

注意: Debian 本身不支持 PPA。

添加仓库后,需要让基于 Debian 的系统知道有一个新的位置可以搜索软件包。这可以通过 apt-get update 命令完成

user@ubuntu:~$ sudo apt-get update
Get:1 http://security.ubuntu.com/ubuntu xenial-security InRelease [107 kB]
Hit:2 http://APT.spideroak.com/ubuntu-spideroak-hardy release InRelease
Hit:3 http://ca.archive.ubuntu.com/ubuntu xenial InRelease
Get:4 http://ca.archive.ubuntu.com/ubuntu xenial-updates InRelease [109 kB]              
Get:5 http://security.ubuntu.com/ubuntu xenial-security/main amd64 Packages [517 kB]
Get:6 http://security.ubuntu.com/ubuntu xenial-security/main i386 Packages [455 kB]      
Get:7 http://security.ubuntu.com/ubuntu xenial-security/main Translation-en [221 kB]     
...

Fetched 6,399 kB in 3s (2,017 kB/s)                                           
Reading package lists... Done

现在新的仓库已添加并更新,您可以使用 apt-cache 命令搜索软件包

user@ubuntu:~$ apt-cache search kate
aterm-ml - Afterstep XVT - a VT102 emulator for the X window system
frescobaldi - Qt4 LilyPond sheet music editor
gitit - Wiki engine backed by a git or darcs filestore
jedit - Plugin-based editor for programmers
kate - powerful text editor
kate-data - shared data files for Kate text editor
kate-dbg - debugging symbols for Kate
katepart - embeddable text editor component

要安装 kate,只需运行相应的安装命令

user@ubuntu:~$ sudo apt-get install kate

要删除软件包,请使用 apt-get remove

user@ubuntu:~$ sudo apt-get remove kate

在软件包发现方面,APT 不提供任何类似于 yum whatprovides 的功能。如果您想查找磁盘上特定文件的来源,有几种方法可以获取此信息。

使用 dpkg

user@ubuntu:~$ dpkg -S /bin/ls
coreutils: /bin/ls

使用 apt-file

user@ubuntu:~$ sudo apt-get install apt-file -y 

user@ubuntu:~$ sudo apt-file update

user@ubuntu:~$ apt-file search kate

apt-file search 的问题在于,与 yum whatprovides 不同,除非您知道确切的路径,否则它会过于冗长,并且它会自动添加通配符搜索,以便您最终得到任何包含单词 kate 的结果

kate: /usr/bin/kate
kate: /usr/lib/x86_64-linux-gnu/qt5/plugins/ktexteditor/katebacktracebrowserplugin.so
kate: /usr/lib/x86_64-linux-gnu/qt5/plugins/ktexteditor/katebuildplugin.so
kate: /usr/lib/x86_64-linux-gnu/qt5/plugins/ktexteditor/katecloseexceptplugin.so
kate: /usr/lib/x86_64-linux-gnu/qt5/plugins/ktexteditor/katectagsplugin.so

大多数这些示例都使用了 apt-get。请注意,目前大多数 Ubuntu 教程都专门使用 apt。单个 apt 命令旨在仅实现 APT 武器库中最常用的命令。由于功能在 apt-getapt-cache 和其他命令之间拆分,因此 apt 希望将它们统一到一个命令中。它还添加了一些优点,例如着色、进度条和其他零碎的东西。上面提到的大多数命令都可以用 apt 替换,但并非所有当前接收安全补丁的基于 Debian 的发行版都默认支持使用 apt,因此您可能需要安装其他软件包。

基于 Arch 的软件包管理器

Arch Linux 使用一个名为 pacman 的软件包管理器。与 .deb.rpm 文件不同,pacman 使用更传统的 tarball 和 LZMA2 压缩 (.tar.xz)。这使得 Arch Linux 软件包比其他形式的压缩存档(例如 gzip)小得多。pacman 最初于 2002 年发布,一直在稳步迭代和改进。pacman 的主要优势之一是它支持 Arch 构建系统,这是一个从源代码构建软件包的系统。构建系统提取一个名为 PKGBUILD 的文件,该文件包含元数据(例如版本号、修订号、依赖项等)以及一个 shell 脚本,其中包含用于编译符合 Arch Linux 要求的软件包的所需标志。然后,生成的二进制文件被打包到上述 .tar.xz 文件中,供 pacman 使用。

该系统促成了 Arch 用户仓库 (AUR) 的创建,这是一个社区驱动的仓库,其中包含 PKGBUILD 文件和支持补丁或脚本。这使得几乎无限量的软件可以在 Arch 中使用。该系统的明显优势在于,如果用户(或维护者)希望向公众提供软件,他们不必通过官方渠道才能使其被主仓库接受。缺点是它依赖于类似于 Docker Hub、Canonical 的 Snap 软件包或其他类似机制的社区管理。有许多 AUR 特定的软件包管理器可用于从 AUR 中的 PKGBUILD 文件下载、编译和安装(我们稍后将对此进行介绍)。

使用 pacman 和官方仓库

Arch 的主要软件包管理器 pacman 使用标志而不是像 yumapt 这样的命令词。例如,要搜索软件包,您可以使用 pacman -Ss。与 Linux 上的大多数命令一样,您可以找到 manpage 和在线帮助。pacman 的大多数命令都使用 sync (-S) 标志。例如

user@arch ~ $ pacman -Ss kate

extra/kate 18.04.2-2 (kde-applications kdebase)
    Advanced Text Editor
extra/libkate 0.4.1-6 [installed]
    A karaoke and text codec for embedding in ogg
extra/libtiger 0.3.4-5 [installed]
    A rendering library for Kate streams using Pango and Cairo
extra/ttf-cheapskate 2.0-12
    TTFonts collection from dustimo.com
community/haskell-cheapskate 0.1.1-100
    Experimental markdown processor.

Arch 还使用类似于其他软件包管理器的仓库。在上面的输出中,搜索结果以它们所在的仓库(在本例中为 extra/community/)为前缀。与基于 Red Hat 和 Debian 的系统类似,Arch 依赖于用户将仓库信息添加到特定文件中。这些仓库的位置是 /etc/pacman.conf。下面的示例与库存系统非常接近。我已经启用了 [multilib] 仓库以支持 Steam

[options]
Architecture = auto

Color
CheckSpace

SigLevel    = Required DatabaseOptional
LocalFileSigLevel = Optional

[core]
Include = /etc/pacman.d/mirrorlist

[extra]
Include = /etc/pacman.d/mirrorlist

[community]
Include = /etc/pacman.d/mirrorlist

[multilib]
Include = /etc/pacman.d/mirrorlist

可以在 pacman.conf 中指定特定的 URL。此功能可用于确保所有软件包都来自特定的时间点。例如,如果一个软件包存在严重影响您的错误,并且它有多个依赖项,您可以通过将特定 URL 添加到您的 pacman.conf 中,然后运行命令来降级系统,从而回滚到特定的时间点

[core]
Server=https://archive.archlinux.org/repos/2017/12/22/$repo/os/$arch

与基于 Debian 的系统一样,Arch 不会在您告诉它之前更新其本地仓库信息。您可以通过发出以下命令来刷新软件包数据库

user@arch ~ $ sudo pacman -Sy 

:: Synchronizing package databases...
 core                                                                     130.2 KiB   851K/s 00:00 [##########################################################] 100%
 extra                                                                   1645.3 KiB  2.69M/s 00:01 [##########################################################] 100%
 community                                                                  4.5 MiB  2.27M/s 00:02 [##########################################################] 100%
 multilib is up to date

正如您在上面的输出中看到的,pacman 认为 multilib 软件包数据库是最新的。如果您认为这是不正确的,可以通过运行 pacman -Syy 来强制刷新。如果您想更新整个系统(不包括从 AUR 安装的软件包),您可以运行 pacman -Syu

user@arch ~ $ sudo pacman -Syu

:: Synchronizing package databases...
 core is up to date
 extra is up to date
 community is up to date
 multilib is up to date
:: Starting full system upgrade...
resolving dependencies...
looking for conflicting packages...

Packages (45) ceph-13.2.0-2  ceph-libs-13.2.0-2  debootstrap-1.0.105-1  guile-2.2.4-1  harfbuzz-1.8.2-1  harfbuzz-icu-1.8.2-1  haskell-aeson-1.3.1.1-20
              haskell-attoparsec-0.13.2.2-24  haskell-tagged-0.8.6-1  imagemagick-7.0.8.4-1  lib32-harfbuzz-1.8.2-1  lib32-libgusb-0.3.0-1  lib32-systemd-239.0-1
              libgit2-1:0.27.2-1  libinput-1.11.2-1  libmagick-7.0.8.4-1  libmagick6-6.9.10.4-1  libopenshot-0.2.0-1  libopenshot-audio-0.1.6-1  libosinfo-1.2.0-1
              libxfce4util-4.13.2-1  minetest-0.4.17.1-1  minetest-common-0.4.17.1-1  mlt-6.10.0-1  mlt-python-bindings-6.10.0-1  ndctl-61.1-1  netctl-1.17-1
              nodejs-10.6.0-1  

Total Download Size:      2.66 MiB
Total Installed Size:   879.15 MiB
Net Upgrade Size:      -365.27 MiB

:: Proceed with installation? [Y/n] 

在前面提到的关于降级系统的情况下,您可以通过发出 pacman -Syyuu 来强制降级。重要的是要注意,不应轻易进行此操作。这在大多数情况下不会引起问题;但是,软件包或多个软件包的降级可能会导致级联故障,并使您的系统处于不一致的状态。谨慎使用!

要安装软件包,只需使用 pacman -S kate

user@arch ~ $ sudo pacman -S kate

resolving dependencies...
looking for conflicting packages...

Packages (7) editorconfig-core-c-0.12.2-1  kactivities-5.47.0-1  kparts-5.47.0-1  ktexteditor-5.47.0-2  syntax-highlighting-5.47.0-1  threadweaver-5.47.0-1
             kate-18.04.2-2

Total Download Size:   10.94 MiB
Total Installed Size:  38.91 MiB

:: Proceed with installation? [Y/n] 

要删除软件包,您可以运行 pacman -R kate。这只会删除软件包,而不会删除其依赖项

user@arch ~ $ sudo pacman -S kate

checking dependencies...

Packages (1) kate-18.04.2-2

Total Removed Size:  20.30 MiB

:: Do you want to remove these packages? [Y/n]

如果您想删除其他软件包需要的依赖项,可以运行 pacman -Rs:

user@arch ~ $ sudo pacman -Rs kate

checking dependencies...

Packages (7) editorconfig-core-c-0.12.2-1  kactivities-5.47.0-1  kparts-5.47.0-1  ktexteditor-5.47.0-2  syntax-highlighting-5.47.0-1  threadweaver-5.47.0-1
             kate-18.04.2-2

Total Removed Size:  38.91 MiB

:: Do you want to remove these packages? [Y/n] 

在我看来,Pacman 提供了最简洁的方式来搜索给定实用程序的软件包名称。如上所示,yumapt 都依赖于路径来找到有用的结果。Pacman 对您最有可能要查找的软件包做出一些智能猜测

user@arch ~ $ sudo pacman -Fs updatedb
core/mlocate 0.26.git.20170220-1
    usr/bin/updatedb

user@arch ~ $ sudo pacman -Fs kate
extra/kate 18.04.2-2
    usr/bin/kate

使用 AUR

有几个流行的 AUR 软件包管理器助手。其中,yaourtpacaur 相当流行。但是,这两个项目在 Arch Wiki 上都被列为已停止维护有问题。因此,我将讨论 aurman。它的工作方式几乎与 pacman 完全相同,只是它会搜索 AUR 并包含一些有用的,尽管可能很危险的选项。从 AUR 安装软件包将启动软件包维护者的构建脚本的使用。系统将多次提示您是否继续(为了简洁起见,我已截断输出)

aurman -S telegram-desktop-bin
~~ initializing aurman...
~~ the following packages are neither in known repos nor in the aur
...
~~ calculating solutions...

:: The following 1 package(s) are getting updated:
   aur/telegram-desktop-bin  1.3.0-1  ->  1.3.9-1

?? Do you want to continue? Y/n: Y

~~ looking for new pkgbuilds and fetching them...
Cloning into 'telegram-desktop-bin'...

remote: Counting objects: 301, done.
remote: Compressing objects: 100% (152/152), done.
remote: Total 301 (delta 161), reused 286 (delta 147)
Receiving objects: 100% (301/301), 76.17 KiB | 639.00 KiB/s, done.
Resolving deltas: 100% (161/161), done.
?? Do you want to see the changes of telegram-desktop-bin? N/y: N

[sudo] password for user:

...
==> Leaving fakeroot environment.
==> Finished making: telegram-desktop-bin 1.3.9-1 (Thu 05 Jul 2018 11:22:02 AM EDT)
==> Cleaning up...
loading packages...
resolving dependencies...
looking for conflicting packages...

Packages (1) telegram-desktop-bin-1.3.9-1

Total Installed Size:  88.81 MiB
Net Upgrade Size:       5.33 MiB

:: Proceed with installation? [Y/n]

有时,根据您要安装的软件包的复杂性,系统会提示您输入更多信息。为了避免这种繁琐的操作,aurman 允许您同时传递 --noconfirm--noedit 选项。这相当于说“接受所有默认值,并相信软件包维护者的脚本不会是恶意的。”极其谨慎地使用此选项! 虽然这些选项本身不太可能破坏您的系统,但您永远不应盲目接受别人的脚本。

结论

当然,本文仅触及软件包管理器可以做什么的表面。还有许多其他软件包管理器可用,我无法在此处介绍。一些发行版,例如 Ubuntu 或 Elementary OS,已竭尽全力提供软件包管理的图形方法。

如果您对软件包管理器的更多高级功能感兴趣,请在下面发布您的问题或评论,我很乐意撰写后续文章。

附录

# search for packages
yum search <package>
dnf search <package>
zypper search <package>
apt-cache search <package>
apt search <package>
pacman -Ss <package>

# install packages
yum install <package>
dnf install <package>
zypper install <package>
apt-get install <package>
apt install <package>
pacman -S <package>

# update package database, not required by yum, dnf and zypper
apt-get update
apt update
pacman -Sy

# update all system packages
yum update
dnf update
zypper update
apt-get upgrade
apt upgrade
pacman -Su

# remove an installed package
yum remove <package>
dnf remove <package>
apt-get remove <package>
apt remove <package>
pacman -R <package>
pacman -Rs <package>

# search for the package name containing specific file or folder
yum whatprovides *<binary>
dnf whatprovides *<binary>
zypper what-provides <binary>
zypper search --provides <binary>
apt-file search <binary>
pacman -Fs <binary>
标签
User profile image.
Steve 是一位敬业的 IT 专业人士和 Linux 倡导者。在加入 Red Hat 之前,他在金融、汽车和电影行业工作了几年。Steve 目前在 Red Hat 担任解决方案和技术实践部门的架构师。他拥有从 RHCA(DevOps 领域)到 Ansible,再到容器化应用程序等方面的认证。

9 条评论

我喜欢阅读您的文章。内容非常丰富。我记得早期安装软件更加困难的日子。我还记得 RPM 有多棒,以及如何使用“spec”文件创建自己的 RPM。我记得另一个名为“synaptic”的软件包管理过程,虽然我最初在 Ubuntu 上发现了它,但如果我没记错的话,我能够在 Red Hat Enterprise LInux 上安装它。你还记得吗?

我从未使用 Synaptic 用于基于 RPM 的系统,但绝对用于基于 DEB 的系统。

我仍然偶尔需要从它们的“spec”文件构建 RPM,尽管谢天谢地,现在这种情况很少见了。

回复 作者 Don Watkins

好文章!

好文章。虽然我觉得逐步说明是不必要的,主要是因为它似乎没有突出显示从一个软件包管理器到另一个软件包管理器的演变。

此外,我希望看到软件包管理器的演变,包括为使用特定编程语言创建的软件包创建软件包管理器。Python、Ruby、C++、JAVA、Dart、JavaScript 和 TypeScript 在大多数这些语言最初都没有任何管理器可用时都使用软件包管理器。

这是很好的反馈。我没有考虑 npm、pip、ruby gems 等。

至于我认为您指的是的示例,我喜欢提供大量示例,因为当我在查找信息时,这对我有意义。但您是正确的,软件包管理器本身并没有真正的直接路径,因此示例没有显示这一点。

回复 作者 JohnnyFive

这是一篇有趣的文章,但您的摘要与文章的其余部分(以及现实)不一致。它在安装软件包下列出了 pacman -Ss,而不是 pacman -S,说要使用 pacman -Su 更新整个系统而不是 pacman -Syu,并列出了 pacman -Sf 来查询具有特定文件的软件包,这根本不是有效的选项;我相信您的意思是 pacman -Fs。

感谢您的回复。你是对的,附录应该是
pacman -S
pacman -Fs

但是 pacman -Su 是正确的。“y”仅在刷新仓库信息时才需要。我将提交更正。抓得好

回复 作者 ThatsNoMoon (未验证)

很棒的文章。一些读者可能感兴趣的补充要点。

我仍然偶尔会遇到一些软件没有打包成软件包,需要以老式的方式安装。使用默认的 Makefiles 通常会将应用程序放在 /usr/local/bin 或(更糟糕的是)/usr/bin 中。这里的问题是,在您安装了许多应用程序之后,可能很难识别 /usr/local(或 /usr)下的目录迷宫中的哪些文件属于每个应用程序,这使得卸载应用程序而不会破坏某些东西变得困难。

为了解决这个问题,我使用了我认为在某个时候很常见的做法。我创建了一个 /usr/local/package 目录,并将每个应用程序安装到其在该目录下的私有目录中。每个应用程序的路径看起来像 /usr/local/package/软件包名称/版本。版本术语的存在是为了让我可以同时安装多个版本。我通常还会创建一个从 /usr/local/package/软件包名称/latest 到最新版本的符号链接。

通过这种方式,我创建了一堆从 /usr/local/package/packagename/latest/... 到 /usr/local 下相应位置(/usr/local/bin、/usr/local/lib 等)的符号链接。这实现了两个目的。它允许我通过更改 “latest” 符号链接来切换版本(这样我可以尝试新版本,并在出现问题时返回),并且它将应用程序的所有文件都保存在一个地方。因此,我可以卸载一个应用程序(或应用程序修订版),方法是删除它的目录树,然后查找(或使用脚本查找)/usr/local 中损坏的符号链接并删除它们。

不如软件包管理那样好,因为它没有数据库,也没有依赖性检查,但对于如今相对较少需要手动安装的软件包来说,它至少在某种程度上是可管理的。

我还应该补充一点,商业 UNIX 发行版也使用软件包。我在 Solaris 上使用 Sun/Oracle 的 Package Manager 工具套件有个人经验 (https://docs.oracle.com/cd/E26505_01/html/E29492/ewbej.html)。

我相信这个系统自 Solaris 2.5(1995 年 11 月)以来就已成为 Solaris 的一部分,如果不是更早的话。这将使其成为 Red Hat Linux(不是 “Enterprise”)2.0(第一个使用 RPM 的版本)的同期产品,并且比 Debian 发行版本身还要早。

Creative Commons License本作品采用知识共享署名-相同方式共享 4.0 国际许可协议进行许可。
© . All rights reserved.