4.4.使用 pkg 进行二进制包管理

pkg 是 FreeBSD 传统软件包管理工具的新一代替代品,它提供了许多使处理二进制软件包更快、更容易的功能。

对于那些只希望使用来自 FreeBSD 镜像站的预编译二进制包的网站来说,用 pkg 管理软件包就足够了。

然而,对于那些从源代码构建的网站或使用自己的存储库的网站,将需要一个单独的 port 管理工具open in new window

由于 pkg 只适用于二进制包,它并不能替代这些工具。那些工具可以用来安装二进制包和 ports 中的软件,而 pkg 仅可安装二进制包。

4.4.1.开始使用 pkg

FreeBSD 包含一个自举工具,可以用来下载和安装 pkg 及其手册页面。这个工具被设计用于 FreeBSD 10.X 及以后的版本。

提示

并非所有的 FreeBSD 版本和架构都支持这个自举过程。目前支持的列表在 https://pkg.freebsd.org/open in new window。对于其他情况,必须通过 ports 或二进制包安装 pkg。

要自举系统,请运行:

# /usr/sbin/pkg

你必须有一个正常的互联网连接,自举过程才能成功。

否则,需要安装该 port,请运行:

# cd /usr/ports/ports-mgmt/pkg
# make
# make install clean

当从一个原先使用旧版 pkg_* 工具的现有系统进行更新时,必须把数据库转换为新的格式,以便新的工具能够知道已经安装的软件包。安装了 pkg 以后,必须通过运行这个命令将软件包数据库从传统格式转换为新格式:

# pkg2ng

注意

对于尚未安装任何第三方软件的新系统,不需要这一步骤。

重要

该步骤是不可逆的。软件包数据库被转换为 pkg 格式以后,就不应再使用传统的 pkg_* 工具。

注意

当内容被转换到新版本时,软件包数据库的转换可能会发出错误。一般来说,可以被安全地忽略掉这些错误。然而,在 pkg2ng 完成后,会显示一个未成功转换的软件列表。必须重新手动安装这些应用程序。

为了确保 ports 用 pkg 而不是传统的 packages 数据库来注册新软件,早于 10.X 的 FreeBSD 版本需要在 /etc/make.conf 中加入这一行:

WITH_PKGNG=  yes

默认情况下,pkg 使用来自 FreeBSD 软件包镜像站(仓库)二进制软件包。关于构建自定义软件包仓库的信息,请参见用 Poudriere 构建软件包open in new window

其他的 pkg 配置选项在 pkg.conf(5)open in new window 中有所涉及。

可以在 pkg(8)open in new window 手册中找到 pkg 的使用信息,或者直接运行 pkg 而不附带其他参数。

每个 pkg 命令的参数都在特定命令的手册页中有所记载。例如,要阅读 pkg install 的手册页,请运行以下任一命令:

# pkg help install
# man pkg-install

本节的其余部分演示了使用 pkg 可以执行的常见二进制包管理任务。每个演示命令都提供了许多参数来定制其用途。详情和更多的例子请参考命令的帮助或手册页。

4.4.2.Quarterly 和 Latest ports 分支

Quarterly(季度)分支为用户提供了一个更可预测、更稳定的 ports 和软件包安装和更新的体验。这基本上是通过只允许非特性更新来实现的。Quarterly 分支的目标是接收安全修复(可能是版本更新,或者是提交的回溯)、bug 修复和 ports 合规性或框架变化。季度分支在每个(年度)季度的开始,即 1 月、4 月、7 月和 10 月,从 HEAD 中分离。根据创建的年份(YYYY)和季度(Q1-4)来命名该分支。例如,在 2016 年 1 月创建的季度分支,被命名为 2016Q1。而 Latest(最新)分支为用户提供最新版本的软件包。

要从季度分支切换到最新分支,请首先运行以下命令:

# mkdir -p /usr/local/etc/pkg/repos
# cp /etc/pkg/FreeBSD.conf /usr/local/etc/pkg/repos/FreeBSD.conf

然后编辑文件 /usr/local/etc/pkg/repos/FreeBSD.conf,将 url: 一行中的字符串 quarterly 改为 latest

结果应该类似于以下情况:

FreeBSD: {
  url: "pkg+http://pkg.FreeBSD.org/${ABI}/latest",
  mirror_type: "srv",
  signature_type: "fingerprints",
  fingerprints: "/usr/share/keys/pkg",
  enabled: yes
}

最后运行这个命令,从新的(latest)仓库进行元数据的更新:

# pkg update -f

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

可以通过运行 pkg info 来查看安装在系统上的软件包的信息,当直接运行没有任何参数时,它将列出所有安装的软件包或指定的软件包的版本。

例如,要查看安装了哪个版本的 pkg,请运行:

# pkg info pkg
pkg-1.1.4_1

4.4.4.安装和删除软件包

要安装二进制软件包,请使用以下命令,其中 packagename 是要安装的软件包的名称:

# pkg install packagename

这个命令使用软件库的数据来确定要安装哪个版本的软件,以及它是否有任何未安装的依赖项。例如,要安装 curl

# pkg install curl
Updating repository catalogue
/usr/local/tmp/All/curl-7.31.0_1.txz          100% of 1181 kB 1380 kBps 00m01s

/usr/local/tmp/All/ca_root_nss-3.15.1_1.txz   100% of  288 kB 1700 kBps 00m00s

Updating repository catalogue
The following 2 packages will be installed:

        Installing ca_root_nss: 3.15.1_1
        Installing curl: 7.31.0_1

The installation will require 3 MB more space

0 B to be downloaded

Proceed with installing packages [y/N]: y
Checking integrity... done
[1/2] Installing ca_root_nss-3.15.1_1... done
[2/2] Installing curl-7.31.0_1... done
Cleaning up cache files...Done

在已安装的软件包列表中可以看到新的软件包和所有作为依赖项被安装的额外软件包:

# pkg info
ca_root_nss-3.15.1_1	The root certificate bundle from the Mozilla Project
curl-7.31.0_1	Non-interactive tool to get files from FTP, GOPHER, HTTP(S) servers
pkg-1.1.4_6	New generation package manager

可以用 pkg delete 来删除不再需要的软件包。比如说:

# pkg delete curl
The following packages will be deleted:

	curl-7.31.0_1

The deletion will free 3 MB

Proceed with deleting packages [y/N]: y
[1/1] Deleting curl-7.31.0_1... done

4.4.5.更新已安装的软件包

可以通过运行 upgraded 将已安装的软件包更新到最新版本:

# pkg upgrade

这个命令将比较已安装的版本和仓库目录中的可用版本,并从软件仓库对其进行更新。

4.4.6.审计已安装的软件包

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

# pkg audit -F

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

移除一个软件包可能会留下不再需要的依赖关系。可以自动检测到作为依赖项安装的不需要的包(子包),并通过以下方式删除:

# pkg autoremove
Packages to be autoremoved:
	 ca_root_nss-3.15.1_1

The autoremoval will free 723 kB

Proceed with autoremoval of packages [y/N]: y
Deinstalling ca_root_nss-3.15.1_1... done

作为依赖关系安装的包被称为 自动 软件包。非自动软件包,即明确安装的软件包不是作为另一个软件包的依赖关系而存在的,可以用以下方式列出:

# pkg prime-list
nginx
openvpn
sudo

pkg prim-list/usr/local/etc/pkg.conf 中声明的一个别名命令。还有许多其他命令可以用来查询系统的软件包数据库。例如,命令 pkg prim-origins 可以用来获取上述列表的 ports 路径:

# pkg prime-origins
www/nginx
security/openvpn
security/sudo

借助这个列表,可以通过使用 ports-mgmt/poudriereopen in new windowports-mgmt/synthopen in new window 等编译工具重新编译安装在系统上的所有软件包。

将一个已安装的软件包标记为自动软件包,可以使用:

# pkg set -A 1 devel/cmake

一个软件包成为子包并被标记为自动后,它就会被 pkg autoremove 选中。

将一个已安装的软件包标记为 自动软件包,可以用以下方法完成:

# pkg set -A 0 devel/cmake

4.4.8.恢复软件包数据库

与传统的软件包管理系统不同,pkg 有它自己的软件包数据库备份机制。该功能在默认情况下启用。

技巧

要禁止 periodic 脚本备份软件包数据库,请在 periodic.conf(5)open in new window 中设置 daily_backup_pkgdb_enable="NO"

要恢复以前的软件包数据库备份的内容,运行以下命令,将 /path/to/pkg.sql 替换为备份的位置:

# pkg backup -r /path/to/pkg.sql

注意

如果要恢复 periodic 脚本所做的备份,必须在恢复前先对其进行解压。

要手动运行 pkg 的数据库备份,运行下面的命令,并用一个合适的文件名和位置替换 /path/to/pkg.sql

# pkg backup -d /path/to/pkg.sql

4.4.9.删除陈旧的软件包

默认情况下,pkg 将二进制包存储在 pkg.conf(5)open in new window 中由 PKG_CACHEDIR 定义的缓存目录中。只有最新安装的软件包的副本被保存。旧版本的 pkg 会保留所有以前的软件包。要删除这些过时的二进制包,请运行:

# pkg clean

可以通过运行命令来清除全部缓存:

# pkg clean -a

4.4.10.修改软件包的元数据

FreeBSD ports 中的软件可能会经历重大的版本号变化。为了解决这个问题,pkg 有一个内置的命令来更新软件包的来源。这可能很有用,例如,如果 lang/php5open in new window 被重命名为 lang/php53open in new window,那么此后 lang/php5open in new window 可以代表 5.4 版本。

要改变上述例子的软件包来源,请运行:

# pkg set -o lang/php5:lang/php53

再比如,要将 lang/ruby18open in new window 更新为 lang/ruby19open in new window,运行:

# pkg set -o lang/ruby18:lang/ruby19

作为最后一个例子,把 libglut 共享库的来源从 graphics/libglutopen in new window 改为 [graphics/freegluthttps://cgit.freebsd.org/ports/tree/graphics/freeglut/pkg-descr),运行:

# pkg set -o graphics/libglut:graphics/freeglut

注意

当改变软件包的来源时,重要的是要重新安装那些依赖于修改了来源的软件包的软件包。要强制重新安装依赖的软件包,请运行:

# pkg install -Rf graphics/freeglut
Loading...