26.6.从源代码更新 FreeBSD
通过从源代码编译更新 FreeBSD,相比二进制更新,有几个优点。可以通过选项构建代码以利用特定硬件。可以使用非默认设置构建基本系统的部分,或者在不需要或不需要的地方完全省略它们。构建过程更新系统需要更长时间,但能完全定制,以生成定制版本的 FreeBSD。
26.6.1. 快速入门
这是一个快速参考,用于说明通常用于通过从源代码构建来更新 FreeBSD 的步骤。后面的部分将更详细地说明这个过程。
||引导 /etc 文件库的数据库;有关更多信息,请参见 etcupdate(8)。|| --| --------------------------------------------------------------------------------------------------------------------------------------------------------------| ||引导后检查差异。修剪任何不再需要的本地更改,以减少未来更新中冲突的机会。|
更新和构建
在构建源代码之前或之后,请检查 /usr/src/UPDATING 以获取任何需要的手动步骤。
前往源目录。
编译整个世界,除了内核。
编译并安装内核。这相当于 make buildkernel installkernel。
重启系统到新内核。
升级和合并在 /etc/ 中安装之前所需的配置文件。
进入源目录。
安装世界。
更新并合并 /etc/ 中的配置文件。
重启系统以使用新构建的世界和内核。
26.6.2. 准备源更新
阅读 /usr/src/UPDATING。在更新之前或之后必须执行的任何手动步骤都在此文件中说明。
26.6.3. 更新源
FreeBSD 源代码位于/usr/src/。更新此源代码的首选方法是通过 Git 版本控制系统。验证源代码是否在版本控制下:
这表明/usr/src/已在版本控制下,并且可以使用 git(1)进行更新:
如果目录长时间未更新,更新过程可能需要一些时间。完成后,源代码将是最新的,并且可以开始下一节中说明的构建过程。
获得来源: 如果输出显示 fatal: not a git repository,那里的文件丢失或是用不同的方法安装的。需要对来源进行新的检出。
表 1. FreeBSD 版本和存储库分支
<em>X.Y</em>-RELEASE
releng/<em>X.Y</em>
发行版本加上仅关键安全性和错误修补程序。建议大多数用户使用此分支。
<em>X.Y</em>-STABLE
stable/<em>X</em>
发行版本加上该分支上的所有额外开发。STABLE 指的是应用程序二进制接口(ABI)不会更改,因此为早期版本编译的软件仍然可以运行。例如,为在之后编译的 FreeBSD 10-STABLE 上运行而编译的软件仍将在 FreeBSD 10.1 上运行。 STABLE 分支偶尔会有可能影响用户的错误或不兼容性,尽管这些问题通常会很快得到修复。
<em>X</em>-CURRENT
main
FreeBSD 的最新未发布开发版本。CURRENT 分支可能存在重大错误或不兼容性,仅推荐给高级用户使用。
使用 uname(1)确定 FreeBSD 的版本:
根据 FreeBSD 版本和存储库分支,用于更新 13.2-RELEASE 的源具有存储库路径 releng/13.2。在检出源代码时使用该路径:
从 FreeBSD 版本和存储库分支的路径添加到存储库 URL。第三个参数是本地系统上源代码的目标目录。
26.6.4。从源代码构建
世界或操作系统的所有部分都是经过编译的。首先这样做是为了提供最新的工具来构建内核。然后构建内核本身:
编译的代码被写入 /usr/obj。
这些是基本步骤。说明了控制构建的其他选项。
26.6.4.1. Performing a Clean Build
Some versions of the FreeBSD build system leave previously-compiled code in the temporary object directory, /usr/obj. This can speed up later builds by avoiding recompiling code that has not changed. To force a clean rebuild of everything, use cleanworld
before starting a build:
26.6.4.2. Setting the Number of Jobs
增加多核处理器上构建作业数量可以提高构建速度。使用 sysctl hw.ncpu 确定核心数量。处理器各不相同,不同版本的 FreeBSD 使用的构建系统也不同,因此测试是确定不同作业数量如何影响构建速度的唯一方法。作为起点,考虑核心数量的一半到两倍之间的值。作业数量由 -j 指定。
示例 1. 增加构建作业数量
使用四个作业构建世界和内核:
26.6.4.3. 仅构建内核
如果源代码已更改,则必须完成 buildworld。之后,可以随时运行 buildkernel 来构建内核。仅构建内核:
26.6.4.4. 构建定制内核
标准的 FreeBSD 内核基于一个名为 GENERIC 的内核配置文件。GENERIC 内核包含最常用的设备驱动程序和选项。有时,构建自定义内核是有用或必要的,可以添加或删除设备驱动程序或选项以满足特定需求。
例如,开发具有严重受限 RAM 的小型嵌入式计算机的人可以删除不需要的设备驱动程序或选项,使内核略微变小。
内核配置文件位于/usr/src/sys/arch/conf/,其中 arch 是从 uname -m 输出的内容。在大多数计算机上,这是 amd64,得到的配置文件目录是/usr/src/sys/amd64/conf/。
可以通过复制 GENERIC 配置文件来创建自定义配置文件。在此示例中,新的自定义内核用于存储服务器,因此命名为 STORAGESERVER:
/root/STORAGESERVER 然后进行编辑,根据 config(5)中显示的内容添加或删除设备或选项。
通过在命令行上将 KERNCONF 设置为内核配置文件来构建定制内核:
26.6.5. 安装已编译的代码
在完成 buildworld 和 buildkernel 步骤之后,安装新的内核和系统。
如果构建了定制内核,则还必须设置 KERNCONF 以使用新的定制内核:
26.6.6. 完成更新
完成更新的最后几个任务。任何修改过的配置文件将与新版本合并,过时的库将被定位并移除,然后系统将重启。
26.6.6.1. 使用 etcupdate(8)合并配置文件
etcupdate(8)是一种用于管理不作为 installworld 的一部分更新的文件的工具,例如位于/etc/中的文件。它通过对对这些文件所做更改与本地版本的三向合并来管理更新。etcupdate(8)的设计旨在最大程度减少用户干预量。
该命令允许用户审计配置更改。
如果 etcupdate(8)无法自动合并文件,则可以通过手动交互来解决合并冲突:
||引导库存/等等文件数据库; 有关更多信息,请参阅 etcupdate(8)。| --| ---------------------------------------------------------------------------------------------| ||在引导后检查差异。修剪不再需要的任何本地更改,以减少将来更新中冲突的机会。
26.6.6.2. 检查过期文件和库
更新后可能会留下一些过时的文件或目录。这些文件可能位于:
并删除:
也可能会留下一些过时的库。可以使用以下方法检测到这些库:
并且在删除
当这些旧库被删除后,仍在使用这些旧库的程序将停止工作。这些程序必须在删除旧库后重新构建或替换。
26.6.6.3. 更新后重启
更新后的最后一步是重启计算机,以使所有更改生效:
最后更新于