下面的几个小节中, 给出了关于如何使用 Ports 套件来在您的系统中安装或卸载程序的介绍。 关于可用的 make targets 以及环境变量的介绍, 可以在 ports(7) 中找到。
在您能使用 ports 之前, 您必须先获得 Ports Collection ── 本质上是 /usr/ports 目录下的一堆 Makefile、 补丁和描述文件。
在您安装 FreeBSD 系统的时候, sysinstall 会询问您是否需要安装 Ports Collection。 如果您选择 no, 那您可以用下面的指令来安装 Ports Collection:
CVSup 方法
保持您本地 Ports 套件最新的一种快捷的方法, 是使用 CVSup 来进行更新。 如果您希望了解更多关于 CVSup 的细节, 请参见 使用 CVSup。
安装 net/cvsup-without-gui 软件包:
# pkg_add -r cvsup-without-gui
请参见 如何安装 CVSup (第 A.5.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 服务器。
此后运行 cvsup(1) 命令将下载最近所进行的改动, 并将它们应用到您的 Ports Collection 上, 不过这一过程并不重新联编您系统上的 ports。
Portsnap 方式
Portsnap 是另一种用于发布 Ports 套件的方法。 它最早从 FreeBSD 6.0 开始引入。 在较早的系统中, 您可以通过 sysutils/portsnap package 来安装它:
# pkg_add -r portsnap
请参见 使用 Portsnap 以了解关于全部 Portsnap 功能的详细描述。
如果您使用 FreeBSD 6.1-RELEASE 或, 或通过 port 或 package 安装了较新版本的 Portsnap 的话, 可以直接跳过这一步。 /usr/ports 将在首次使用 portsnap(8) 命令时自动创建。 而如果您使用的是较早期版本的 Portsnap, 就只能手工创建空的 /usr/ports 目录了。
# mkdir /usr/ports
下载压缩的 Ports 套件快照到 /var/db/portsnap。 您可以根据需要在这之后关闭 Internet 连接。
# portsnap fetch
假如您是首次运行 Portsnap, 则需要将快照释放到 /usr/ports:
# portsnap extract
如果您已经有装好的 /usr/ports 而您只想更新, 则应执行下面的命令:
# portsnap update
Sysinstall 方式
这种方法需要使用 sysinstall 从安装介质上安装 Ports 套件。 注意, 安装的将是发布发行版时的旧版 Ports 套件。 如果您能访问 Internet, 应使用前面介绍的方法之一。
以 root 身份运行 sysinstall (对 FreeBSD 5.2 之前的版本, 应执行 /stand/sysinstall):
# sysinstall
用光标向下选择 Configure, 并按 Enter。
向下并选择 Distributions, 按 Enter。
选择 ports, 并按 Space。
选择 Exit, 并按 Enter。
选择所希望的安装介质, 例如 CDROM、 FTP, 等等。
选择 Exit 并按 Enter。
按 X 退出 sysinstall。
当提到 Ports Collection 时, 第一个要说明的就是何谓 “skeleton”。 简单地说, port skeleton 是让一个程序在 FreeBSD 上简洁地编译并安装的所需文件的最小组合。 每个 port skeleton 包含:
一个 Makefile。 Makefile 包括好几个部分, 指出应用程序是如何编译以及将被安装在系统的哪些地方。
一个 distinfo 文件。这个文件包括这些信息: 这些文件用来对下载后的文件校验和进行检查, 使用 md5(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 (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 可以一步完成 make、 make install 和 make 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_MODE、 FTP_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/mozilla、 security/gpgme、 以及 mail/sylpheed-claws。 如果存在这样的选项, 通常会在编译时给出提示。
有时, 使用不同的工作临时目录和目标目录可能很有用 (甚至是必要的)。 可以用 WRKDIRPREFIX 和 PREFIX 这两个变量来改变默认的目录。 例如:
# 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 的联机手册上关于如何设置环境变量的说明。
一些 port 使用 imake (这是 X Window 系统的一部分) 不能正常地配合 PREFIX, 它们会坚持把文件安装到 /usr/X11R6 下面。 类似地, 一些 Perl port 会忽略 PREFIX 并把文件安装到 Perl 的目录中。 让这些 port 尊重 PREFIX 是困难甚至是不可能的事情。
现在您已经了解了如何安装 ports, 并希望进一步了解如何卸载, 特别是在安装了某个之后发现不合适的 port 时。 我们将卸载前面例子 (假如您没有注意的话, 是 lsof) 中安装的 port。 Ports 可以同 packages 以完全相同的方式 (在 Packages 一节 中进行了介绍) 卸载, 方法是使用 pkg_delete(1) 命令:
# pkg_delete lsof-4.57
首先, 使用 pkg_version(1) 命令来列出 Ports Collection 中提供了更新版本的那些 port:
# pkg_version -v
注意: 一旦您更新了 Ports Collection, 在开始升级之前, 应该首先检查一下 /usr/ports/UPDATING 文件。 它描述了在升级时可能遇到的问题, 以及因应的步骤。
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)。
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 联机手册。
使用 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]>.