> For the complete documentation index, see [llms.txt](https://handbook.bsdcn.org/llms.txt). Markdown versions of documentation pages are available by appending `.md` to page URLs; this page is available as [Markdown](https://handbook.bsdcn.org/di-27-zhang-freebsd-geng-xin-yu-sheng-ji/27.8.-duo-tai-ji-qi-de-zhui-zong.md).

# 27.8.多台机器的追踪

当多个机器需要跟踪相同的源代码树时，让每台机器下载源代码并重新编译所有内容会浪费磁盘空间、网络带宽和 CPU 周期。解决方案是让一台机器执行大部分工作，其它机器通过 NFS 挂载该机器的工作内容。本节概述了这种方法。有关使用 NFS 的更多信息，请参阅 [Network File System (NFS)](/di-33-zhang-wang-luo-fu-wu-qi/33.3.-wang-luo-wen-jian-xi-tong-nfs.md)。

首先，识别一组将运行相同二进制文件的机器，称为 *构建集*（build set）。每台机器可以有定制内核，但将运行相同的用户空间二进制文件。在该构建集中，选择一台机器作为 *构建机器*，用于构建世界和内核。理想情况下，这台机器应当速度较快，且有足够的空闲 CPU 来运行 `make buildworld` 和 `make buildkernel`。

选择一台机器作为 *测试机器*，在将软件更新投入生产之前对其进行测试。这台机器 *必须* 是能承受长时间停机的机器。它可以是构建机器，但不一定非得是构建机器。

该构建集中的所有机器都需要通过 NFS 从构建机器挂载 **/usr/obj** 和 **/usr/src**。对于多个构建集，**/usr/src** 应该仅在一台构建机器上，并通过 NFS 挂载到其它机器上。

确保构建集中的所有机器上的 **/etc/make.conf** 和 **/etc/src.conf** 与构建机器上的一致。这意味着构建机器必须构建所有构建集中的机器将要安装的基本系统的部分。同时，每台构建机器应在其 **/etc/make.conf** 中使用 `KERNCONF` 设置其内核名称，并且构建机器应将所有内核名称列在其 `KERNCONF` 中，首先列出自己的内核。构建机器必须在其 **/usr/src/sys/arch/conf** 中有每台机器的内核配置文件。

在构建机器上，按照 [从源代码更新 FreeBSD](/di-27-zhang-freebsd-geng-xin-yu-sheng-ji/27.6.-cong-yuan-dai-ma-geng-xin-freebsd.md) 中的说明构建内核和世界，但不要在构建机器上安装任何东西。相反，将构建好的内核安装到测试机器上。在测试机器上，通过 NFS 挂载 **/usr/src** 和 **/usr/obj**。然后，运行 `shutdown now` 进入单用户模式，安装新内核和世界，并像往常一样运行 `etcupdate`。完成后，重启以返回正常的多用户操作模式。

在确认测试机器上的一切都正常后，使用相同的流程将新软件安装到构建集中的其它机器上。

相同的方法可以用于 ports 树。第一步是通过 NFS 共享 **/usr/ports** 给构建集中的所有机器。要配置 **/etc/make.conf** 来共享 distfiles，将 `DISTDIR` 设置为共享目录，该目录需对 NFS 挂载所映射的 root 用户可写。如果需要在本地构建 ports，每台机器应将其 `WRKDIRPREFIX` 设置为本地构建目录。或者，如果构建系统需要构建并分发包到构建集中的机器上，可以在构建系统上将 `PACKAGES` 设置为类似于 `DISTDIR` 的目录。
