使用 Alpine Package Keeper (apk)

apk 是 Alpine Package Keeper - 该发行版的软件包管理器。它用于管理系统的软件包(软件或其他)。它是安装额外软件的主要方法,并在 apk-tools 软件包中提供。

正常用法

仓库、发行版和镜像

apk 从各种镜像获取关于可用软件包的信息以及软件包本身,这些镜像包含各种仓库。有时,这些术语可以互换使用。以下是相关定义的摘要

镜像

一个托管仓库的网站。

发行版

各种仓库快照的集合。

仓库

一类软件包,通过某些属性联系在一起。

目前,存在三个仓库

main (主仓库)

官方支持的软件包,合理预期会出现在基本系统中。

community (社区仓库)

来自测试并已测试过的软件包。

testing (测试仓库)

新的、损坏的或过时的需要测试的软件包。仅在 edge 分支上可用。

存在两种类型的发行版

stable (稳定版) (例如 3.16)

每 6 个月发布一次。支持包括针对给定功能版本的安全补丁。每个稳定版发行版都有其自己的 maincommunity 仓库。main 仓库支持 2 年。community 仓库仅在其各自发行版的 6 个月内受到支持。当其 main 仓库的支持到期时,发行版被视为 EOL(生命周期结束)。

edge (边缘版)

滚动发行分支。它包括从 aports 仓库的 master 分支构建的最新软件包。它不如稳定版分支稳定,但对于日常使用来说足够稳定,并且对于开发或如果您需要最新的软件很有用。它有自己的 maincommunity 仓库,就像稳定版发行版一样。它还具有 testing 仓库,这显著增加了可用软件包的数量。

从技术上讲,可以混合不同的分支,也就是说在使用稳定版的 maincommunity 仓库时启用 testing 仓库。但是,不鼓励这种方法,并且会导致损坏。

仓库在 /etc/apk/repositories 文件中配置。每行对应一个仓库。格式如下

[@tag] [protocol][/path][/release]/repository
# comments look like so. valid examples below
http://dl-cdn.alpinelinux.org/alpine/edge/main (1)
@testing http://dl-cdn.alpinelinux.org/alpine/edge/testing (2)
/var/apk/my-packages (3)
1 在这种情况下,http:// 是协议,dl-cdn.alpinelinux.org/alpine 是路径,edge 是发行版,main 是仓库。
2 在这种情况下,@testing 是标签。有关更多信息,请参阅 安装软件包
3 在这种情况下,仓库是个人仓库,可在机器的文件系统上使用。
此示例使用 http:// 协议。也支持 ftp://https:// 协议。
当您安装 alpine 时,此文件应该已经部分填充。

搜索软件包

为了知道要安装什么软件包,必须能够找到软件包。Alpine 有一个专门的 Web 界面,专门用于查找各种可用的软件包。但是,apk 也提供了内置的搜索机制。您可以使用 apk search 子命令来调用它。您可以潜在地搜索软件包索引中的任何内容,其中包括提供的二进制文件和库)。此外,支持 globbing。因此,以下是一些搜索示例

apk search libsqlite3.so (1)
apk search consul (2)
apk search -e vim (3)
apk search -e so:libsqlite3.so.* (4)
1 您可以搜索部分库名称。
2 您也可以搜索二进制文件名称。
3 您可以使用 -e 排除部分匹配项。
4 您可以指定您要搜索的是库,使用 so: 前缀(或命令使用 cmd: 前缀,pkg-config 文件使用 pc: 前缀) - 它将与 -e 一起使用(实际上,如果使用 -e,则此用例需要前缀)。

安装软件包

安装软件包意味着软件包本身将从仓库(在 /etc/apk/repositories 中指定)下载并解压到系统。现有文件将被覆盖。/etc 中的配置文件是例外,它们将被保留。配置文件(来自软件包)将被重命名为 *.apk-new

Apk 的 add 命令比 search 命令更严格 - 例如,通配符不可用。但是,cmd:so:pc: 前缀仍然可用。

虽然 so: 前缀仍然可用于 apk add,但建议您避免使用它。这是因为提供的库 SONAME 版本可能会增加(例如,libmpack.so.0 可能会更新并变为 libmpack.so.1),在这种情况下,下次您运行 apk upgrade 时,它不会更新 libmpack,而是会失败。这是因为 so:libmpack.so.0 直接引用该特定版本的库,并且通常由软件包而不是用户直接使用。

虽然 cmd:pc: 前缀仍然可用于 apk add,但您应该知道它不能保证您获得完全想要的软件包。多个软件包可能包含相同的可执行命令或 pkg-config 定义,但只会选择一个 - 不一定是您想要的那个。

以下是一些添加软件包的示例

apk add busybox-extras (1)
apk add bash zsh (2)
apk add cmd:bash cmd:zsh (3)
apk add so:libmpack.so.0 (4)
apk add pc:msgpack (5)
1 您必须指定确切的软件包名称。
2 您可以一次添加多个软件包。
3 这应该等同于前面的示例,但指定了您感兴趣的命令。
4 可以指定特定的所需库,但不建议这样做。
5 最后,可以指定 pkg-config 依赖项。
如果 apk add 找到多个匹配的软件包(例如,多个 cmd: 匹配项),它将选择版本号最高的那个。

升级软件包

使用 apk 更新系统非常简单。只需运行 apk upgrade。从技术上讲,这是两个步骤:apk update,然后是真正的 apk upgrade。第一步将从仓库下载更新的软件包索引,而第二步将更新 World 中的所有软件包及其依赖项。

apk 将避免覆盖您可能已更改的文件。这些文件通常位于 /etc 目录中。每当 apk 想要安装文件,但意识到可能已编辑的文件已经存在时,它会将其文件写入该文件名,并附加 .apk-new。您可以手动处理这些文件,但存在一个名为 update-conf 的实用程序。只需正常调用它,即可向您展示两个文件之间的差异,并提供处理冲突的各种选择。

apk update 仅在您的缓存失效后运行一次,默认情况下每 4 小时发生一次。

查询软件包信息

在某些情况下,检查软件包或文件以查看各种详细信息可能很有用。为此,存在 info 子命令。它可以用于任何软件包,无论是否已安装,尽管后者的信息将更有限。它也可以与文件上的特定标志一起使用。默认情况下,info 将列出软件包描述、网页和已安装大小。有关更多详细信息(例如子命令支持的标志列表),您可以使用 apk info -h 输出的“Info options”部分或查看手册页。

移除软件包

通常,需要移除软件包。可以使用 del 子命令来完成,其基本语法与 add 子命令相同。

如果您使用 cmd:so:pc: 虚拟软件包添加了软件包,则必须指定相同的虚拟软件包才能移除它们。注意:移除软件包将自动移除其所有不再使用的依赖项。

del 子命令还支持 -r 标志,该标志将移除所有依赖于要移除的软件包的软件包,而不是因为软件包被需要而报错。

清理

许多软件包管理器都有特定的“清理”功能。一个常见的例子是 apt,它有一个 autoremove 子命令。Apk 在移除软件包时默认执行此操作。

也可以清除 apk 缓存,假设已启用缓存。您可以使用 apk cache clean 来执行此操作。

高级用法

World (世界文件)

您想要显式安装的软件包列在“世界文件”中,该文件位于 /etc/apk/world。可以安全地手动编辑它。如果您手动编辑了它,您可以运行不带参数的 apk add 以使软件包选择达到一致状态。

cmd:so:pc: 这样的虚拟软件包将以这种形式出现在您的世界文件中 - 这就是为什么不鼓励使用 so: - soname 可能会被提升!

虚拟软件包

虽然 cmd:so:pc: 软件包是自动创建的虚拟软件包,但您也可以创建自己的虚拟软件包。这些允许快速移除特定用途的软件包。请参阅以下示例了解详细信息

apk add a b c -t abc (1)
apk del abc (2)
apk add a b c --virtual abc (3)
1 这将添加软件包“a”、“b”和“c”作为虚拟软件包“abc”的依赖项。
2 这将移除“abc”及其所有组件(“a”、“b”和“c”),除非它们在其他地方被需要。
3 这等同于第一个示例。

交换仓库

当 alpine 有新发行版时,仓库路径将更改。假设您正在向前迁移(例如从 3.123.13),您可以简单地编辑 /etc/apk/repositories 并运行 apk upgrade --available

目前不支持降级软件包/版本。虽然技术上可行,但您需要自行承担风险。