4.4. 使用pkg管理二进制套件

pkg是新一代套件管理工具用来取代旧版工具,提供许多功能让处理二进制套件更快更简单。

对于只想要使用在FreeBSD镜像站上预先编译Binary套件的站台,使用pkg管理套件便已足够。

但是,对于那些想要从源码或使用自己的文件库编译的站台,则会需要Port管理工具

因为pkg仅能管理Binary套件,所以不能当做为替代Port管理工具,这些工具可用来安装来自Binary与Port套件集的软件,而pkg仅能安装Binary套件。

4.4.1. 开始使用pkg

FreeBSD内置启动(Bootstrap)工具可用来下载并安装pkg及其操作手册。这个工具是设计在FreeBSD版本10.X之后使用。

注意:

不是所有 FreeBSD 版本及构架支持此启动程序,目前支持的清单列于http://pkg.freebsd.org/,对不支持的版本,必须改透过Port套件集或者Binary套件来安装pkg

要初始化(Bootstrap)系统请执行:

# /usr/sbin/pkg

您必须有可用的网络连接(注:正常访问 pkg.freebsd.org)供启动程序使用方可成功。

否则,要安装Port套件,则须执行:

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

当升级原使用旧版pkg_*工具的既有系统时,必须将数据库转换成新的格式,如此新的工具才会知道有那些已安装过的套件。pkg安装完后,必须执行以下指令将套件数据库从旧版格式转换到新版格式:

# pkg2ng

注意:

新安装的版本因尚未安装任何第三方软件因此不须做这个步骤。

重要:

这个步骤无法还原。一旦套件数据库转为成pkg的格式,旧版pkg_*工具就不该再继续使用。

注意:

套件数据库转换的过程可能会因内容转换为新版本产生错误。通常,这些错误皆可安全忽略,即使如此,仍然有在执行pkg2ng后无法成功转换的软件清单,这些应用程序则必须手动重新安装。

为了确保FreeBSD Port套件集会将新软件的信息注册到pkg而非旧版套件数据库,FreeBSD版本10.X之前需要在/etc/make.conf加入此行:

WITH_PKGNG=	yes

预设pkg会使用FreeBSD套件镜像站(Repository)的Binary套件。若要取得有关编译自定义套件文件库的信息,请参考第 4.6 节 “使用Poudriere编译套件”

其他pkg设定选项说明请参考pkg.conf(5)

pkg的用法信息可在pkg(8)操作手册或不加任何参数执行pkg来取得。

每个pkg指令参数皆记库在指令操件手册。要阅读pkg install的操作手册,可执行以下指令:

# pkg help install
# man pkg-install

本章节剩余部份将介绍如何使用pkg执行常用的Binary套件管理工作。每个示范的指令皆会提供多个参数可使用,请参考指令的说明或操作手册以取得详细信息或更多示例。

4.4.2. Ports 分支:Quarterly 和 Latest

Quarterly 分支为用户提供了更可预测和更稳定的 port 和软件包安装和升级体验。这主要是通过只允许非功能更新来实现的。季度(Quarterly)分支的目标是接收安全修复 (可能是版本更新, 或提交的回溯)、 错误修复和 port 合规性或框架变化。季度分支在每个(年)季度的1月、4月、7月和10月开始时从HEAD中切出。分支是根据它们创建的年份 (YYYY) 和季度 (Q1-4) 来命名的。例如,在2016年1月创建的季度分支,被命名为2016Q1。而Latest分支则为用户提供最新版本的软件包。

要从 quarterly 切换到 latest,请执行:

# cp /etc/pkg/FreeBSD.conf /usr/local/etc/pkg/repos/FreeBSD.conf

修改 /usr/local/etc/pkg/repos/FreeBSD.confurl: 行的 quarterlylatest

输出像这样:

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

最后运行这个命令来强制刷新源的元数据。

# pkg update -f

4.4.3. 取得有关已安装套件的信息

有关已安装在系统的套件信息可透过执行pkg info来检视,若执行时未指定任何参数,将会列出所有已安装或指定的套件版本。

例如,要查看已安装的pkg版本可执行:

# pkg info pkg
pkg-1.1.4_1

4.4.4. 安装和删除软件包

要安装Binary套件可使用以下指令,其中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. 升级已安装套件

执行以下指令,可将已安装的套件升级到最新版本:

# pkg upgrade

这个指令将会比对已安装的版本与在档案库分类中的版本,并从档案库升级这些套件。

4.4.6. 稽查已安装套件

在第三方的应用程序中偶尔可能会发现软件漏洞,要找出这些程序,可使用pkg内置的稽查机制。要查询已安装在系统上的软件是否有任何已知的漏洞可执行:

# pkg audit -F

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

删除软件包可能会留下不需要的依赖项。可以使用以下方法自动检测和删除不需要的依赖(leaf packages):

# 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

作为依赖项安装的包称为automatic包。Non-automatic,即不作为依赖项安装的软件包,可以使用以下方法列出:

# pkg prime-list
nginx
openvpn
sudo

pkg prime-list是在/usr/local/etc/pkg.conf中声明的别名命令。还有许多其他可用于查询系统的包数据库。例如,可以使用命令pkg prime-origins获取上述列软件包的在 Port 中的位置:

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

此列表可用于使用构建工具(如 ports-mgmt/poudriere ports-mgmt/synth)等构建工具重建系统上安装的所有包。

将已安装的软件包标记为自动包:

# pkg set -A 1 devel/cmake

一旦一个软件包是依赖包并被标记为自动包,可以使用pkg autoremove删除它。

将已安装的软件包标记为非自动包,可以使用下列命令:

# pkg set -A 0 devel/cmake

4.4.8. 还原套件数据库

不如传统的套件管理系统,pkg有自己的套件数据库备份机制,此功能预设是开启的。

提示:

要停止周期的Script备份套件数据库可在periodic.conf(5)设定daily_backup_pkgdb_enable=“NO”

要还原先前套件数据库的备份,可执行以下指令并将/path/to/pkg.sql替换为备份的位置:

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

注意:

若要还原有周期Script所产生的备份必须在还原前先解压缩。

要手动备份pkg数据库,可执行以下指令,并替换/path/to/pkg.sql为适当的档案名称与位置:

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

4.4.9. 移除过时的套件

预设pkg会储存Binary套件在缓存目录定义在pkg.conf(5)中的PKG_CACHEDIR,只会保留最后安装的套件复本。较旧版的pkg会保留所有先前的套件,若要移除这些过时的Binary套件,可执行:

# pkg clean

使用以下指令可清空全部的缓存:

# pkg clean -a

4.4.10. 修改套件Metadata

在FreeBSD Port套件集中的软件可能会经历主要版号的修改,要解决这个问题可使用pkg内置的指令来更新套件来源。这非常有用,例如lang/php5重新命名为lang/php53因此lang/php5从此之后代表版本5.4

要更改上述例子中的套件来源,可执行:

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

再一个例子,要更新lang/ruby18lang/ruby19,可执行:

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

最后一个例子,要更改libglut共享程序库的来源从graphics/libglut改成graphics/freeglut可执行:

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

注意:

在更改套件来源之后,很重要的一件事是要重新安装套件,来让相依的套件也同时使用修改后的来源。要强制重新安装相依套件,可执行:

# pkg install -Rf graphics/freeglut

本文档和其它文档可从这里下载: ftp://ftp.FreeBSD.org/pub/FreeBSD/doc/.

如果对于FreeBSD有问题,请先阅读 文档,如不能解决再联系 <questions@FreeBSD.org>.

关于本文档的问题请发信联系 <doc@FreeBSD.org>.