4.5. 使用Ports Collection

下面的章节提供了使用ports collection来安装或卸载程序的基本用法。

4.5.1. 获得Ports Collection

在您能使用ports之前, 您必须先获得 ports collection -- 本质上是 /usr/ports 目录下的一堆 Makefile、 补丁和描述文件。

在您安装 FreeBSD 系统的时候, sysinstall 会询问您是否需要安装 ports collection。 如果您选择 no, 那您可以用下面的指令来安装ports collection:

Sysinstall 方式

这种方式使用 sysinstall 再次手动安装ports collection。

  1. root用户, 运行 /stand/sysinstall命令,像下面显示的:

    # /stand/sysinstall
    
  2. 选择 Configure, 按 Enter

  3. 选择 Distributions, 按 Enter

  4. 选择 ports, 按 Space

  5. 选择 Exit, 按 Enter

  6. 选择您的安装介质,就像CDROM,FTP,等等

  7. 选择 Exit 并按 Enter

  8. X 键退出 sysinstall

您可以使用 CVSup,这个程序让您获得和更新 ports collection。 CVSup 需要使用 /usr/share/examples/cvsup/ports-supfile 这个配置文件。 如果您想获得关于 CVSup 这个应用程序的更多信息, 请看 使用 CVSup (Section A.5) 和本文。

CVSup 方法

使用 CVSup 获得 ports collection, 是一个非常快捷的方法。 如果您想保持您的 ports 树的最新状态, 或了解更多关于 CVSup 的内容, 您可以阅读刚才提及的内容。

  1. 安装net/cvsup port。详情请参阅CVSup 安装 (Section A.5.2) 。

  2. root 用户, 复制 /usr/share/examples/cvsup/ports-supfile 到一个新的地方, 比如 /root 或您的家目录。

  3. 编辑 ports-supfile

  4. CHANGE_THIS.FreeBSD.org 改为离您比较近的 CVSup 服务器。 您可以参考 CVSup 镜像 (Section A.5.7) 服务器的完整列表。

  5. 运行 cvsup:

    # cvsup -g -L 2 /root/ports-supfile
    
  6. 运行这个命令之后将下载和应用所有变化的ports系统, 但并不在您的系统中重新编译 ports 系统。

4.5.2. 安装 Ports

当提到 Ports collection 时, 第一个要说明的就是何谓 “skeleton”。 简单地说, port skeleton 是让一个程序在 FreeBSD 上简洁地编译并安装的所需文件的最小组合。 每个 port skeleton 包含:

一些ports还有些其它的文件, 例如 pkg-message。 ports 系统在一些特殊情况下会用到这些文件。 如果您想知道这些文件更多的细节以及 ports 的概要, 请参阅 FreeBSD Porter's Handbook

port里面包含着如何编译源代码的指令, 但不包含真正的源代码。 您可以在网上或 CD-ROM 上获得源代码。 源代码可能被开发者发布成任何格式。 一般来说应该是一个被 tar 和 gzip 过的文件, 或者是被一些其他的工具压缩或未压缩的文件。 ports中这个程序源代码标示文件叫 “distfile”, 安装 FreeBSD port的方法还不止这两种。

Note: 您必须使用 root 用户登录后安装 ports。

Warning在安装任何 port 之前, 应该首先确保已经更新到了最新的 ports collection, 并检查 http://vuxml.freebsd.org/ 中是否有与那个 port 有关的安全问题。

在安装应用程序之前, 可以使用 portaudit 来自动地检查是否存在已知的安全问题。 这个工具同样可以在 ports collection (security/portaudit) 中找到。 在安装新的 port 之前, 可以考虑先运行一下 portaudit -F 来抓取最新的漏洞数据库。 在每天的周期性系统安全检察时, 数据库会被自动更新, 并且会在这之后实施安全审计。 欲了解进一步的情况,请参阅 portaudit(1)periodic(8)

4.5.2.1. 从光盘安装 Ports

FreeBSD 项目发行的官方光盘文件不再包含 distfiles。 他们提供了许多更多的更好的使用编译好的软件包。 如果您从 FreeBSD Mall 购买了像 FreeBSD PowerPak 这样的光盘产品, 里面就包含了distfiles。 下面的章节假设您已经有了一张FreeBSD的安装光盘。

把 FreeBSD 的光盘放入驱动器。Mount到 /cdrom。 (如果您使用了不同的挂接点,这个安装将不会工作)。 首先, 进入到您要安装的 port 所在的目录:

# cd /usr/ports/sysutils/lsof

一旦进入了 lsof 的目录,您将会看到这个port的结构。 下一步就是 make,或说 “联编” 这个 port。 只需在命令行简单地输入 make 命令就可轻松完成这一工作。 做好之后,您可以看到下面的信息:

# make
>> lsof_4.57D.freebsd.tar.gz doesn't seem to exist in /usr/ports/distfiles/.
>> Attempting to fetch from file:/cdrom/ports/distfiles/.
===>  Extracting for lsof-4.57
...
[extraction output snipped]
...
>> Checksum OK for lsof_4.57D.freebsd.tar.gz.
===>  Patching for lsof-4.57
===>  Applying FreeBSD patches for lsof-4.57
===>  Configuring for lsof-4.57
...
[configure output snipped]
...
===>  Building for lsof-4.57
...
[compilation output snipped]
...
#

注意,一旦编译完成,您就会回到命令行。 下一步安装 port, 要安装它只需要在 make 命令后跟上一个单词 install 即可:

# make install
===>  Installing for lsof-4.57
...
[installation output snipped]
...
===>   Generating temporary packing list
===>   Compressing manual pages for lsof-4.57
===>   Registering installation for lsof-4.57
===>  SECURITY NOTE: 
      This port has installed the following binaries which execute with
      increased privileges.
#

一旦您返回到提示符,您就可以运行您刚刚安装的程序了。因为 lsof 是一个赋予特殊权限的程序, 因此显示了一个安全警告。 在编译和安装 ports 的时候, 您应该留意任何出现的警告。

Note: 您可以运行一个命令 make install 来替换 makemake install这两个分离的步骤。

Note: 在一些shell中,为了对这些程序做快速查找的操作, 它对环境变量 PATH 指定的目录中的可执行命令有缓存。 对于在基本系统中的一部分 shell (就像 tcsh), 和在 port 中的一些 shell (举个例子, shells/zsh), 如果您使用了这些 shell 中的一个, 您必须在安装完一个 port 后执行 rehash 命令, 这样新安装的程序才能使用。

Note: 有一小部分的 port 由于许可协议的问题不允许包含在光盘内。 可能是因为在下载前需要注册一些信息或不允许再发布, 或者其他理由。 如果您想安装的 port 不在光盘中, 为此您将需要在线操作来安装 (请看 下一章节)。

4.5.2.2. 从互联网安装Port

作为最后一节, 本节假定您有一个可用的互联网连接。 如果您没有, 您需要察看上一章节从光盘安装, 或者手工将 distfile 放到 /usr/ports/distfiles

实际上从互联网安装 port 和从光盘安装差不多, 不同的是从互联网下载distfile,而不是从光盘读取。

相关步骤是一样的:

# make install
>> lsof_4.57D.freebsd.tar.gz doesn't seem to exist in /usr/ports/distfiles/.
>> Attempting to fetch from ftp://ftp.FreeBSD.org/pub/FreeBSD/ports/distfiles/.
Receiving lsof_4.57D.freebsd.tar.gz (439860 bytes): 100%
439860 bytes transferred in 18.0 seconds (23.90 kBps)
===>  Extracting for lsof-4.57
...
[extraction output snipped]
...
>> Checksum OK for lsof_4.57D.freebsd.tar.gz.
===>  Patching for lsof-4.57
===>  Applying FreeBSD patches for lsof-4.57
===>  Configuring for lsof-4.57
...
[configure output snipped]
...
===>  Building for lsof-4.57
...
[compilation output snipped]
...
===>  Installing for lsof-4.57
...
[installation output snipped]
...
===>   Generating temporary packing list
===>   Compressing manual pages for lsof-4.57
===>   Registering installation for lsof-4.57
===>  SECURITY NOTE: 
      This port has installed the following binaries which execute with
      increased privileges.
#

就像您看到的, 唯一区别是有一行告知您系统正在从哪里获得 port 的 distfile 的信息。

ports 系统使用 fetch(1) 去下载文件, 它有很多可以设置的环境变量, 其中包括 FTP_PASSIVE_MODEFTP_PROXY, 和 FTP_PASSWORD。 如果您在防火墙之后,或使用 FTP/HTTP代理, 您就可能需要设置它们。 完整的说明请看 fetch(3)

当使用者不是所有时间都能连接上网络, 则可以利用 make fetch。 您只要在顶层目录 (/usr/ports) 下运行这个命令, 所有需要的文件都将被下载。 这个命令也同样可以在下级类别目录中使用, 例如: /usr/ports/net。 注意, 如果一个port有一些依赖的库或其他 port, 它将 下载这些依赖的 port 的 distfile 文件, 如果您想获取所有依赖的 port 的所有 distfile, 请用 fetch-recursive 命令代替 fetch命令。

Note: 您可以在一个类别或在顶级目录编译所有的 port, 或者使用上述提到的 make fetch命令。 这样是非常危险的, 因为有一些port不能并存。 或者有另一种可能, 一些port会安装两个不同的文件, 但是却是相同的文件名。

在一些罕见的例子中, 用户可能需要在除了 MASTER_SITES 以外的一个站点(本地已经下载下来的文件)去获得一个文件包。 您可以用以下命令不使用 MASTER_SITES:

# cd /usr/ports/directory
# make MASTER_SITE_OVERRIDE= \
ftp://ftp.FreeBSD.org/pub/FreeBSD/ports/distfiles/ fetch

在这个例子中,我们把 MASTER_SITES这个选项改为了 ftp.FreeBSD.org/pub/FreeBSD/ports/distfiles/

Note: 一些 port 允许 (或甚至要求) 您指定编译选项来 启用/禁用 应用程序中非必需的功能, 一些安全选项, 以及其他可以订制的内容。 具有代表性的包括 www/mozillasecurity/gpgme、 以及 mail/sylpheed-claws。 如果存在这样的选项, 通常会在编译时给出提示。

4.5.2.3. 改变默认的 Ports 目录

一些时候使用不同的 distfiles 和 ports 目录可能很有用 (甚至是必要的)。 可以用 PORTSDIRPREFIX 来改变默认的目录。 例如:

# make PORTSDIR=/usr/home/example/ports install

将把编译 /usr/home/example/ports 中的 port 并把所有的文件安装到 /usr/local

# make PREFIX=/usr/home/example/local install

将在 /usr/ports 编译它并安装到 /usr/home/example/local

当然,

# make PORTSDIR=../ports PREFIX=../local install

将包含两种设置 (没有办法在这一页把它写完, 但您应该已经知道怎么回事了)。

另外, 这些变量也可以作为环境变量来设置。 请参考您的 shell 的联机手册上关于如何设置环境变量的说明。

4.5.2.4. 处理 imake

一些 port 使用 imake (这是 X Window 系统的一部分) 不能正常地配合 PREFIX, 它们会坚持把文件安装到 /usr/X11R6 下面。 类似地, 一些 Perl port 会忽略 PREFIX 并把文件安装到 Perl 的目录中。 让这些 port 尊重 PREFIX 是困难甚至是不可能的事情。

4.5.3. 卸载已经安装的 Ports

现在您已经知道如何安装 port, 您可能很想知道如何卸载它们, 例如您安装了一个之后才意识到装错了。 我们将卸载前面的例子中安装的那个 (也就是 lsof, 如果您没有注意过的话)。 和安装 port 时类似, 第一件事是进入 port 的目录, /usr/ports/sysutils/lsof。 之后您就可以卸载 lsof 了。 这可以通过命令 make deinstall 来完成:

# cd /usr/ports/sysutils/lsof
# make deinstall
===>  Deinstalling for lsof-4.57

这个过程足够地简单。 现在已经从系统上卸载了 lsof。 如果您想重新安装它, 可以在 /usr/ports/sysutils/lsof 目录中运行 make reinstall 来达到目的。

make deinstall 以及 make reinstall 在您执行过 make clean 之后就不能用了。 如果您在清理目录之后还想删除 port, 可以用 使用手册中的 Package 相关章节 中介绍的 pkg_delete(1) 来完成。

4.5.4. Ports 与磁盘空间

使用 ports collection 显然会吃掉您的一些磁盘空间。 基于这样的考虑您应该经常通过 make clean 来清理工作目录。 它将会在您编译和安装 port 之后删除 work 目录。 您也可以考虑从 distfiles 目录中删掉对应的 tar 文件, 并在用完之后卸载 port。

一些用户还通过把一些不需要的 port 分类放入 refuse 文件来避免下载它们。 这样在运行 CVSup 时就不会下载这些分类中的文件了。 关于 refuse 的详情请参考 Section A.5.3.1

4.5.5. 升级 Ports

Note: 一旦您更新了 ports collection, 在开始升级之前, 应该首先检查一下 /usr/ports/UPDATING 文件。 它描述了在升级时可能遇到的问题, 以及因应的步骤。

保持 ports 最新可能是一件乏味的工作。 例如, 为了更新 port 您需要进入它的目录, 编译, 卸载旧的, 然后安装新的, 并在之后进行清理。 考虑一下对五个 port 做这样的升级, 很乏味是不是? 这是系统管理员需要处理的一大难题, 而我们现在有了一些能够帮助我们做这件事的工具。 例如 sysutils/portupgrade 就能够帮助您完成所有这一切! 只需像其他 port 一样用 make install clean 来安装它就可以了。

接下来需要通过 pkgdb -F 命令来创建一个数据库。 这将读取已经安装的 port 并创建一个数据库文件到 /var/db/pkg 目录中。 接下来执行 portupgrade -a, 它会读取这个数据库以及 ports 的 INDEX 文件。 最后, portupgrade 将开始下载, 编译, 备份, 安装并清理更新了的 ports。 portupgrade 包含了许多的选项, 最重要的那些将在下面说明。

如果您只想升级某个具体的应用程序而不是数据库中的记录的所有程序, 则使用 portupgrade pkgname, 如果您认为 portupgrade 应该升级所有基于那个 port 的软件, 则需要指定 -r; 使用 -R 则它用到的所有包也会以通升级。 要使用预编译的包而不是 ports 来安装, 则可以指定 -P 选项; 如果只想下载需要的 distfile 而不编译或安装什么, 则指定 -F。 更具体的细节请参考 portupgrade(1)

Note: 规律性地更新 package 数据库非常重要。 您可以使用 pkgdb -F 来修复不一致, 特别是当 portupgrade 要求您这么做的时候。 当 portupgrade 正在更新数据库时请不要打断它, 因为这将做的结果将是不一致的数据库。

还有一些其他工具能够完成类似的以及其他一些任务, 请查看 ports/sysutils 目录中是否有您需要的。