4.5 使用Ports Collection

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

4.5.1 获得Ports Collection

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

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

CVSup 方法

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

  1. 安装 net/cvsup-without-gui 软件包:

    # pkg_add -r cvsup-without-gui
    

    请参见 如何安装 CVSup (第 A.5.2 节) 以了解更多细节。

  2. 运行 cvsup

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

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

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

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

    2. 编辑 ports-supfile

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

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

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

Portsnap 方式

Portsnap 是另一种用于发布 Ports 套件的方法。 它最早从 FreeBSD 6.0 开始引入。 在较早的系统中, 您可以通过 sysutils/portsnap package 来安装它:

# pkg_add -r portsnap

请参见 使用 Portsnap 以了解关于全部 Portsnap 功能的详细描述。

  1. 如果您使用 FreeBSD 6.1-RELEASE 或, 或通过 port 或 package 安装了较新版本的 Portsnap 的话, 可以直接跳过这一步。 /usr/ports 将在首次使用 portsnap(8) 命令时自动创建。 而如果您使用的是较早期版本的 Portsnap, 就只能手工创建空的 /usr/ports 目录了。

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

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

    # portsnap extract
    

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

    # portsnap update
    

Sysinstall 方式

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

  1. root 身份运行 sysinstall (对 FreeBSD 5.2 之前的版本, 应执行 /stand/sysinstall):

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

  3. 向下并选择 Distributions, 按 Enter

  4. 选择 ports, 并按 Space

  5. 选择 Exit, 并按 Enter

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

  7. 选择 Exit 并按 Enter

  8. X 退出 sysinstall

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的方法还不止这两种。

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

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

在安装应用程序之前, 可以使用 portaudit 来自动地检查是否存在已知的安全问题。 这个工具同样可以在 Ports Collection (security/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。 如果存在这样的选项, 通常会在编译时给出提示。

4.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 的联机手册上关于如何设置环境变量的说明。

4.5.2.2 处理 imake

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

4.5.3 卸载已经安装的 Ports

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

# pkg_delete lsof-4.57

4.5.4 升级 Ports

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

# pkg_version -v

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

4.5.4.1 使用 Portupgrade 来更新 Ports

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

# cd /usr/ports/sysutils/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 -PR gnome2

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

4.5.4.2 使用 Portmanager 来升级 Ports

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

# cd /usr/ports/sysutils/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 联机手册。

4.5.5 Ports 和磁盘空间

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

# portsclean -C

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

# portsclean -D

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

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

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

如果对于FreeBSD有问题,请先阅读文档,如不能解决再联系<[email protected]>.
关于本文档的问题请发信联系 <[email protected]>.