For the complete documentation index, see llms.txt. This page is also available as Markdown.

19.2 使用源代码更新 FreeBSD

从源代码构建 FreeBSD 可以自定义内核选项和编译参数,适用于 freebsd-update 不支持的架构或需要裁剪系统的场景。

基本思路是获取 FreeBSD 的源代码,随后编译安装。可以使用 Git 直接拉取代码,也可以从 FreeBSD 下载站点获取 txz 压缩文件,或者从 GitHub 下载当前 FreeBSD 项目的 zip 压缩包。

编译流程请参考本书其他章节。

从 Git 获取源代码

安装 Git

使用 pkg 安装 Git:

# pkg install git

或者使用 Ports 安装 Git:

# cd /usr/ports/devel/git/
# make install clean

Git 代理设置方法

在网络环境受限制的情况下,可能需要为 Git 设置代理才能正常拉取源代码。下面介绍设置和取消 Git 代理的方法。

  • 设置 Git 全局代理:

# git config --global http.proxy http://192.168.X.X:7890  # 设置 Git 全局 HTTP 代理
# git config --global https.proxy http://192.168.X.X:7890  # 设置 Git 全局 HTTPS 代理
  • 取消 Git 全局代理:

Git 拉取源代码

拉取 CURRENT

从 FreeBSD 官方存储库拉取源代码。将 FreeBSD 源代码仓库克隆至 /usr/src,采用浅克隆以减少下载量:

参数 --depth 1 说明:采用浅克隆模式,仅获取最新提交,不包含完整的提交历史记录。

从 GitHub 拉取源代码(GitHub 为 FreeBSD.org 上 src 仓库的镜像,每 10 分钟同步一次)。

拉取某 RELEASE

通过 FreeBSD 官方存储库拉取。克隆 FreeBSD 15.0 发布分支源代码到 /usr/src,使用浅克隆并仅包含该分支:

选项解释:

  • --branch releng/15.0:指定拉取分支(FreeBSD RELEASE 的版本)

  • --single-branch:仅克隆一个分支,除所克隆的单一分支外不含任何其他引用(refs)。

或者通过 GitHub 拉取。从 GitHub 克隆 FreeBSD 15.0 发布分支源代码到 /usr/src,使用浅克隆并仅包含该分支:

参考文献

从压缩包获取源代码(方便但非最新)

该方法操作简便。

以 FreeBSD 15.0-RELEASE 为例:

为何需解压至 /

因为该压缩包包含路径,解压到 / 会将源代码解压到 /usr/src。如果将上面的路径改为 /usr/src,会将源代码解压到 /usr/src/usr/src

技巧

开始编译

附录:解决冲突

  • Conflicts remain from previous update, aborting.

需要解决冲突。

技巧

与多数现代 Linux 发行版不同,FreeBSD(OpenBSD)上的 vinvi(原版 ex/vi 的再实现),并非指向 vim 的符号链接。该编辑器使用频率较低,因此建议更换为其他文本编辑器。

合并冲突。使用 etcupdate 合并配置文件更新:

etcupdate 在合并后会自动触发若干系统文件的后续处理:

变更文件
触发命令

/etc/master.passwd

pwd_mkdb

/etc/login.conf

cap_mkdb

/etc/mail/aliases

newaliases

/etc/services

services_mkdb

/etc/localtime(且 /var/db/zoneinfo 存在)

tzsetup

/etc/motd

/etc/rc.d/motd

解决冲突:

故障排除与未竟事宜

Git:fatal: unable to update url base from redirection

使用 FreeBSD 源仓库地址时未加 .git 后缀。

Git:fatal: unable to access 'https://git.FreeBSD.org/src.git/': SSL certificate problem: certificate is not yet valid

系统时间不正确所致,使用 ntpd -q -g pool.ntp.org 同步系统时间即可解决。详细说明参考本书其他相关章节。

参考文献

课后习题

  1. 总结从 FreeBSD Git 仓库获取源代码的完整流程,列出所需命令及参数含义。

  2. 使用 etcupdate 管理 /etc 目录的配置文件更新,记录一次完整的合并冲突处理过程。

  3. 修改 /etc/src.conf,排除不需要的组件(如某些调试工具),测量 make buildworld 编译时间的变化。

最后更新于