名词说明:在英文文档中有 packages、package 和 ports、port 复数单数形式同时出现,官方中文文档中也有两种形式,所以两者是等价的。本文档试图将 Packages 和 Ports 作为专有名词来理解,所以统一使用复数形式,相关系统目录和网站目录都是默认使用了复数形式。
1. 概述
FreeBSD 与丰富的系统工具集合捆绑在一起作为基本系统的一部分。此外 FreeBSD 分享了两种用于安装第三方软件的互补技术:FreeBSD Ports Collection 用于从源代码安装以及 Packages 用于从预先构建的二进制文件安装。这两种方法都可用于从本地媒体或网络安装软件。
在 UNIX® 系统上安装第三方软件的典型步骤包括:
-
查找并下载可能以源代码格式或二进制形式分发的软件。
-
从其分发格式中解压缩软件。这通常是使用 compress(1), gzip(1), bzip2(1) 或者 xz(1) 等程序压缩的 tarball。
-
在 INSTALL、README 或 doc/ 子目录中的某个文件中找到文档 并阅读有关如何安装该软件的信息。
-
如果软件是以源格式分发的 请编译它。这可能涉及编辑 Makefile 或运行配置脚本。
-
测试并安装软件。
FreeBSD Ports 是一组文件旨在自动化从源代码编译应用程序的过程。组成 Ports 的文件包含自动下载、提取、修补、编译和安装应用程序所需的所有信息 (sysin)。
如果该软件尚未在 FreeBSD 上进行调整和测试,则源代码可能需要编辑才能正确安装和运行。
然而已经有超过 36000 个第三方应用程序被移植到 FreeBSD。在可行的情况下 这些应用程序可以作为预编译 Packages 下载。
可以使用 FreeBSD 包管理命令来操作 Packages。
Packages 和 Ports 都理解依赖关系。如果某个 Packages 或 Ports 用于安装应用程序并且尚未安装依赖库则会自动先安装该库。
FreeBSD Packages 包含应用程序所有命令的预编译副本以及任何配置文件和文档。可以使用 pkg(8) 命令操作包 例如 pkg install。
虽然这两种技术相似,但 Packages 和 Ports 各有其优势。请根据需要选择符合特定应用程序要求的技术来安装。
Packages 优势
-
压缩包 tarball 通常小于包含应用程序源代码的压缩 tarball。
-
Packages 不需要编译时间。对于大型应用程序 例如 Mozilla、KDE 或 GNOME,这在速度较慢的系统上可能很重要。
-
Packages 不需要对在 FreeBSD 上编译软件所涉及的过程有任何了解。
Ports 优势
-
Packages 通常使用保守的选项编译,因为它们必须在最大数量的系统上运行。通过从 Ports 编译,可以更改编译选项。
-
某些应用程序具有与安装哪些功能相关的编译时选项。例如,可以使用各种不同的内置选项配置 Apache。在某些情况下,同一应用程序将存在多个 Packages 以指定某些设置。例如 Ghostscript 可以作为 ghostscript Packages 和 ghostscript-nox11 Packages 使用,具体取决于是否安装了 Xorg。如果应用程序有一个或两个以上不同的编译时选项,则不可能快速创建多个 Packages。
-
某些软件的许可条件禁止二进制分发。此类软件必须作为源代码分发,最终用户必须对其进行编译。
-
有些人不信任二进制发行版, 或者更喜欢通读源代码以查找潜在问题。
-
需要源代码才能应用自定义补丁。
2. 查找(搜索)软件
Packages
1 | pkg search |
1 | pkg search -o |
查看安装到哪里了
1 | whereis |
Ports Collection
1 | cd /usr/ports |
显示更少的信息 请使用 quicksearch
功能:
1 | cd /usr/ports |
3. pkg 二进制包管理
pkg 是传统 FreeBSD 包管理工具的下一代替代品,分享了许多使处理二进制包更快、更容易的功能。对于希望只使用来自 FreeBSD 镜像的预构建二进制包的站点 (sysin),使用 pkg 管理包就足够了。但是对于那些从源代码构建或使用自己的存储库的站点,将需要一个单独的 Ports 管理工具。由于 pkg 仅适用于二进制包,因此它不能替代此类工具。这些工具可用于从二进制包和 Ports Collection 安装软件,而 pkg 仅安装二进制包。
3.1 启动 pkg
1 | pkg install git |
如果首次使用 pkg 命令,会提示初始化,也可以手动启动初始化过程。
FreeBSD 10.X. 及以上版本按如下两种方式开始使用 pkg:
直接执行命令:
1 | /usr/sbin/pkg |
如果安装了 Ports:
1 | cd /usr/ports/ports-mgmt/pkg |
转换旧的 pkg 格式(如果从旧版系统升级):
1 | pkg2ng |
使用帮助:
1 | pkg help install |
3.2 Quarterly(季度)和 Latest(最新)分支
Quarterly
分支为用户分享了更可预测和更稳定的 Ports 和 Packages 安装和升级体验。这基本上是通过只允许非功能更新来完成的。季度分支旨在接收安全修复(可能是版本更新或提交的反向移植)、错误修复和 Ports 合规性或框架更改。Quarterly 分支在每个(年度)季度的 1 月、4 月、7 月和 10 月开始时从 HEAD 中删除。分支根据创建的年份(YYYY)和季度(Q1-4)命名。例如 2016 年 1 月创建的季度分支命名为 2016Q1。而 Latest
分支为用户分享最新版本的软件包。要从季度分支切换到最新分支请运行以下命令:
1 | mkdir -p /usr/local/etc/pkg/repos |
编辑 /usr/local/etc/pkg/repos/FreeBSD.conf
在 url:
这一行 将 quarterly 修改为 latest:
1 | FreeBSD: { |
更新 latest repository metadata:
1 | pkg update -f |
3.3 获取 pkg 信息
1 | pkg info pkg |
3.4 安装和删除
安装 Packages:
1 | pkg install packagename |
示例,安装 curl:
1 | pkg install curl |
删除 Packages pkg delete
例如:
1 | pkg delete curl |
pkg remove
等价,常见的软件包管理工具都使用 remove 这个词汇,如 yum、apt 和 brew。
3.5 升级已经安装的 Packages
1 | pkg upgrade |
3.6 对已经安装的 Packages 进行审计(检查是否有安全漏洞)
1 | pkg audit -F |
3.7 自动移除不在使用的 Packages
1 | pkg autoremove |
作为依赖项安装的 Packages 称为 automatic Packages。非自动 Packages,即明确安装 的Packages 不是作为对另一个 Packages 的依赖项,可以使用以下方法列出:
1 | pkg prime-list |
pkg prime-list
是定义在 /usr/local/etc/pkg.conf 中的命令别名,其他命令如 pkg prime-origins
用于获取上述列表的源 Ports 目录:
1 | pkg prime-origins |
3.8 恢复 Packages Database
与传统的包管理系统不同 pkg 有自己的包数据库备份机制。默认情况下此功能启用。
如果需要禁用该功能 在 periodic.conf 中设置 daily_backup_pkgdb_enable="NO"
从 Packages database 备份中恢复:
1 | pkg backup -r /path/to/pkg.sql |
手动备份 pkg database:
1 | pkg backup -d /path/to/pkg.sql |
3.9 删除陈旧的 Packages
默认情况下 pkg 将二进制包存储在 pkg.conf 定义的 PKG_CACHEDIR
中。仅保留最新安装的软件包的副本。旧版本的 pkg 保留了所有以前的软件包。要删除这些过时的二进制包,请运行:
1 | pkg clean |
清理整个缓存目录:
1 | pkg clean -a |
3.10 修改 Packages 元数据(Metadata)
FreeBSD Ports Collection 中的软件可以进行主要版本号更改 (sysin)。为了解决这个问题 pkg 有一个内置命令来更新包来源。例如,如果 lang/php5 重命名为 lang/php53 这样 lang/php5 现在可以代表版本 5.4
。
示例:
1 | pkg set -o lang/php5:lang/php53 |
另外一个例子,升级 lang/ruby18 到 lang/ruby19:
1 | pkg set -o lang/ruby18:lang/ruby19 |
作为最后一个示例,将 libglut 共享库的来源从 graphics/libglut 更改为 graphics /freeglut 运行:
1 | pkg set -o graphics/libglut:graphics/freeglut |
4. Ports Collection
Ports Collection 是一组 Makefile、补丁和描述文件。这些文件的每一组都用于在 FreeBSD 上编译和安装一个单独的应用程序,称为 Ports。
默认情况下 Ports Collection 本身存储在 /usr/ports
的子目录中。
在安装和使用 Ports Collection 之前,请注意 将 Ports Collection 与通过 pkg 分享的二进制包结合使用来安装软件通常是不明智的。默认情况下 pkg 跟踪 Ports 树的季度分支版本,而不是 HEAD。与季度分支版本中的对应项相比 HEAD 中的 Ports 的依赖项可能不同,这可能导致 pkg 安装的依赖项与 Ports Collection 中的依赖项之间发生冲突。如果必须将 Ports Collection 和 pkg 结合使用,那么请确保您的 Ports Collection 和 pkg 在 Ports 树的同一分支版本上。
Ports Collection 包含软件类别的目录。每个类别内都有用于各个应用程序的子目录。每个应用程序子目录都包含一组文件,这些文件告诉 FreeBSD 如何编译和安装该程序,称为 Ports 框架(备注:英文 Ports skeleton)。每个 Ports 框架包括以下文件和目录:
-
Makefile:包含指定应如何编译应用程序及其组件应安装在何处的语句。
-
distinfo:包含必须下载以构建 Ports 的文件的名称和校验和。
-
files/:该目录包含程序在 FreeBSD 上编译和安装所需的任何补丁。该目录还可能包含用于构建 Ports 的其他文件。
-
pkg-descr:分享更详细的程序描述。
-
pkg-plist:Ports 将安装的所有文件的列表。它还告诉 Ports 系统在卸载时要删除哪些文件。
一些 Ports 包括 pkg-message 或其他文件来处理特殊情况。有关这些文件的更多详细信息以及 Ports 的一般信息 请参阅 FreeBSD Porter’s Handbook。
该 Ports 不包括实际的源代码 也称为 distfile。构建 Ports 的提取部分会自动将下载的源保存到 /usr/ports/distfiles。
4.1 安装 Ports Collection
步骤: Portsnap 方法:
FreeBSD base system 包含 Portsnap。
-
下载 Ports Collection 的压缩 snapshot 到 /var/db/portsnap:
1
portsnap fetch
-
解压 snapshot 到 /usr/ports:
1
portsnap extract
-
上面是首次使用的步骤,也可以根据需要更新 /usr/ports 命令如下:
1
2portsnap fetch
portsnap update这两个命令可以连续执行如下:
1
portsnap fetch update
步骤: Git 方法:
-
使用 Ports 安装 git:
1
2cd /usr/ports/devel/git
make install clean使用 pkg 安装 git:
1
pkg install git
-
签出 Ports tree 的 HEAD 分支的副本
1
git clone https://git.FreeBSD.org/ports.git /usr/ports
-
或者签出季度分支:
1
git clone https://git.FreeBSD.org/ports.git -b 2020Q3 /usr/ports
-
根据需要在初始 Git 签出后更新 /usr/ports:
1
git -C /usr/ports pull
-
根据需要将 /usr/ports 切换到不同的季度分支:
1
git -C /usr/ports switch 2020Q4
4.2 安装 Ports
使用 Ports Collection 假定 Internet 连接正常。它还需要超级用户权限。
要编译和安装 Ports 请切换到要安装的 Ports 的目录 然后在提示符下键入 make install
。消息将指示进度:
1 | cd /usr/ports/sysutils/lsof |
由于 lsof
是一个以更高权限运行的程序,因此在安装时会显示安全警告。安装完成后将返回提示。
在安装期间会创建一个工作子目录,其中包含编译期间使用的所有临时文件。删除此目录可以节省磁盘空间并最大限度地减少以后升级到新版本 Ports 时出现问题的可能性:
1 | make clean |
直接合并成一条命令执行即可:
1 | make install clean lsof |
4.3 自定义 Ports 安装
某些 Ports 分享构建选项,可用于启用或禁用应用程序组件、分享安全选项或允许其他自定义。示例包括 www/firefox、security/gpgme 和 mail/sylpheed-claws。如果 Ports 依赖于具有可配置选项的其他 Ports 它可能会暂停几次以供用户交互,因为默认行为是提示用户从菜单中选择选项。为了避免这种情况并批量完成所有配置,请在 Ports 框架内运行 make config-recursive
。然后 运行 make install [clean]
来编译和安装 ports。
使用 config-recursive
时要配置的 Ports 列表由 all-depends-list
目标收集。建议运行 make config-recursive
直到定义了所有依赖 Ports 选项 并且不再出现 Ports 选项屏幕,以确保所有依赖选项都已配置。
有多种方法可以重新访问 Ports 的构建选项菜单,以便在构建 Ports 后添加、删除或更改这些选项。一种方法是将 cd
放入包含 Ports 的目录并键入 make config
。另一种选择是使用 make showconfig
。另一种选择是执行 make rmconfig
它将删除所有选定的选项并允许您重新开始。所有这些选项以及其他选项在 ports(7) 中有详细解释。
Ports 系统使用 fetch(1) 下载源文件,支持各种环境变量。如果 FreeBSD 系统位于防火墙或 FTP/HTTP 代理之后 则可能需要设置 FTP_PASSIVE_MODE
、FTP_PROXY
和 FTP_PASSWORD
变量。有关支持的变量的完整列表 请参阅 fetch(3)。
对于不能一直上网的用户,可以在 /usr/ports 中运行 make fetch
来获取所有的 distfiles 或者在一个类别中例如 /usr/ports/net 或者在特定的 ports 框架中。请注意,如果 Ports 有任何依赖项,在类别或 Ports 框架中运行此命令将 不会 从另一个类别获取 Ports 的 distfiles。相反,使用 make fetch-recursive
也可以获取 Ports 所有依赖项的 distfiles。
在极少数情况下 例如当组织拥有本地 distfiles 存储库时,MASTER_SITES
变量可用于覆盖 Makefile 中指定的下载位置。使用时,指定备用位置:
1 | cd /usr/ports/directory |
WRKDIRPREFIX
和 PREFIX
变量可以覆盖默认的工作目录和目标目录。例如:
1 | make WRKDIRPREFIX=/usr/home/example/ports install |
将在 /usr/home/example/ports 中编译 Ports 并将所有内容安装在 /usr/local 下。
1 | make PREFIX=/usr/home/example/local install |
将在 /usr/ports 中编译 Ports 并将其安装在 /usr/home/example/local 中。如:
1 | make WRKDIRPREFIX=../ports PREFIX=../local install |
将两者结合。
这些也可以设置为环境变量。有关如何设置环境变量的说明 请参阅 shell 的手册页。
4.4 移除安装的 Ports
安装的 Ports 可以使用 pkg delete
来删除 也可以在 Ports 目录下执行 make deinstall
命令:
1 | cd /usr/ports/sysutils/lsof |
4.5 升级 Ports
升级 Ports 前请先更新 Ports tree 参看上述 “安装 Ports Collection” 部分。FreeBSD 10 及以上版本使用 pkg 命令列出已经安装过期 Ports:
1 | pkg version -l "<" |
FreeBSD 9.X 及以下版本使用以下命令出列已经安装的过期 Ports:
1 | pkg_version -l "<" |
4.5.1 升级和管理 Ports 的工具
过去大多数安装使用 Portmaster 或 Portupgrade。Synth 是一种较新的替代方案。
4.5.2 使用 Portmaster 升级 Ports
ports-mgmt/portmaster 是一个非常小的实用程序,用于升级已安装的 ports。它旨在使用随 FreeBSD 基本系统安装的工具,而不依赖于其他 ports 或数据库。将此实用程序安装为 ports:
1 | cd /usr/ports/ports-mgmt/portmaster |
Portmaster 定义了四类 Ports:
- 根 Ports(Root orts):没有依赖关系,也不是任何其他 Ports 的依赖关系。
- 中继 Ports(Trunk ports):没有依赖关系,但其他 Ports 依赖它。
- 分支 Ports(Branch ports):有依赖关系,其他 Ports 依赖它。
- 叶 Ports(Leaf ports):有依赖关系,但没有其他 Ports 依赖它。
要列出这些类别并搜索更新:
1 | portmaster -L |
此命令用于升级所有过时的 Ports:
1 | portmaster -a |
默认情况下 Portmaster 会在删除现有 Ports 之前制作一个备份包。如果新版本安装成功 Portmaster 会删除备份。使用 -b
指示 Portmaster 不要自动删除备份。添加 -i
以交互模式启动 Portmaster 在升级每个 Ports 之前提示确认。许多其他选项可用。通读 portmaster(8) 的手册页以了解有关其用法的详细信息。
如果升级过程中遇到错误,添加 -f
来升级和重建所有 port:
1 | portmaster -af |
Portmaster 还可用于在系统上安装新 ports,在构建和安装新 Ports 之前升级所有依赖项。要使用此功能,请在 Ports Collection 中指定 Ports 的位置:
1 | portmaster shells/bash |
有关 ports-mgmt/portmaster 的更多信息可以在其 pkg-descr 中找到。
4.5.3 使用 Portupgrade 升级 Ports
ports-mgmt/portupgrade 是另一个可用于升级 Ports 的实用程序。它安装了一套可用于管理 Ports 的应用程序。但是它依赖于 Ruby。安装此 ports:
1 | cd /usr/ports/ports-mgmt/portupgrade |
在使用此实用程序执行升级之前,建议使用 pkgdb -F
扫描已安装 Ports 的列表并修复它报告的所有不一致之处。
要升级系统上安装的所有过时 ports,请使用 portupgrade -a
。或者包括 -i
以要求确认每个单独的升级:
1 | portupgrade -ai |
要仅升级指定的应用程序而不是所有可用的 ports,请使用 portupgrade *pkgname*
。首先升级给定应用程序所需的所有 Ports 时,包含 “-R” 参数非常重要:
1 | portupgrade -R firefox |
如果包含 -P
参数,Portupgrade 会在 PKG_PATH
中列出的本地目录中搜索可用的 packages。如果本地没有可用的 packages,它就会从远程站点获取 packages。如果无法在本地找到或远程获取 packages,Portupgrade 将使用 ports。为避免完全使用 Ports 请指定 -PP
。如果没有可用的 packages,最后一组选项告诉 Portupgrade 中止:
1 | portupgrade -PP gnome3 |
如果指定了 -P
只获取 Ports distfiles 或 packages,而不构建或安装任何东西,请使用 -F
。有关所有可用选项的更多信息,请参阅 “portupgrade” 的手册页。
有关 ports-mgmt/portupgrade 的更多信息可以在其 pkg-descr 中找到。
4.6 Ports 和磁盘空间
随着时间的推移,使用 Ports Collection 将耗尽磁盘空间。在构建和安装 Ports 后 在 Ports 框架内运行 make clean
将清理临时工作目录。如果使用 Portmaster 安装 Ports 除非指定了 -K
否则它会自动删除此目录。如果安装了 Portupgrade,以下命令将删除在 Ports 集合的本地副本中找到的所有工作目录:
1 | portsclean -C |
此外 过时的源代码分发文件会随着时间的推移而堆积在 /usr/ports/distfiles 中。要使用 Portupgrade 删除不再被任何 Ports 引用的所有 distfiles:
1 | portsclean -D |
Portupgrade 可以删除系统上当前安装的任何 Ports 未引用的所有 distfiles:
1 | portsclean -DD |
如果安装了 Portmaster 使用如下命令:
1 | portmaster --clean-distfiles |
默认情况下 此命令是交互式的 并提示用户确认是否应删除 distfile。除了这些命令之外 ports-mgmt/pkg_cutleaves 自动执行删除不再需要的已安装 Ports 的任务。
5. 使用 Poudriere 构建 Packages
Poudriere 是一个 BSD 许可的实用程序 用于创建和测试 FreeBSD 软件包。它使用 FreeBSD jails 来设置隔离的编译环境。这些 jail 可用于为与安装它的系统不同的 FreeBSD 版本构建 Packages,如果主机是 amd64 系统,也可以为 i386 构建包。构建 P ackages 后,它们的布局与官方镜像相同。这些包可供 pkg(8) 和其他包管理工具使用。
Poudriere 是使用 ports-mgmt/poudriere Packages 或 Ports 安装的。安装包括一个示例配置文件 /usr/local/etc/poudriere.conf.sample。将此文件复制到 /usr/local/etc/poudriere.conf。编辑复制的文件以适合本地配置。
虽然在运行 poudriere 的系统上不需要 ZFS 但它是有益的。使用 ZFS 时 必须在 /usr/local/etc/poudriere.conf 中指定 ZPOOL 并将 FREEBSD_HOST 设置为附近的镜像。定义 CCACHE_DIR 可以使用 devel/ccache 来缓存编译并减少频繁编译代码的构建时间。将 poudriere 数据集放在安装在 /poudriere 的孤立树中可能会很方便。其他配置值的默认值就足够了。
检测到的处理器内核数用于定义并行运行的构建数量。分享足够的虚拟内存包括 RAM 或交换空间。如果虚拟内存耗尽,编译监狱将停止并被拆除,从而导致奇怪的错误消息。
6. 安装后注意事项
无论软件是从二进制 Packages 还是 Ports 安装的,大多数第三方应用程序在安装后都需要某种级别的配置。以下命令和位置可用于帮助确定与应用程序一起安装的内容。
-
大多数应用程序在 /usr/local/etc 中至少安装一个默认配置文件。在应用程序有大量配置文件的情况下,将创建一个子目录来保存它们。通常会安装以 .sample 等后缀结尾的示例配置文件。应审查并可能编辑配置文件以满足系统的需要。要编辑示例文件 ,请先复制它而不带 .sample 扩展名。
-
分享文档的应用程序会将其安装到 /usr/local/share/doc 中,许多应用程序也会安装手册页。在继续之前应查阅此文档。
-
某些应用程序运行的服务必须在启动应用程序之前添加到 /etc/rc.conf 中。这些应用程序通常在 /usr/local/etc/rc.d 中安装启动脚本。有关更多信息 请参阅 Starting Services。
按照设计,应用程序在安装时不会运行其启动脚本,也不会在卸载或升级时运行其停止脚本。这个决定留给个人系统管理员。
- csh(1) 的用户应该运行 rehash 来重建 shells PATH 中的已知二进制列表。
下载仅供下载体验和测试学习,不得商用和正当使用。
下载体验