github编辑

5.2 更换 FreeBSD 软件源

软件源概览

软件源
简介
备注

pkg

类似于传统 Linux 的包管理器,用于安装二进制软件包

如果不需要以二进制方式安装软件可以不配置,默认未安装 pkg,输入 pkg 回车会提示安装,除 pkgbase 外的 pkg 包实际上都是由 Port 直接构建而来

Ports 框架

拉取 Port 的源代码模板(本身不含源代码,只是对第三方软件的一些描述文件和补丁集和 Makefile)。Ports 是这些 Port 的 集合,在 freebsd-ports 存储库中统一维护

Gentoo 的包管理器 Portage(命令为 emerge)即是借鉴于此。用于帮助用户从源代码编译安装第三方的软件。换言之,Ports(Port 集合)类似 Gentoo 的 ebuild 数据库arrow-up-right 备份arrow-up-right

ports 源

在 Port 中的 Makefile 文件中会定义若干软件包源码的地址,该软件源用于拉取这些源。因为有时候从官方上游拉取速度不佳。

等同于 Gentoo 的 Distfiles 源arrow-up-right 备份arrow-up-right。不需要源代码方式编译软件可以不配置。

freebsd-update

用于更新基本系统(内核 + 用户空间)

预计在 FreeBSD 16 中退役,转而使用 pkgbase

pkgbase

将 FreeBSD 基本系统(内核 + 用户空间)打包成 pkg 包,使用 pkg(8) 管理基本系统的方式,取代传统的 freebsd-update 和 distribution

从 FreeBSD 15.0 开始可选(技术预览,在整个 15.X 周期内可选),预计在 16.0 成为默认/标准方式。14.X 为实验性支持,可使用 pkgbasify 工具转换。基本系统升级/维护使用 pkg upgrade。生产环境建议继续使用传统方式。需配置 FreeBSD-base 源(见下文)。参考 PkgBase Wikiarrow-up-right备份arrow-up-right。pkgbase 实际上由存储库 freebsd-src 构建而来,与 Ports 完全无关。FreeBSD 基本系统始终是独立于 Ports 而自存的

kernel modules(kmods)

内核模块源(包含无线网卡驱动、以太网卡驱动、DRM 显卡驱动等),用于解决小版本之间可能存在的 ABI 不兼容问题

FreeBSD(pub)

提供 ISO 安装镜像、文档、开发资料、snapshots,在系统安装、系统救援和开发参考时有很大帮助

此处的 Pub,指的是官方的 http://ftp.freebsd.org/pub/FreeBSD/arrow-up-right。其性质类似于普通的镜像分发仓库,与 debian-cd、ubuntu-releases 等属于同一类型。目前已知全量同步 FreeBSD(Pub)源的镜像站:https://mirrors.nju.edu.cn/freebsdarrow-up-right。其提供了完整的目录结构(如 snapshotsdevelopment),且更新较为及时,参见 FreeBSD.org ftp serverarrow-up-right 备份arrow-up-right 目录结构。

理解 quarterly 季度分支与滚动更新的 latest 分支

FreeBSD 的 pkg 分为 quarterly(季度,由 Ports 的 XXXXQY 分支构建而来)分支和 latest(实时更新,由 Ports 的 main 分支构建而来)分支两个源。quarterly 目前是 FreeBSD 默认的 pkg 软件分支。

# git clone https://git.FreeBSD.org/ports.git /usr/ports # 克隆 FreeBSD ports 仓库到 /usr/ports 目录
正克隆到 '/usr/ports'...
remote: Enumerating objects: 6715646, done.
remote: Counting objects: 100% (936/936), done.
remote: Compressing objects: 100% (120/120), done.
remote: Total 6715646 (delta 923), reused 816 (delta 816), pack-reused 6714710 (from 1)
接收对象中: 100% (6715646/6715646), 1.50 GiB | 10.26 MiB/s, 完成.
处理 delta 中: 100% (4065984/4065984), 完成.
正在更新文件: 100% (168004/168004), 完成.
root@ykla:/home/ykla # cd /usr/ports/ # 切换到 git 的 Ports 路径
root@ykla:/usr/ports # git branch -a # 列出本地所有分支
* main
  remotes/origin/2014Q1
  remotes/origin/2014Q2
  remotes/origin/2014Q3
  remotes/origin/2014Q4

     ……省略一部分……

  remotes/origin/2025Q2
  remotes/origin/2025Q3
  remotes/origin/2025Q4
  remotes/origin/HEAD -> origin/main # 可以看到 main 是默认分支
  remotes/origin/main
root@ykla:/usr/ports # git for-each-ref --sort=-committerdate --format='%(committerdate:short) %(authorname) %(refname:short) %(objectname:short)' refs/remotes/ # 列出所有分支及最后提交者与时间 ①
2025-10-24 Hiroki Tagato origin be5283280c16
2025-10-24 Hiroki Tagato origin/main be5283280c16
2025-10-23 Colin Percival origin/2025Q4 060d3d65fcbb
2025-10-14 Bryan Drewery origin/2025Q3 9f09f84b2dd5
2025-07-01 FiLiS origin/2025Q2 c339266c40e5

  ……省略一部分……

2015-07-23 Palle Girgensohn origin/2015Q2 7d7c2271f6c9
2015-04-09 Alonso Schaich origin/2015Q1 5bd325869bde
2014-10-01 Bryan Drewery origin/2014Q3 a0ccd6f83108
2014-06-28 Thomas Zander origin/2014Q2 a3377806e58e
2014-03-29 Lars Engels origin/2014Q1 5f4d6e1d6b07
root@ykla:/usr/ports # git merge-base origin/main origin/2025Q4 # 查找两个分支的最近共同祖先 commit
6c256c6adb790f0588b920d41a5fe4dfa550079f
root@ykla:/usr/ports # git branch -r --contains 6c256c6adb790f0588b920d41a5fe4dfa550079f # 列出哪些远程分支历史中包含此 commit ②
  origin/2025Q4
  origin/HEAD -> origin/main
  origin/main
root@ykla:/usr/ports # for branch in $(git branch -r | grep -v HEAD); do # 查看分支创建的时间 ③
>   mb=$(git merge-base origin/main $branch)
>   date=$(git show -s --format='%ci' $mb)
>   echo "$branch created around $date"
> done

origin/2014Q1 created around 2013-12-16 08:00:15 +0000
origin/2014Q2 created around 2014-04-01 12:02:40 +0000
origin/2014Q3 created around 2014-07-01 10:13:26 +0000
origin/2014Q4 created around 2014-10-01 06:43:32 +0000
origin/2015Q1 created around 2015-01-01 14:35:03 +0000
origin/2015Q2 created around 2015-04-01 12:19:37 +0000
origin/2015Q3 created around 2015-07-01 12:12:08 +0000
origin/2015Q4 created around 2015-10-01 19:24:12 +0000

……省略一部分……

origin/2024Q4 created around 2024-10-07 20:46:12 +0200
origin/2025Q1 created around 2025-01-05 11:22:53 +0100
origin/2025Q2 created around 2025-04-01 12:58:51 +0200
origin/2025Q3 created around 2025-07-01 22:32:34 +0300
origin/2025Q4 created around 2025-10-01 21:27:17 +0200
origin/main created around 2025-10-24 12:43:02 +0900

其中,quarterly 的内容由 main 分支(latest)的提交回溯而来,每年的 1 月、4 月、7 月、10 月 ③ 会发布新的分支(从特定时间点的 main 分支切出 ①),形如 2014Q32025Q1。这是为了便于通过 git 直接拉取所需的分支,但 Ports 管理团队(portmgr)只会维护最新分支,旧分支不再允许任何合并。②

quarterly 实际上类似于 Debian 的 Stable 版本,此处的 Stable 不仅表示“稳定”,也包含“固定”的含义。我们有必要区分“稳定”和“固定”两个词语:

根据 Merriam‑Websterarrow-up-right 备份arrow-up-rightCambridge Dictionaryarrow-up-right,Stable 有“fixed”(固定)的意思。我们来看一下《现代汉语词典(第 7 版)》第 1374 页,就会发现“稳定”第一个释义被解释为“形容词,稳定安固,没有变动”;第 470 页载“固定”为“动词,不变动或不移动(跟‘流动’相对)”。因此,“固定”是实现“稳定”的一种手段,而“稳定”是一种目的。

技巧

Debian 是通过 固定 软件包的版本,仅接受安全更新不接受功能更新来实现的 稳定,手段是其软件源是 固定,Stable 系统的软件源也是 Stable 分支的——Debian 还有 testing 等分支。我们可以看到常见发行版是通过 固定 软件来实现的 Stable 版本。由于这些软件包已经历经了从 unstable(即 sid,Ubuntu 即基于此)testing 等多个分支的测试和发展,软件包自然比较 稳定。而且在 Stable 版本的系统生命周期内,任何软件基本上都不会得到大版本更新和功能更新。参见 DebianStabilityarrow-up-right 备份arrow-up-right(看起来是稳定的意思)、Chapter 3. Choosing a Debian distributionarrow-up-right 备份arrow-up-right(实际上是固定的意思),中文版在 第 3 章 选择一个 Debian 发布版本arrow-up-right 备份arrow-up-right2.2. Are there package upgrades in "stable"?arrow-up-right 备份arrow-up-right 指出软件不会有功能性更新。

FreeBSD pkg 的 quarterly 分支也试图实现相同的目的(提供可预测和稳定的用户体验),也是通过 非功能性更新 来实现的——除非涉及 Ports 框架、安全更新(故并非完全禁止版本更替)、简单错误修复(构建、编译、打包)等。任何功能性更新都不会被回溯至 quarterly 分支。可以看出 FreeBSD 的 quarterly 也同时兼有稳定和固定的双重含义。

注意

并非所有源都提供 quarterlylatest,具体请参见 https://pkg.freebsd.org/arrow-up-right 。也并非为所有架构都提供了 pkg 源,与平台支持等级有关。

参考文献

15.0-RELEASE 快速切换 pkg 软件源到中国科学技术大学开源镜像站

该配置要求读者在安装过程中就使用了 pkgbase 方式。可以帮助读者配置 pkg 二进制包源(ports 构建而来)、pkgbase 源、内核模块源。

使用 ee 编辑器打开 /usr/local/etc/pkg/repos/FreeBSD.conf 文件。

技巧

如果提示文件不存在或打开后内容并非 FreeBSD-base: { enabled: yes },则本小节不适用。请按下文内容手动配置。

清空 FreeBSD.conf 中原有内容 FreeBSD-base: { enabled: yes }

写入以下内容:

随后运行命令 pkg update -f 刷新软件源即可。

技巧

可以简单地将上述配置中的两个 quarterly 都替换成 latest 来使用滚动更新的软件源。

pkg 二进制包(由 Ports 构建的二进制包)换源

FreeBSD 中的 pkg 源分为系统级和用户级两个配置文件。不建议 直接修改 /etc/pkg/FreeBSD.conf因为该文件会随着基本系统的更新而发生改变。

警告

请勿同时启用多个 pkg 镜像站,无论是官方镜像站(如 pkg.freebsd.org 与 USTC 混用),还是境内非官方镜像站都不建议混合使用!后果类似于 FreeBSD 季度分支的 Ports 和 latest 分支的 pkg 混用,可能会破坏软件的依赖关系。案例:混用导致 KDE 桌面被删除arrow-up-right 备份arrow-up-right

警告

请勿同时混用 quarterlylatest,在所有配置文件中尽量保持一致。

若要获取滚动更新的包,请将 quarterly 修改为 latest。二者区别参见上文。请注意,对于 CURRENT 版本默认只提供了 latest

示例:使用命令修改系统级 pkg 源使用 latest:

14.X-RELEASE

创建用户级源目录和文件

创建 pkg 仓库配置目录:

使用 ee 编辑器打开配置文件 /usr/local/etc/pkg/repos/USTC.conf(将自动创建文本文件 USTC.conf):

注意

在本文中,/usr/local/etc/pkg/repos/USTC.conf 将是 pkg 二进制源、模块源和 pkgbase 源共用的配置文件。不再赘述这一过程。

中国科学技术大学开源软件镜像站

编辑 /usr/local/etc/pkg/repos/USTC.conf 文件,写入以下配置 之一

  • quarterly:

  • latest:

15.0-RELEASE

FreeBSD 15.0-RELEASE 以降,FreeBSD 源的名称,由 FreeBSD-kmods 变更为 FreeBSD-ports

官方源

欲了解更多,参见源代码 usr.sbin/pkg/FreeBSD.conf.quarterly-releasearrow-up-right。下同。

这是 15.0-RELEASE 系统安装完成后默认的软件源。

中国科学技术大学开源软件镜像站

编辑 /usr/local/etc/pkg/repos/USTC.conf 文件,写入以下配置 之一

  • quarterly 分支:

  • latest 分支:

内核模块源(Kernel modules, kmods)

14.X-RELEASE

中国科学技术大学开源软件镜像站

编辑 /usr/local/etc/pkg/repos/USTC.conf,写入以下配置之一:

  • quarterly 分支:

  • latest 分支:

15.0-RELEASE

FreeBSD 15.0-RELEASE 以降,kmods 源的名称,由 FreeBSD-kmods 变更为 FreeBSD-kmods-ports

中国科学技术大学开源镜像站

编辑 /usr/local/etc/pkg/repos/USTC.conf 文件,写入以下配置 之一

  • quarterly 分支:

  • latest 分支

注意

最好保持 ports 源和 kmods 源(若开启 pkgbase,则还须纳入 pkgbase 源)为同一镜像站,以避免发生潜在的依赖等问题。

面向基本系统的 pkgbase 源(适用 FreeBSD 14.3-RELEASE 及以上)

pkgbaseFreeBSD 15.0-RELEASE 中为技术预览出现,FreeBSD 项目仍支持传统方式直至 15.X 结束。在生产环境中使用 pkgbase 升级系统时应注意备份。

技巧

14.x 用户可以选择由传统安装方式直接转换为 pkgbase,参见本书其他相关文章。

官方源

默认路径:/etc/pkg/repos/FreeBSD.conf(请勿修改,仅做展示)

注意

根据 FreeBSD 源代码 usr.sbin/bsdinstall/scripts/pkgbase.inarrow-up-right 最后几段源代码,/etc/pkg/repos/FreeBSD.conf 中的 FreeBSD-base 源 虽然是 enabled: no,但是那些在安装中选择了 pkgbase 的用户,会在 /usr/local/etc/pkg/repos/FreeBSD.conf 中写入 FreeBSD-base: { enabled: yes } 这行来显式覆盖默认配置,即对于那些 pkgbase 用户,FreeBSD-base 源实际上是默认启用的。

中国科学技术大学开源软件镜像站

禁用默认启用的官方 FreeBSD-base 源:

技巧

在某些环境中,文件 /usr/local/etc/pkg/repos/FreeBSD.conf 里也可能包含非 FreeBSD-base 仓库的定义,建议用户在重命名之前先确认文件内容。

编辑 /usr/local/etc/pkg/repos/USTC.conf 文件,写入以下配置:

警告

对于 RELEASE 版本的系统,pkgbase 在整个生命周期内是几乎固定不变的!

仓库 base_latestbase_weekly 仅面向 STABLE 或 CURRENT!

请勿变动字符串 base_release_${VERSION_MINOR}

技巧

在从 14.X pkgbase 系统升级到 15.0 时,常遇到签名密钥问题。请确保 /usr/share/keys/pkgbase-15 存在(如果缺失,可从官方源手动 fetch 或参考 Release Notes 中的升级说明)。否则会出现 “no trusted public keys found” 错误。详见 15.0 Release Notes - Upgradingarrow-up-right 备份arrow-up-right 和论坛相关讨论。

STABLE/CURRENT 快速切换 pkg 软件源到中国科学技术大学开源镜像站

警告

STABLE/CURRENT 并非生产版本,不适用于生产环境,使用上述版本的用户被推定为具有一定的知识基础,故此小节未列出具体步骤和过多解释。

内核模块源

  • 对于 FreeBSD 14.x-STABLE

  • 对于 FreeBSD 15.0-STABLE / FreeBSD 16.0-CURRENT

pkgbase 源

Ports:以源代码方式编译安装软件的框架

用于下载 ports 本身(即 freebsd-portsarrow-up-right 项目)。

通过 Git 拉取 Ports

须参照其他章节提前安装 git,从略。

使用 git 拉取 Ports 源代码:

注意

--depth 1(仅拉取最新的日志和提交记录)会给服务器带来较大计算压力,请尽量使用参数 --filter=tree:0 进行拉取。

通过归档文件获取 Ports

警告

通过该方法拉取的 Ports 属于一次性方式:Ports 后续将无法更新,建议优先采用 Git 方法。

从南京大学开源镜像拉取:

或者从中国科学技术大学开源镜像拉取:

然后处理压缩包:

Ports 源

该源用于下载 Ports 框架中软件(称 Port)的源代码。

警告

ports 源可能并不完整,这是受 Ports 框架结构的限制。见 https://github.com/ustclug/discussions/issues/408arrow-up-right

创建或修改文件 /etc/make.conf。写入以下配置文件 之一

  • 南京大学开源镜像站

  • 中国科学技术大学开源软件镜像站

故障排除与未竟事宜

平衡安全与便利

为什么 pkg 配置文件中要写完整选项(mirror_type / signature_type / fingerprints)

虽然只写 urlenabled: yes pkg 也能正常工作(pkg 会默认 mirror_type: "none"signature_type: "none"),但这样做 关闭了签名验证。不会检查 pkg 下载的包是否被篡改,可能存在安全风险(尤其是 ports、kmods 和 pkgbase 系统包)。

其优点在于:

  • 启用 signature_type: "fingerprints"fingerprints:使用 FreeBSD 官方内置密钥验证包签名

  • mirror_type: "none":适合国内的 HTTPS 直链镜像(官方用 "srv" 是因为 pkg+https:// 支持 DNS SRV,但镜像站不需要)

推荐在生产环境始终启用签名验证。如果追求极简,可以去掉这些行,但不建议,除非你完全信任网络环境。

警告

目前中国大陆境内不存在任何 FreeBSD 官方镜像站。

对于那些以安全性为较高优先级的用户来说,应该使用默认的官方镜像 pkg.freebsd.org!其由 FreeBSD 项目官方构建、分发和维护。

旧版本存档的 pkg 二进制包源(请酌情使用)

技巧

网易开源镜像站还提供了 FreeBSD 11、12 等过期版本的 pkg 二进制源。可自行配置使用。但可能存在安全风险。

不受安全支持的版本也是可以使用二进制源的。以下,以 FreeBSD 9.2 为例:

首先切换成可以用的二进制源

如果 shell 不是 csh,那么:

安装示例:现在安装 bsdinfo

注意

pkg 是不可用的,会提示找不到 digests.txzrepo.txz,因为当时 pkgng 还没有被官方所支持,仍然仅支持使用 pkg_* 命令。

最后更新于