每台计算机设备都使用某种形式的软件来执行其预期的任务。在软件的早期,产品都经过严格的错误和其他缺陷测试。在过去的十年左右,软件通过互联网发布,目的是通过应用软件的新版本来修复任何错误。在某些情况下,每个单独的应用程序都有自己的更新程序。在其他情况下,则由用户自己决定如何获取和升级软件。
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)相关联,但也已被 MeeGo、Sailfish OS 和 Tizen 采用。它最初于 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 的工具管理。dpkg 与 rpm 非常相似,因为它旨在管理本地可用的软件包。它不进行依赖项解析(尽管它进行依赖项检查),并且没有可靠的方式与远程仓库交互。为了改善用户体验和易用性,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-get
、apt-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 使用标志而不是像 yum
和 apt
这样的命令词。例如,要搜索软件包,您可以使用 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 提供了最简洁的方式来搜索给定实用程序的软件包名称。如上所示,yum
和 apt
都依赖于路径来找到有用的结果。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 软件包管理器助手。其中,yaourt
和 pacaur
相当流行。但是,这两个项目在 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>
9 条评论