第21章 其他文件系统
附录 D. OpenPGP 密钥
4.4.使用 pkg 进行二进制包管理
pkg 是传统的 FreeBSD 软件包管理工具的新一代替代品,它提供了许多使处理二进制软件包更快、更容易的功能。
对于希望只使用来自 FreeBSD 镜像的预编译二进制包的网站来说,用 pkg 管理软件包就足够了。
然而,对于那些从源代码构建的网站或使用自己的存储库的网站,将需要一个单独的 ports 管理工具。
由于 pkg 只适用于二进制包,它并不能替代这些工具。那些工具可以用来安装二进制包和 Ports Collection 中的软件,而 pkg 只安装二进制包。

4.4.1.开始使用 pkg

FreeBSD 包括一个 bootstrap 工具,可以用来下载和安装 pkg 及其手册页面。这个工具被设计用于从 10.X 开始的 FreeBSD 版本。
提示:
并非所有的 FreeBSD 版本和架构都支持这个引导过程。目前的列表在 https://pkg.freebsd.org/ 。对于其他情况,pkg 必须从 Ports Collection 或二进制包中安装。
要启动系统,请运行:
1
# /usr/sbin/pkg
Copied!
你必须有一个正常的互联网连接,启动过程才能成功。
否则,要安装该 ports,请运行:
1
# cd /usr/ports/ports-mgmt/pkg
2
# make
3
# make install clean
Copied!
当升级一个原先使用旧版pkg_*工具的现有系统时,数据库必须被转换为新的格式,以便新的工具能够知道已经安装的软件包。安装了 pkg 以后,必须通过运行这个命令将软件包数据库从传统格式转换为新格式:
1
# pkg2ng
Copied!
注意:
对于尚未安装任何第三方软件的新安装系统,不需要这一步骤。
重要:
这个步骤是不可逆的。软件包数据库被转换为 pkg 格式以后,就不应再使用传统的 pkg_* 工具。
注意:
当内容被转换到新版本时,包数据库的转换可能会发出错误。一般来说,这些错误可以被安全地忽略掉。然而,在pkg2ng完成后,会显示一个未成功转换的软件列表。必须重新手动安装这些应用程序。
为了确保 Ports Collection 用 pkg 而不是传统的 packages 数据库来注册新软件,早于 10.X 的 FreeBSD 版本需要在/etc/make.conf中加入这一行。
1
WITH_PKGNG= yes
Copied!
默认情况下,pkg 使用来自 FreeBSD 软件包镜像(仓库)的二进制软件包。关于构建自定义软件包仓库的信息,请参见用Poudriere构建软件包。
其他 pkg 配置选项在 pkg.conf(5) 中有描述。
pkg 的使用信息可以在 pkg(8) 手册中找到,或者通过运行 pkg 而不需要其他参数。
每个pkg命令的参数都在特定命令的手册页中有所记载。例如,要阅读pkg install的手册页,请运行以下任一命令。
1
# pkg help install
Copied!
1
# man pkg-install
Copied!
本节的其余部分演示了可以使用 pkg 执行的常见二进制包管理任务。每个演示的命令都提供了许多开关来定制其用途。详情和更多的例子请参考命令的帮助或手册页。

4.4.2.季度和最新的 port 分支机构

Quarterly 分支为用户提供了一个更可预测、更稳定的 ports 和软件包安装和升级的体验。这基本上是通过只允许非特性更新来实现的。Quarterly 分支的目标是接收安全修复(可能是版本更新,或者是提交的回传)、bug 修复和 ports 合规性或框架变化。季度分支在每个(年度)季度的开始,即 1 月、4 月、7 月和 10 月,从HEAD中切割。分支根据创建的年份(YYY)和季度(Q1-4)来命名。例如,在 2016 年1月创建的季度分支,被命名为2016Q1。而最新分支为用户提供最新版本的软件包。
要从季度版切换到最新版,请运行以下命令:
1
# mkdir -p /usr/local/etc/pkg/repos
2
# cp /etc/pkg/FreeBSD.conf /usr/local/etc/pkg/repos/FreeBSD.conf
Copied!
编辑文件/usr/local/etc/pkg/repos/FreeBSD.conf,将url: 一行中的quarterly字符串改为latest
结果应该类似于以下情况:
1
FreeBSD: {
2
url: "pkg+http://pkg.FreeBSD.org/${ABI}/latest",
3
mirror_type: "srv",
4
signature_type: "fingerprints",
5
fingerprints: "/usr/share/keys/pkg",
6
enabled: yes
7
}
Copied!
最后运行这个命令,从新的(最新的)版本库元数据进行更新:
1
# pkg update -f
Copied!

4.4.3.获得关于已安装软件包的信息

关于安装在系统上的软件包的信息可以通过运行pkg info来查看,当运行时没有任何开关,它将列出所有安装的软件包或指定的软件包的版本。
例如,要查看安装了哪个版本的 pkg,请运行:
1
# pkg info pkg
2
pkg-1.1.4_1
Copied!

4.4.4.安装和删除软件包

要安装一个二进制软件包,请使用以下命令,其中packagename是要安装的软件包的名称:
1
# pkg install packagename
Copied!
这个命令使用软件库的数据来确定要安装哪个版本的软件,以及它是否有任何未安装的依赖项。例如,要安装 curl:
1
# pkg install curl
2
Updating repository catalogue
3
/usr/local/tmp/All/curl-7.31.0_1.txz 100% of 1181 kB 1380 kBps 00m01s
4
5
/usr/local/tmp/All/ca_root_nss-3.15.1_1.txz 100% of 288 kB 1700 kBps 00m00s
6
7
Updating repository catalogue
8
The following 2 packages will be installed:
9
10
Installing ca_root_nss: 3.15.1_1
11
Installing curl: 7.31.0_1
12
13
The installation will require 3 MB more space
14
15
0 B to be downloaded
16
17
Proceed with installing packages [y/N]: y
18
Checking integrity... done
19
[1/2] Installing ca_root_nss-3.15.1_1... done
20
[2/2] Installing curl-7.31.0_1... done
21
Cleaning up cache files...Done
Copied!
在已安装的软件包列表中可以看到新的软件包和任何作为依赖项安装的额外软件包:
1
# pkg info
2
ca_root_nss-3.15.1_1 The root certificate bundle from the Mozilla Project
3
curl-7.31.0_1 Non-interactive tool to get files from FTP, GOPHER, HTTP(S) servers
4
pkg-1.1.4_6 New generation package manager
Copied!
不再需要的软件包可以用pkg delete来删除。比如说:
1
# pkg delete curl
2
The following packages will be deleted:
3
4
curl-7.31.0_1
5
6
The deletion will free 3 MB
7
8
Proceed with deleting packages [y/N]: y
9
[1/1] Deleting curl-7.31.0_1... done
Copied!

4.4.5.升级已安装的软件包

已安装的软件包可以通过运行升级到其最新版本:
1
# pkg upgrade
Copied!
这个命令将比较已安装的版本和版本库目录中的可用版本,并从版本库中升级它们:

4.4.6.审计已安装的软件包

在第三方应用程序中经常发现软件漏洞。为了解决这个问题,pkg 包括一个内置的审计机制。要确定系统上安装的软件是否存在任何已知的漏洞,请运行:
1
# pkg audit -F
Copied!

4.4.7.自动删除未使用的软件包

移除一个软件包可能会留下不再需要的依赖关系。作为依赖项安装的不需要的包(子包)可以被自动检测到,并通过以下方式删除:
1
# pkg autoremove
2
Packages to be autoremoved:
3
ca_root_nss-3.15.1_1
4
5
The autoremoval will free 723 kB
6
7
Proceed with autoremoval of packages [y/N]: y
8
Deinstalling ca_root_nss-3.15.1_1... done
Copied!
作为依赖关系安装的包被称为自动包。非自动软件包,即明确安装的软件包不是作为另一个软件包的依赖关系,可以用以下方式列出:
1
# pkg prime-list
2
nginx
3
openvpn
4
sudo
Copied!
pkg prim-list/usr/local/etc/pkg.conf中声明的一个别名命令。还有许多其他命令可以用来查询系统的软件包数据库。例如,命令pkg prim-origins可以用来获取上述列表的 ports 目录:
1
# pkg prime-origins
2
www/nginx
3
security/openvpn
4
security/sudo
Copied!
这个列表可以用来重建使用ports-mgmt/poudriereports-mgmt/synth等联编工具安装在系统上的所有软件包:
将一个已安装的软件包标记为自动,可以使用:
1
# pkg set -A 1 devel/cmake
Copied!
一个软件包成为子包并被标记为自动后,它就会被 pkg 自动删除选中。
将一个已安装的软件包标记为非自动,可以用以下方法完成:
1
# pkg set -A 0 devel/cmake
Copied!

4.4.8.恢复软件包数据库

与传统的软件包管理系统不同,pkg 有它自己的软件包数据库备份机制。这个功能在默认情况下是启用的。
提示:
要禁止定期脚本备份软件包数据库,请在 periodic.conf(5) 中设置daily_backup_pkgdb_enable="NO"
要恢复以前的软件包数据库备份的内容,运行以下命令,将/path/to/pkg.sql替换为备份的位置:
1
# pkg backup -r /path/to/pkg.sql
Copied!
注意:
如果恢复定期脚本所做的备份,必须在恢复前对其进行解压。
要手动运行 pkg 的数据库备份,运行下面的命令,用一个合适的文件名和位置替换/path/to/pkg.sql
1
# pkg backup -d /path/to/pkg.sql
Copied!

4.4.9.删除陈旧的软件包

默认情况下,pkg 将二进制包存储在 pkg.conf(5) 中由PKG_CACHEDIR定义的缓存目录中。只有最新安装的软件包的副本被保存。旧版本的 pkg 会保留所有以前的软件包。要删除这些过时的二进制包,请运行:
1
# pkg clean
Copied!
可以通过运行来清除整个缓存:
1
# pkg clean -a
Copied!

4.4.10.修改包的元数据

FreeBSD Ports Collection 中的软件可能会经历重大的版本号变化。为了解决这个问题,pkg 有一个内置的命令来更新软件包的来源。这可能很有用,例如,如果lang/php5被改名为lang/php53,那么lang/php5现在可以代表 5.4 版本。
要改变上述例子的软件包来源,请运行:
1
# pkg set -o lang/php5:lang/php53
Copied!
再比如,要将lang/ruby18更新为lang/ruby19,运行:
1
# pkg set -o lang/ruby18:lang/ruby19
Copied!
作为最后一个例子,要把 libglut 共享库的来源从 graphics/libglut 改为 graphics/freeglut,运行:
1
# pkg set -o graphics/libglut:graphics/freeglut
Copied!
注意:
当改变软件包的来源时,重要的是要重新安装那些依赖于修改了来源的软件包的软件包。要强制重新安装依赖的软件包,请运行:
1
# pkg install -Rf graphics/freeglut
Copied!