A.6 使用 Portsnap

A.6.1 介绍

  Portsnap 是一套用以安全地分发 FreeBSD ports 套件的系统。 每隔大约一个小时, 就会生成一份 ports 的最新 “快照”, 它会被打包并进行数字签名。 这些文件接下来将通过 HTTP 来分发。

  与 CVSup 类似, Portsnap 采用 拉 (pull) 的模式来进行更新: 经过打包并签名的 ports tree 被放在 web 服务器上, 被动地等待用户请求它们。 用户需要手工运行 portsnap(8) 来下载更新, 或者设置 cron(8) 任务来自动地进行更新。

  由于一些技术原因, Portsnap 并不自动地直接更新位于 /usr/ports/ 目录中的 “实际的” ports tree; 事实上, 默认情况下它只操作位于 /var/db/portsnap/ 的压缩的 ports tree 副本, 而这个副本则用于更新实际的 ports tree。

注意: 如果 Portsnap 是通过 FreeBSD Ports Collection 安装的, 则这份压缩快照的默认位置则是 /usr/local/portsnap/ 而非 /var/db/portsnap/

A.6.2 安装

  在 FreeBSD 6.0 和更新版本上, Portsnap 已经成为 FreeBSD 基本系统的一部分。 在较早版本的 FreeBSD 中, 它可经由 ports-mgmt/portsnap port 来安装。

A.6.3 Portsnap 的配置

  Portsnap 的操作, 是通过 /etc/portsnap.conf 配置文件来控制的。 对于多数用户来说, 默认的配置文件已经可用了; 要了解进一步的细节, 则应参考 portsnap.conf(5) 联机手册。

注意: 假如 Portsnap 是通过 FreeBSD Ports Collection 安装的, 则它将使用配置文件 /usr/local/etc/portsnap.conf 而非 /etc/portsnap.conf。 这个文件并不随 port 的安装自动创建, 但我们提供了一个示例的配置文件; 将其复制到合适的位置, 然后运行下面的命令:

# cd /usr/local/etc && cp portsnap.conf.sample portsnap.conf

A.6.4 首次运行 Portsnap

  在首次运行 portsnap(8) 时, 它需要将整个 ports tree 的压缩快照下载到 /var/db/portsnap/ (或者, 如果 Portsnap 是通过 Ports Collection 安装的, 则是 /usr/local/portsnap/)。 在 2006 年初, 其下载尺寸大约是 41 MB。

# portsnap fetch

  一旦下载了压缩的快照, 就可以将它释放成为位于 /usr/ports/ 中的 “实际的” ports tree 了。 即时之前那个目录中已经有了一份 ports tree 也需要这样做 (例如, 通过使用 CVSup), 因为这个操作, 将为后续的 portsnap 决定更新 ports tree 的哪一部份提供基础。

# portsnap extract

注意: 默认安装时, 并不会自动创建 /usr/ports 这个目录。 如果您使用 FreeBSD 6.0-RELEASE, 在首次使用 portsnap 之前应手工创建这个目录。 在更高版本的 FreeBSD 和 Portsnap 中, 这个操作会由 portsnap 命令自动完成。

A.6.5 更新 Ports Tree

  在首次下载压缩的 ports tree 快照, 并将其释放到 /usr/ports/ 之后, 更新 ports tree 包含下面两步: fetch(下载) 对于压缩快照的更新, 并使用它们来 update(更新) 实际的 ports tree。 这两步可以通过一个 portsnap 命令来完成:

# portsnap fetch update

注意: 较早版本的 portsnap 并不支持这种写法。 如果不能用的话, 试试看下面的:

# portsnap fetch
# portsnap update

A.6.6 通过 cron 来运行 Portsnap

  为了避免对于 Portsnap 服务器的 “快闪” 式访问, portsnap fetch 不支持作为 cron(8) 任务来运行。 与此相反, 提供了一个特殊的 portsnap cron 命令, 它在开始下载更新之前会随机等待最多 3600 秒。

  此外, 强烈建议不要将 portsnap update 作为 cron 任务来运行, 因为它可能给正在同时进行的 port 安装带来大问题。 不过, 更新 ports 的 INDEX 文件一般并无大碍, 这可以通过 portsnap-I 参数来实现 (显然, 如果 portsnap -I update 是通过 cron 来运行的, 在之后还需要执行不带 -Iportsnap update 来更新 ports tree 余下的部分。)

  可以在 /etc/crontab 中加入下列设置, 以便让 portsnap 更新其压缩快照, 以及位于 /usr/ports/ 中的 INDEX 文件, 并在有 port 过期时发出邮件通知:

0 3 * * * root portsnap -I cron update && pkg_version -vIL=

注意: 如果系统时钟没有设置为使用本地时区, 请将 3 改为一介于 0 和 23 的随机值, 以便让 Portsnap 服务器的负载更为平均。

注意: 某些较早版本的 portsnap, 并不支持在一次调用 portsnap 时使用多个命令 (例如, cron update)。 如果这样不行, 请将 portsnap -I cron update 改为 portsnap cron && portsnap -I update

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

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