FreeBSD Ports 套件用于从源代码安装,在 FreeBSD 中安装,同时可以用于从本地介质, 或从网上直接安装您喜欢的应用程序的最新版本。以下是关于如何安装和管理 Ports 的简要指南。
一、Ports套件优势
1、定制编译选项:使用 Ports 安装软件时,用户可以根据特定的硬件架构(如 Pentium 4 或 AMD Athlon)来优化编译选项。
2、灵活性:用户可以自定义配置选项,生成符合个人需求的软件包。
3、源代码可用性:某些软件的许可条款要求提供源代码,或用户希望自行审查源代码以确保安全性。
4、打补丁需求:需要对软件进行修补时,源代码是必需的。
5、直接接触源代码:许多用户喜欢与源代码互动,进行阅读和修改。
二、使用Ports Collection
在使用 Ports 之前,需要获得 Ports Collection,这实际上是 “/usr/ports” 目录下的一系列 Makefile、补丁和描述文件。
1、获得Ports Collection
在安装 FreeBSD 时,”sysinstall” 会询问是否要安装 Ports Collection。如果选择“否”,可以使用以下指令手动安装:
2、使用CVSup方法
CVSup 是一种更新 Ports 套件的有效方式。在 FreeBSD 中,CVSup 的实现为 “csup”。
- 确认 “/usr/ports” 为空:首次运行 “csup” 前,请确保该目录为空,以避免旧文件的干扰;
- 运行 csup:
csup -L 2 -h cvsup.FreeBSD.org /usr/share/examples/cvsup/ports-supfile
- 将 “cvsup.FreeBSD.org” 替换为离较近的服务器。
- 自定义 ports-supfile:若希望使用自己的配置文件,可以将 “/usr/share/examples/cvsup/ports-supfile” 复制到主目录,并编辑其中的服务器地址,然后运行:
csup -L 2 /root/ports-supfile
3、使用Portsnap方法
Portsnap 提供另一种获取 Ports 套件的方法。可使用以下命令:
获取快照:
portsnap fetch
首次提取快照:
portsnap extract
更新已安装的 Ports:
portsnap update
4、使用Sysinstall方法
这种方法通过安装介质安装 Ports 套件,但通常是较旧版本。如果有 Internet 连接,建议使用上述方法之一。
运行 sysinstall:
sysinstall
- 配置选择:依次选择“Configure” -> “Distributions”,然后选中“ports”,按空格确认;
- 选择安装介质:选择 CDROM、FTP 等安装来源,完成后退出;
- 按 “X” 退出 “sysinstall”。
三、安装Ports
在讨论 Ports Collection 时,首先需要了解什么是 “skeleton”。简单来说,port skeleton 是在 FreeBSD 上编译和安装程序所需的最小文件组合。每个 port skeleton 包含:
1、Makefile:此文件包含多个部分,指明应用程序的编译方式及安装位置。
2、distinfo 文件:该文件包含用于校验下载文件完整性的哈希信息(使用 sha256(1)),以确保下载过程中文件未被损坏。
3、files 目录:该目录包含在 FreeBSD 系统上编译和安装程序所需的补丁。补丁通常是小文件,指示对特定文件的修改,例如 “删除第 10 行” 或 “将第 26 行改为…”。这些补丁也称为 “diffs”,由 diff(1) 程序生成。此外,该目录还可能包含编译 port 所需的其他文件。
4、pkg-descr 文件:提供有关软件的多行详细描述。
5、pkg-plist 文件:列出了即将安装的所有文件,告知 ports 系统在卸载时需要删除哪些文件。
有些 ports 可能还包括其他文件,例如 pkg-message,这些文件在特定情况下被 ports 系统使用。
port 中包含了编译源代码的指令,但不包括实际的源代码。可以通过网络或 CD-ROM 获取源代码。源代码可能由开发者以各种格式发布,通常是经过 tar 和 gzip 压缩的文件,或者采用其他工具压缩或未压缩的文件。ports 中标识程序源代码的文件称为 “distfile”。安装 FreeBSD port 的方法不仅限于上述两种。
必须以 root 用户身份登录后才能安装 ports。在安装任何 port 之前,确保已更新到最新的 Ports Collection,并检查 FreeBSD VuXML(http://vuxml.freebsd.org/) 中是否有与该 port 相关的安全问题。
在安装应用程序之前,可以使用 “portaudit” 自动检查是否存在已知的安全问题。此工具也可以在 Ports Collection (ports-mgmt/portaudit) 中找到。在安装新的 port 之前,建议运行 “portaudit -F” 来获取最新的漏洞数据库。在每天的系统安全检查中,数据库会自动更新,并在此之后执行安全审计。
Ports 套件假定有可用的 Internet 连接。如果没有,需要手动将 distfile 放入 “/usr/ports/distfiles” 目录。
要开始安装,首先进入要安装 port 的目录:
cd /usr/ports/sysutils/lsof
进入 lsof 目录后,将看到该 port 的结构。接下来,只需在命令行输入 “make” 命令以编译该 port:
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 时,请注意任何出现的警告。
最后,删除工作目录是个好主意,因为其中包含了编译过程中使用的临时文件。这些文件可能占用宝贵的磁盘空间,并可能在升级新版本时造成麻烦。
make clean
使用 “make install clean” 命令可以一步完成 “make”、”make install” 和 “make clean” 的所有步骤。
一些 Shell 会缓存环境变量 PATH 中指定目录下的可执行文件,以加速查找速度。如果使用的是这类 Shell,在安装 port 之后可能需要执行 “rehash” 命令,才能运行新安装的命令。这个命令适用于类似 “tcsh” 的 Shell;对于类似 “sh” 的 Shell,对应的命令是 “hash -r”。
某些第三方 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 代理,可能需要设置这些变量。
当用户无法持续连接网络时,可以使用 “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”。如果存在这样的选项,通常会在编译时给出提示。
四、改变默认的Ports目录
有时,使用不同的工作临时目录和目标目录可能非常有用(甚至是必要的)。可以使用 “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” 中编译 port,并安装到 “/usr/home/example/local”。
可以使用以下命令来设置安装目录:
make WRKDIRPREFIX=../ports PREFIX=../local install
这条命令将包含两种设置(虽然在这一页无法完全展开,但应该已对此有所了解)。
此外这些变量也可以通过环境变量进行设置。
某些 port 使用 imake(这是 X Window 系统的一部分),可能无法正常使用 PREFIX。它们会强制将文件安装到 “/usr/X11R6” 下。同样,一些 Perl port 也会忽视 PREFIX,直接安装到 Perl 的目录中。让这些 port 尊重 PREFIX 有时困难,甚至是不可能的。
在编译某些 ports 时,可能会遇到基于 ncurses 的菜单,以选择编译选项。用户通常希望在某个 port 安装后,能再次访问菜单以添加、删除或修改选项。实际上,有几种方法可以实现这一点:
- 进入该 port 的目录,输入 “make config”,将再次显示菜单及已选择的项目;
- 使用 “make showconfig” 命令,显示所有配置选项;
- 执行 “make rmconfig”,删除所有已选择的项目。
五、卸载Ports
在错误地安装某个 port 之后,可以使用 “pkg_delete” 命令卸载,例如:
pkg_delete lsof-4.57
六、升级Ports
首先,使用 “pkg_version” 命令列出 Ports Collection 中提供更新版本的 ports:
pkg_version -v
七、查看 /usr/ports/UPDATING
在更新 Ports 套件后,务必查看 “/usr/ports/UPDATING” 文件。该文件中描述了用户在升级时需注意的问题,以及可能需要的操作。这可能包括文件格式更改、配置文件位置变动和与先前版本的兼容性等。如果 UPDATING 文件的内容与本书中介绍的不同,请以 UPDATING 为准。
八、使用Portupgrade更新Ports
“portupgrade” 工具旨在简化已安装 port 的升级。通过 “ports-mgmt/portupgrade” port 安装它:
cd /usr/ports/ports-mgmt/portupgrade make install clean
使用 “pkgdb -F” 命令扫描已安装 port 的列表,并修正不一致之处。在每次升级前定期执行此命令是个好主意。
运行 “portupgrade -a” 将升级系统中所有过时的 ports。若希望在每次升级时得到确认,需指定 “-i” 参数:
portupgrade -ai
要升级特定应用程序,使用 “portupgrade pkgname”。若需优先升级指定应用程序,使用 “-R” 参数:
portupgrade -R firefox
若希望使用预编译的 package 而非 ports 进行安装,需指定 “-P”。此选项会使 “portupgrade” 在本地目录和远程站点中搜索预编译包,如果都未找到,则使用 ports。若要禁止使用 ports,可以指定 “-PP”:
portupgrade -PP gnome2
若只想下载 distfiles(或在指定了 “-P” 的情况下下载 packages),而不进行构建或安装,可以使用 “-F”。
九、使用Portmanager升级Ports
“Portmanager” 是另一个用于简化已安装 port 升级的工具。可以通过 “ports-mgmt/portmanager” 安装:
cd /usr/ports/ports-mgmt/portmanager make install clean
可以用以下命令升级所有已安装的 port:
portmanager -u
若希望在每步操作前都得到提示,使用 “-ui” 参数。”Portmanager” 也可用于安装新的 ports,它在编译和安装所选 port 前,会升级所有依赖包:
portmanager x11/gnome2
若关于所选 port 的依赖有任何问题,可以用 “Portmanager” 以正确的顺序重新构建它们:
portmanager graphics/gimp -f
十、使用Portmaster升级Ports
“Portmaster” 是另一个用于升级已安装 ports 的工具。它设计成尽可能利用“基本”系统中的工具(不依赖其他 ports)以及 “/var/db/pkg/” 中的信息来检测需要升级的 ports。可以在 “ports-mgmt/portmaster” 找到它:
cd /usr/ports/ports-mgmt/portmaster make install clean
“Portmaster” 将 ports 分为四类:
- Root ports:不依赖其他 ports,也不被依赖
- Trunk ports:不依赖其他 ports,但被其他 ports 依赖
- Branch ports:依赖于其他 ports,同时也被依赖
- Leaf ports:依赖于其他 ports,但不被依赖
使用 “-L” 选项列出所有已安装的 ports 并查找存在更新的 ports:
portmaster -L
此命令将升级所有已安装的 ports:
portmaster -a
“Portmaster” 默认在删除现有 port 前会备份。如果新的版本成功安装,”Portmaster” 将删除备份。若使用 “-b”,则不自动删除备份。加上 “-i” 选项后,”Portmaster” 将在升级每个 port 前提示确认。
十一、Ports和磁盘空间
使用 Ports 套件会占用磁盘空间。在通过 ports 编译和安装软件后,应当记得清理临时的工作目录,可以使用以下命令:
make clean
也可以使用以下命令清理整个 Ports 套件:
portsclean -C
随着时间的推移,可能会在 “distfiles” 目录中积累大量源代码文件。可以手动删除这些文件,或者使用以下命令删除所有未被任何 port 引用的文件:
portsclean -D
此外还可以使用以下命令删除当前安装的 port 中未使用的源代码包文件:
portsclean -DD
这个 “portsclean” 工具是 “portupgrade” 套件的一部分。
不要忘记删除那些已经安装但不再使用的 ports。一个方便的工具是 “ports-mgmt/pkg_cutleaves”,可以自动完成这项工作。