FreeBSD提供了两种补充技术,用以在系统中安装第三方软件: FreeBSD Ports 套件 (用于从源代码安装), 以及packages (用以从预编译的二进制版本安装)。这两种方法都可以从本地介质或网络直接安装所需的应用程序的最新版本。本教程主要介绍如何安装Packages应用程序。
一、软件安装预览
如果以前使用过 UNIX® 系统,典型的第三方软件安装步骤如下:
1、下载软件,发行版可能是源代码格式或二进制包。
2、解压软件(常用工具有 “compress”、”gzip” 或 “bzip2″)。
3、阅读相关文档,了解安装步骤(通常文件名为 “INSTALL” 或 “README”,或者在 “doc/” 目录下)。
4、如果软件是源代码形式发布,则需要编译它,可能需要编辑 “Makefile” 文件或运行 “configure” 脚本等。
5、测试并安装软件。
如果一切顺利,这个过程就这么简单。不过在安装某些软件包时,可能会遇到错误,需要对其代码进行编辑以确保其正常工作。
二、Packages介绍
Packages是可以下载的 FreeBSD package 文件,包含编译好的副本、配置文件或文档。可以使用 FreeBSD 的包管理命令(如 “pkg_add(1)”、”pkg_delete(1)”、”pkg_info(1)”)来操作下载的包,通过简单命令即可安装新应用。
请注意,packages 和 ports 是相辅相成的。例如如果要安装一个依赖特定库的应用程序,系统会自动检查并安装相关库。
ports详情可参考:《FreeBSD安装Ports套件》
Package的优点:
- 一个压缩的 package 通常比源代码的应用程序小得多;
- package 不需要额外的编译,尤其对于大型应用(如 Mozilla、KDE 或 GNOME),在系统资源有限的情况下尤为重要;
- package 不需要了解在 FreeBSD 上编译软件的详细过程。
在安装任何应用程序之前,建议检查 FreeBSD 的安全问题报告(http://vuxml.freebsd.org/),确保安装的软件没有已知漏洞。还可以安装 “ports-mgmt/portaudit”,自动检查已安装应用程序的漏洞,或使用 “portaudit -F -a” 命令在安装软件后进行检查。
三、确定应用程序
在安装应用程序之前,需要知道所需程序的名称。FreeBSD 中可用的应用程序不断增加,幸运的是,有多种方法可以帮助找到所需的程序:
- 访问 FreeBSD官方网站搜索当前所有可用应用程序的列表,可以按程序名称或分类进行搜索;
- Dan Langille 维护的FreshPorts(http://www.FreshPorts.org/) 网站会跟踪 ports 中的应用程序变化,并在程序升级时发送邮件提醒;
- 如果不确定应用程序的名字,可以通过 [Freshmeat](http://www.freshmeat.net/) 查找,找到后可回到 FreeBSD 主站确认该应用程序是否已被 port。
如果知道一个 port 的准确名称但想知道其类别,可以使用 “whereis(1)” 命令。输入 “whereis file”(其中 file 是想安装的程序名)可查看该程序的位置。
例如:
# whereis lsof lsof: /usr/ports/sysutils/lsof
该结果显示 “lsof”(一个系统配置程序)位于 “/usr/ports/sysutils/lsof”。
还可以使用 “echo(1)” 命令来查找某个 port 是否存在于 ports 树中。例如:
# echo /usr/ports/*/*lsof* /usr/ports/sysutils/lsof
请注意,这条命令将返回所有符合条件的文件,包括下载到 “/usr/ports/distfiles” 目录中的文件。
另一个查找 port 的方法是使用 ports collection 内嵌的搜索机制。进入 “/usr/ports” 目录,运行以下命令:
# cd /usr/ports # make search name=program-name
将 “program-name” 替换为想寻找的程序名称。例如,如果要找 “lsof”:
# make search name=lsof
输出中包含 “Path:” 的行将告诉该 port 的具体位置。尽管其他信息不是必须的,但了解软件的维护者和依赖关系也很有帮助。
此外还可以使用 “make search key=string”,其中 “string” 是想搜索的部分内容。这将搜索 port 的名称、注释、描述和从属关系,帮助找到所需的程序。
以上搜索方式不区分大小写,搜索 “LSOF” 和 “lsof” 的结果是一样的。
四、使用Package系统
在 FreeBSD 系统上,有多种工具可用于管理软件包。”sysinstall” 工具可以在运行中的系统上执行安装、删除以及列出可用和已安装的预编译软件包。
1、安装软件包
可以使用 “pkg_add(1)” 命令从本地文件或网络服务器安装 FreeBSD 软件包。
示例 1:从本地手动下载并安装软件包
# ftp -a ftp2.FreeBSD.org Connected to ftp2.FreeBSD.org. 220 ftp2.FreeBSD.org FTP server (Version 6.00LS) ready. 331 Guest login ok, send your email address as password. 230 Guest login ok, access restrictions apply. Remote system type is UNIX. Using binary mode to transfer files. ftp> cd /pub/FreeBSD/ports/packages/sysutils/ 250 CWD command successful. ftp> get lsof-4.56.4.tgz local: lsof-4.56.4.tgz remote: lsof-4.56.4.tgz 200 PORT command successful. 150 Opening BINARY mode data connection for 'lsof-4.56.4.tgz' (92375 bytes). 100% || 92375 00:00 ETA 226 Transfer complete. ftp> exit # pkg_add lsof-4.56.4.tgz
如果没有本地软件包安装盘(如 FreeBSD CD-ROM),可以使用 “pkg_add(1)” 命令并加上 “-r” 选项。这将强制程序自动识别目标文件的格式和版本,并从一个 FTP 站点寻找并安装软件包。
# pkg_add -r lsof
上述示例将下载最新的软件包,而无需用户干预。如果希望指定 FreeBSD 软件包的镜像站点,可以通过设置 “PACKAGESITE” 环境变量来覆盖默认设置。”pkg_add(1)” 使用 “fetch(3)” 下载文件,可以通过多种环境变量配置,包括 “FTP_PASSIVE_MODE”、”FTP_PROXY” 和 “FTP_PASSWORD”。如果使用 FTP/HTTP 代理或位于防火墙后面,可能需要设置这些环境变量。有关详细列表,请参考 “fetch(3)”。
使用 “pkg_add(1)” 时,软件名不需要包含版本号,程序会自动找到最新版本。
如果使用 FreeBSD-CURRENT 或 FreeBSD-STABLE 版本,”pkg_add(1)” 将下载最新的应用软件。如果使用 -RELEASE 版本的 FreeBSD,程序将获取与版本相应的软件包版本。可以通过修改环境变量 “PACKAGESITE” 来改变这一行为。
例如如果运行 FreeBSD 8.1-RELEASE 系统,默认情况下 “pkg_add(1)” 将尝试从 “ftp://ftp.freebsd.org/pub/FreeBSD/ports/i386/packages-8.1-release/Latest/” 下载预编译的软件包。如果希望强制 “pkg_add(1)” 下载 FreeBSD 8-STABLE 的软件包,可以将 “PACKAGESITE” 设置为”ftp://ftp.freebsd.org/pub/FreeBSD/ports/i386/packages-8-stable/Latest/”。
软件包使用 “.tgz” 和 “.tbz” 两种格式。可以在 “ftp://ftp.FreeBSD.org/pub/FreeBSD/ports/packages/” 或从 FreeBSD 的发行光盘的 “/packages” 目录中找到这些软件包。软件包的设计与 “/usr/ports” 树一致,每个分类都有自己的目录,所有软件包可以在 “All” 目录中找到。
软件包系统的目录结构与 ports 的设计一致,它们共同构成了整个 package/port 系统。
2、软件包管理
“pkg_info(1)” 是用于列出已安装的所有软件包及其描述的工具。
# pkg_info cvsup-16.1 A general network file distribution system optimized for CV docbook-1.2 Meta-port for the different versions of the DocBook DTD ...
“pkg_version(1)” 是一个统计所有已安装软件包版本的工具。它可以比较本地软件包的版本与 ports 目录中的当前版本。
# pkg_version cvsup = docbook = ...
第二列的符号表示已安装版本与本地 ports 目录中可用版本的关系:
| 符号 | 含义 | |------|------| | = | 与本地 ports 树中的版本相匹配 | | < | 已安装版本较旧 | | > | 已安装版本较新(本地 ports 树可能未更新) | | ? | 已安装软件包在 ports 索引中找不到(可能是因为早先安装的 port 已从树中移除或更名) | | * | 软件包有多个版本 | | ! | 已安装软件包在索引中有记录,但 pkg_version 无法比较版本号 |
3、删除软件包
要删除已安装的软件包,只需使用 “pkg_delete(1)” 工具。
# pkg_delete xchat-1.7.1
请注意,”pkg_delete(1)” 需要提供完整的包名。如果只指定类似 “xchat” 的名称,操作将被拒绝。不过,可以使用 “pkg_version(1)” 查看已安装软件包的版本。此外,还可以使用通配符:
# pkg_delete xchat*
这将删除所有以 “xchat” 开头的软件包。
4、其他
所有已安装软件包的信息保存在 “/var/db/pkg” 目录下。该目录中的相关文件包含安装文件的列表以及每个软件包的内容和描述。