软件包管理器的演变

软件包管理器在 Linux 软件管理中扮演着重要的角色。 这里比较一下一些主要的软件包管理器。
241 位读者喜欢这篇文章。
A guide to packing and preparing for a tech conference

Opensource.com

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

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

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

从历史上看,软件是通过 FTP 或邮件列表提供的(最终,这种分发将扩展到包括基本网站)。 只有几个小文件包含创建二进制文件的指令(通常在 tar 文件中)。 你可以解压这些文件,阅读 readme,只要你有 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 的包管理器

Debian 是目前维护的最古老的 Linux 发行版之一,其系统与基于 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 Build System,这是一个从源代码构建软件包的系统。 构建系统提取名为 PKGBUILD 的文件,该文件包含元数据(例如版本号、修订号、依赖项等)以及一个 shell 脚本,其中包含用于编译符合 Arch Linux 要求的软件包所需的标志。 然后将生成的二进制文件打包到上述 .tar.xz 文件中,以供 pacman 使用。

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

使用 pacman 和官方软件仓库

Arch 的主要包管理器 pacman 使用标志而不是像 yumapt 这样的命令词。 例如,要搜索软件包,您将使用 pacman -Ss。 与 Linux 上的大多数命令一样,您可以找到 manpage 和内联帮助。 pacman 的大多数命令都使用同步 (-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。 下面的示例与库存系统非常接近。 我已启用用于 Steam 支持的 [multilib] 软件仓库

[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/packagename/version。版本术语存在,因此我可以同时安装多个版本。我通常还会创建一个从 /usr/local/package/packagename/latest 到最新版本的符号链接。

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

不如软件包管理好,因为没有数据库,也没有依赖项检查,但对于需要手动安装的相对较少的软件包来说,这至少是可管理的。

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

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

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