FreeBSD 使用 Ports 集安装软件包
Ports 集是由很多以软件名命名的目录组成,目录中为该应用程序的配置文件,也称为一个 Port,这些配置文件包括 Makefile、补丁和描述文件。Ports 集默认存储在 /usr/ports 目录下。
pkg 可以的分支有:
- Quarterly 分支:按季度发布的软件分支,会自动使用当前最新的季度分支
- Latest 分支:包含最新软件版本的分支
Ports 集可以使用的分支有:
- 季度分支:需要设置特定的季度分支,如 2025Q4,不能自动使用当前最新的季度分支
- HEAD 分支:包含最新软件版本的分支,对应 pkg (Packages)的 Latest 分支
注意:最好只使用 Ports 或 pkg 中的一种安装软件,因为 Ports 和 pkg 可能使用不同的分支,不同的分支依赖的软件的版本不同,同时使用 Ports 和 pkg 安装软件,软件包的依赖可能会存在冲突。
如果想要同时使用 Ports 和 pkg 安装软件,需要使它们使用同一分支。
Ports 目录结构
Ports 集按照软件的类别划分目录,类别目录下的每个子目录对应一个应用程序,在应用程序目录中包含应用程序的配置文件::
- Makefile:编译文件,用来指定编译规则和安装路径
- distinfo:内容为源代码文件的名称和校验和
- files/:包含补丁文件和构建软件所需的其他文件
- pkg-descr:应用程序的详细描述
- pkg-plist:安装的所有文件的列表,用于卸载时删除文件
- pkg-message:安装后的提示信息,不是全部 Ports 都包含该文件
Ports 当中不包含源代码文件,就是 distfile,编译时会自动下载源码到 /usr/ports/distfiles 目录。
安装 Ports 集
在安装系统时,选择软件包最好不要安装 Ports 集。
推荐使用 Git 安装 Ports 集,因为使用 Git 安装 Ports 集可以灵活的切换使用的分支。
安装 Git
使用 pkg 命令安装 Git:
pkg install git
克隆 Ports 树:
克隆 Ports 树就是把远程的 Ports 目录结构和文件内容下载到本地,在下载 Ports 集时使用 git 可以指定分支。
1)不指定任何分支时,默认使用 HEAD 分支:
git clone --depth 1 https://git.FreeBSD.org/ports.git /usr/ports
2)指定 Quarterly 分支,需要指定特定的季度,特定季度分支的名称为 年份 + 季度,如 2025Q4:
git clone --depth 1 https://git.FreeBSD.org/ports.git -b 2025Q4 /usr/ports
3)选项说明:
-b:指定具体分支--depth 1:表示不克隆提交记录;如果需要克隆提交记录,删除该参数即可。
注:Ports 最好不要使用国内镜像源,因为国内镜像源没有完整的。
更新 Ports 树
使用如下的命令更新 Ports 树:
git -C /usr/ports pull
切换分支
1)切换分支前需要先下载需要分支的 Ports 集,如下载特定 Quarterly 分支 2025Q4 :
git -C /usr/ports fetch --depth 1 origin 2025Q4:2025Q4
2)切换分支:
git -C /usr/ports switch 2025Q4
安装 Ports 应用
在使用 Ports 集安装软件之前,最好先先使用 git -C /usr/ports pull 更 Ports 树,并使用 pkg audit -F 检查应用是否存在安全漏洞。
在使用 Ports 集安装软件需要具有 doas、sudo 或者 root 执行权限,且需要联网。
基本安装步骤
1)进入应用的 Ports 目录
以安装 lsof 为例:
cd /usr/ports/sysutils/lsof
2)编译并安装
执行编译并安装命令,会自动下载源代码、解压、打补丁、配置、编译并安装:
make install
# 或者使用 doas 执行
doas make install
3)清理临时文件
在编译时会生成很多的编译文件和其他文件,使用如下的命令删除这些临时文件:
make clean
# 或者使用 doas 执行
doas make clean
注:也可以一次性执行编译安装和清理临时文件命令:
make install clean
# 或者使用 doas 执行
doas make install clean
安装说明
使用 Port 安装的应用,默认安装在 /usr/local 目录中。
自定义 Ports 安装
一些 Ports 支持自定义构建选项,如可以启用 / 禁用某些功能模块、添加某些安全选项,如 www/firefox 和 security/gpgme。
构建配置选项
可以使用如下命令构建配置选项:
make config:配置当前 Port 的构建选项,会弹出一个菜单供选择;使用space选中或取消选中,使用Tab或方向键移动选项,使用Enter确定选择。make config-recursive:一次性配置当前 Port 及其所有依赖 Port 的选项,可以避免多次弹窗;使用space选中或取消选中,使用Tab或方向键移动选项,使用Enter确定选择。make showconfig:查看当前 Port 的配置选项make rmconfig:清除当前 Port 的配置选项,重新配置
自定义下载与安装路径
指定下载地址
若需从国内镜像或者其他镜像下载源代码,可以使用 MASTER_SITE_OVERRIDE 选项指定下载地址。
1)转到应用程序的 Port 目录:
cd /usr/ports/目录
2)使用 MASTER_SITE_OVERRIDE 选项指定下载地址
make MASTER_SITE_OVERRIDE=ftp://ftp.example.com/pub/FreeBSD/ports/distfiles/ fetch
指定工作目录
可以使用 WRKDIRPREFIX 选项指定编译时使用的工作目录,用于存放临时文件:
make WRKDIRPREFIX=~/ports install
指定安装目录
可以使用 PREFIX 选项指定应用安装目录,默认的安装目录为 /usr/local:
make PREFIX=~/local install
离线下载源代码
可以先下载软件包,然后再进行安装;可以使用如下命令下载源代码:
1)下载当前 Port 的源代码:
make fetch
2)下载当前 Port 及其所有依赖包的源代码:
make fetch-recursive
卸载 Ports 应用
使用 Ports 集安装的应用,具有两种卸载的方式。
使用 pkg 命令卸载
推荐:使用 Ports 集安装的应用,也可以使用 pkg 命令卸载,与卸载 pkg 安装的应用方式相同:
pkg delete 应用名
使用 make 命令卸载
与使用 make 命令安装 Ports 应用相对应,同样可以 make 命令卸载应用。
1)转到应用目录
cd /usr/ports/应用目
2)运行 make 命令,卸载应用程序:
make deinstall
注:卸载时若提示有其他应用的依赖该 Port,卸载完成后,建议重新安装依赖该应用的其他应用,避免依赖出现问题,而使应用无法正常运行。
升级 Ports 应用
在升级 Ports 应用之前,首先要更新 Ports 应用,确保 Ports 中的应用版本是最新的。
查看可升级的 Ports
使用如下命令可以列出所有的可升级的 Ports,也就是版本过期的 Ports:
pkg version -l "<"
升级前准备
在升级之前可以查看 /usr/ports/UPDATING 文件,查看升级注意事项:
less /usr/ports/UPDATING
使用 Portmaster 升级
推荐使用 Portmaster 升级应用,ports-mgmt/portmaster 是轻量的 Ports 升级工具。
安装 Portmaster
1)转到 Portmaster 的 Port 目录:
cd /usr/ports/ports-mgmt/portmaster
2)安装 Portmaster:
make install clean
查看 Ports 分类及更新
使用如下命令查看 Ports 分类及更新:
portmaster -L
升级 Ports
1)使用如下的命令升级所有过时 Ports:
portmaster -a
常用选项解释说明:
-b:保留旧版本备份软件包-i:以交互的形式升级软件,升级前需要先确认-af:强制升级并重建所有 Ports
2)安装新 Port 并同时升级其依赖的所有软件包:
安装时,只需指定 Port 的目录:
portmaster shells/bash
使用 Synth 升级
Synth 是较新的 Ports 管理工具,支持并行编译,适合大规模升级应用。
安装 Synth
1)转到 Synth 的 Port 目录:
cd /usr/ports/ports-mgmt/synth
2)安装 Synth:
make install clean
初始化 Synth
在初次使用 Synth 之前,需要先初始化其配置:
synth configure
升级 Ports
使用如下的命令升级所有 Ports:
synth upgrade-system
清理 Ports 空间
Ports 编译会占用大量磁盘空间,可通过以下命令清理。不推荐使用 Portupgrade,因为在将来会被移除。
清理编译临时目录
转到 Port 目录,清理当前 Port 的临时文件:
make clean
清理源代码文件
使用 portmaster 交互式的清除源代码文件:
portmaster --clean-distfiles
移除无用 Ports
使用 Ports 安装 ports-mgmt/pkg_cutleaves,然后运行 pkg_cutleaves 命令,自动删除无用的 Port:
pkg_cutleaves