5.5. 使用Ports Collection

下面的几个小节中, 给出了关于如何使用 Ports 套件来在您的系统中安装或卸载程序的介绍。 关于可用的 make targets 以及环境变量的介绍, 可以在 ports(7) 中找到。

5.5.1. 获得Ports Collection

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

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

过程 5.1. CVSup 方法

保持您本地 Ports 套件最新的一种快捷的方法, 是使用 CVSup 协议来进行更新。 如果您希望了解更多关于 CVSup 的细节, 请参见 使用 CVSup

注意:

在 FreeBSD 系统里对 CVSup 的实现叫作 csup

在首次运行 csup 之前, 务必确认 /usr/ports 是空的! 如果您之前已经用其他地方安装了一份 Ports 套件, 则 csup 可能不会自动删除已经在上游服务器上删除掉的补丁文件。

  1. 运行 csup:

    # csup -L 2 -h cvsup.FreeBSD.org /usr/share/examples/cvsup/ports-supfile

    cvsup.FreeBSD.org 改为离您较近的 CVSup 服务器。 请参见 CVSup 镜像 (第 A.6.7 节 “CVSup 站点”) 中的镜像站点完整列表。

    注意:

    有时可能希望使用自己的 ports-supfile, 比如说, 不想每次都通过命令行来指定所使用的 CVSup 服务器。

    1. 这种情况下, 需要以 root 身份将 /usr/share/examples/cvsup/ports-supfile 复制到新的位置, 例如 /root 或您的主目录。

    2. 编辑 ports-supfile

    3. CHANGE_THIS.FreeBSD.org 修改成离您较近的 CVSup 服务器。 可以参考 CVSup 镜像 (第 A.6.7 节 “CVSup 站点”) 中的镜像站点完整列表。

    4. 接下来按如下的方式运行 csup

      # csup -L 2 /root/ports-supfile
  2. 此后运行 csup(1) 命令将下载最近所进行的改动, 并将它们应用到您的 Ports Collection 上, 不过这一过程并不重新联编您系统上的 ports。

过程 5.2. Portsnap 方式

Portsnap 是用于发布 Ports 套件的另一套系统。 请参阅 使用 Portsnap 以了解关于 Portsnap 功能更详细的介绍。

  1. 下载压缩的 Ports 套件快照到 /var/db/portsnap。 您可以根据需要在这之后关闭 Internet 连接。

    # portsnap fetch
  2. 假如您是首次运行 Portsnap, 则需要将快照释放到 /usr/ports

    # portsnap extract

    如果您已经有装好的 /usr/ports 而您只想更新, 则应执行下面的命令:

    # portsnap update
过程 5.3. Sysinstall 方式

这种方法需要使用 sysinstall 从安装介质上安装 Ports 套件。 注意, 安装的将是发布发行版时的旧版 Ports 套件。 如果您能访问 Internet, 应使用前面介绍的方法之一。

  1. root 身份运行 sysinstall

    # sysinstall
  2. 用光标向下选择 Configure, 并按 Enter

  3. 向下并选择 Distributions, 按 Enter

  4. 选择 ports, 并按 Space

  5. 选择 Exit, 并按 Enter

  6. 选择所希望的安装介质, 例如 CDROM、 FTP, 等等。

  7. 选择 Exit 并按 Enter

  8. X 退出 sysinstall

5.5.2. 安装 Ports

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

  • 一个 MakefileMakefile 包括好几个部分, 指出应用程序是如何编译以及将被安装在系统的哪些地方。

  • 一个 distinfo 文件。这个文件包括这些信息: 这些文件用来对下载后的文件校验和进行检查 (使用 sha256(1)), 来确保在下载过程中文件没有被破坏。

  • 一个 files 目录。 这个目录包括在 FreeBSD 系统上编译和安装程序需要用到的补丁。 这些补丁基本上都是些小文件, 指出特定文件作了哪些修正。 它们都是纯文本的的格式,基本上是这样的 删除第 10 行将第 26 行改为这样 ..., 补丁文件也被称作 diffs, 他们由 diff(1) 程序生成。

    这个目录也包含了在编译 port 时要用到的其它文件。

  • 一个 pkg-descr 文件。 这是一个提供更多细节,有软件的多行描述。

  • 一个 pkg-plist 文件。 这是即将被安装的所有文件的列表。它告诉 ports 系统在卸载时需要删除哪些文件。

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

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

注意:

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

警告:

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

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

Ports 套件假定您有可用的 Internet 连接。 如果您没有, 则需要将 distfile 手工放到 /usr/ports/distfiles 中。

要开始操作, 首先进入要安装 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 ftp://lsof.itap.purdue.edu/pub/tools/unix/lsof/.
===>  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 的时候, 您应该留意任何出现的警告。

删除工作目录是个好主意, 这个目录中包含了全部在编译过程中用到的临时文件。 这些文件不仅会占用宝贵的磁盘空间, 而且可能会给升级新版本的 port 时带来麻烦。

# make clean
===>  Cleaning for lsof-4.57
#

注意:

使用 make install clean 可以一步完成 makemake installmake clean 这三个分开的步骤的工作。

注意:

一些 shell 会缓存环境变量 PATH 中指定的目录里的可执行文件, 以加速查找它们的速度。 如果您使用的是这类 shell, 在安装 port 之后可能需要执行 rehash 命令, 然后才能运行新安装的那些命令。 这个命令可以在类似 tcsh 的 shell 中使用。 对于类似 sh 的 shell, 对应的命令是 hash -r。 请参见您的 shell 的文档以了解进一步的情况。

某些第三方 DVD-ROM 产品, 如 FreeBSD Mall 的 FreeBSD Toolkit 中包含了 distfiles。 这些文件可以与 Ports 套件配合使用。 将 DVD-ROM 挂接到 /cdrom。 如果您使用不同的挂接点, 则应设置 make 变量 CD_MOUNTPTS。 如果盘上有需要的 distfiles, 则会自动使用。

注意:

请注意, 少数 ports 并不允许通过 CD-ROM 发行。 这可能是由于下载之前需要填写注册表格, 或者不允许再次发布, 或者有一些其它原因。 如果您希望安装在 CD-ROM 上没有的 port, 就需要在线操作了。

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命令。

注意:

您可以在一个类别或在顶级目录编译所有的 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/

注意:

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

5.5.2.1. 改变默认的 Ports 目录

有时, 使用不同的工作临时目录和目标目录可能很有用 (甚至是必要的)。 可以用 WRKDIRPREFIXPREFIX 这两个变量来改变默认的目录。 例如:

# make WRKDIRPREFIX=/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 WRKDIRPREFIX=../ports PREFIX=../local install

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

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

5.5.2.2. 处理 imake

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

5.5.2.3. 重新配置 Ports

当你在编译某些 ports 的时候,可能会弹出一个基于 ncurses 的菜单来让你来选择一些编译选项。 通常用户都希望能够在一个 port 被编译安装了以后还能再次访问这份菜单以添加删除或修改这些选项。 实际上有很多方法来做这件事情。 一个方法进入那个 port 的目录后键入 make config, 之后便会再次显示出菜单和已选择的项目。 另一个方法是用 make showconfig, 这会给你显示出所有的配置选项。还有一个方法是执行 make rmconfig, 这将删除所有已选择的项目。 有关这些选项更详细的内容请参阅 ports(7)

5.5.3. 卸载已经安装的 Ports

现在您已经了解了如何安装 ports, 并希望进一步了解如何卸载, 特别是在错误地安装了某个 port 之后。我们将卸载前面例子 (假如您没有注意的话, 是 lsof) 中安装的 port。 Ports 可以同 packages 以完全相同的方式 (在 Packages 一节 中进行了介绍) 卸载, 方法是使用 pkg_delete(1) 命令:

# pkg_delete lsof-4.57

5.5.4. 升级 Ports

首先, 使用 pkg_version(1) 命令来列出 Ports Collection 中提供了更新版本的那些 port:

# pkg_version -v

5.5.4.1. /usr/ports/UPDATING

在您更新了 Ports 套件之后, 在升级 port 之前, 应查看 /usr/ports/UPDATING。 这个文件中介绍了在升级时用户应注意的问题, 以及一些可能需要进行的操作。 这可能包括更改文件格式、 配置文件位置的变动, 以及与先前版本的兼容性等等。

如果 UPDATING 与本书中介绍的内容不同, 请以 UPDATING 为准。

5.5.4.2. 使用 Portupgrade 来更新 Ports

portupgrade 工具是设计来简化升级已安装的 port 的操作的。 它通过 ports-mgmt/portupgrade port 来提供。 您可以像其它 port 那样, 使用 make install clean 命令来安装它:

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

使用 pkgdb -F 命令来扫描已安装的 port 的列表, 并修正其所报告的不一致。 在每次升级之前, 有规律地执行它是个好主意。

运行 portupgrade -a 时, portupgrade 将开始并升级系统中所安装的所有过时的 ports。 如果您希望在每个升级操作时得到确认, 应指定 -i 参数。

# portupgrade -ai

如果您只希望升级某个特定的应用程序, 而非全部可用的 port, 应使用 portupgrade pkgname。 如果 portupgrade 应首先升级指定应用程序的话, 则应指定 -R 参数。

# portupgrade -R firefox

要使用预编译的 package 而不是 ports 来进行安装, 需要指定 -P。 如果指定了这个选项, portupgrade 会搜索 PKG_PATH 中指定的本地目录, 如果没有找到, 则从远程站点下载。 如果本地没有找到, 而且远程站点也没有成功地下载预编译包, 则 portupgrade 将使用 ports。 要禁止使用 port, 可以指定 -PP

# portupgrade -PP gnome2

如果只想下载 distfiles (或者, 如果指定了 -P 的话, 是 packages) 而不想构建或安装任何东西, 可以使用 -F。 要了解更多细节, 请参考 portupgrade(1)

5.5.4.3. 使用 Portmanager 来升级 Ports

Portmanager 是另一个用以简化已安装 port 升级操作的工具。 它可以通过 ports-mgmt/portmanager port 安装:

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

可以通过这个简单的命令来升级所有已安装的 port:

# portmanager -u

如果希望 Portmanager 在进行每步操作之前都给出提示, 应使用 -ui 参数。 Portmanager 也可以用来在系统中安装新的 ports。 与通常的 make install clean 命令不同,它会在联编和安装您所选择的 port 之前升级所有依赖包。

# portmanager x11/gnome2

如果关于所选 port 的依赖有任何问题, 可以用 Portmanager 来以正确的顺序重新构建它们。 完成之后, 有问题的 port 也将被重新构建。

# portmanager graphics/gimp -f

要了解更多信息, 请参见 portmanager(1)

5.5.4.4. 使用 Portmaster 升级 Ports

Portmaster 是另外一个用来升级已安装的 ports 的工具。 Portmaster 被设计成尽可能使用 基本 系统中能找到的工具 (它不依赖于其他的 ports) 和 /var/db/pkg/ 中的信息来检测出需要升级的 ports。你可以在 ports-mgmt/portmaster 找到它:

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

Portmaster groups ports into four categories:

Portmaster 把 ports 分成4类:

  • Root ports (不依赖其他的 ports,也不被依赖)

  • Trunk ports (不依赖其他的 ports,但是被其他的 ports 依赖)

  • Branch ports (依赖于其他的 ports,同时也被依赖)

  • Leaf ports (依赖于其他的 ports,但不被依赖)

你可以使用 -L 选项列出所有已安装的 ports 和查找存在更新的 ports:

# portmaster -L
===>>> Root ports (No dependencies, not depended on)
===>>> ispell-3.2.06_18
===>>> screen-4.0.3
        ===>>> New version available: screen-4.0.3_1
===>>> tcpflow-0.21_1
===>>> 7 root ports
...
===>>> Branch ports (Have dependencies, are depended on)
===>>> apache-2.2.3
        ===>>> New version available: apache-2.2.8
...
===>>> Leaf ports (Have dependencies, not depended on)
===>>> automake-1.9.6_2
===>>> bash-3.1.17
        ===>>> New version available: bash-3.2.33
...
===>>> 32 leaf ports

===>>> 137 total installed ports
        ===>>> 83 have new versions available

可以使用这个简单的命令升级所有已安装的 ports:

# portmaster -a

注意:

Portmaster 默认在删除一个现有的 port 前会做一个备份包。如果新的版本能够被成功安装, Portmaster 将删除备份。 使用 -bPortmaster 便不会自动删除备份。加上 -i 选项之后 Portmaster 将进入互动模式, 在升级每个 port 以前提示你给予确认。

如果你在升级的过程中发现了错误,你可以使用 -f 选项升级/重新编译所有的 ports:

# portmaster -af

同样你也可以使用 Portmaster 往系统里安装新的 ports,升级所有的依赖关系之后并安装新的 port:

# portmaster shells/bash

更多的详细信息请参阅 portmaster(8)

5.5.5. Ports 和磁盘空间

使用 Ports 套件会最终用完磁盘空间。 在通过 ports 联编和安装软件之后,您应记得清理临时的 work 目录, 其方法是使用 make clean 命令。 您可以使用下面的命令来清理整个 Ports 套件:

# portsclean -C

随着时间的推移, 您可能会在 distfiles 目录中积累下大量源代码文件。 您可以手工删除这些文件, 也可以使用下面的命令来删除所有 port 都不引用的文件:

# portsclean -D

除此之外, 也可以用下列命令删去目前安装的 port 没有使用的源码包文件:

# portsclean -DD

注意:

这个 portsclean 工具是 portupgrade 套件的一部分。

不要忘记删除那些已经安装, 但已不再使用的 ports。 用于自动完成这种工作的一个好工具是 ports-mgmt/pkg_cutleaves port。

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

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

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