# 26.8.多台机器的追踪

当多个机器需要跟踪相同的源代码树时，让每台机器下载源代码并重新编译所有内容会浪费磁盘空间、网络带宽和 CPU 资源。解决方案是让一台机器执行大部分工作，其它机器通过 NFS 挂载该机器的工作内容。本节概述了这种方法。有关使用 NFS 的更多信息，请参阅 [Network File System (NFS)](https://docs.freebsd.org/en/books/handbook/network-servers/#network-nfs)。

首先，识别一组将运行相同二进制文件的机器，称为 *构建集*（build set）。每台机器可以有一个自定义内核，但将运行相同的用户空间二进制文件。在这个中，选择一台机器作为 *构建机器*，用于构建世界（world）和内核。理想情况下，这台机器应该是快速的，具有足够的 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](https://docs.freebsd.org/en/books/handbook/cutting-edge/#makeworld) 中的描述构建内核和世界，但不要在构建机器上安装任何东西。相反，将构建好的内核安装到测试机器上。在测试机器上，通过 NFS 挂载 **/usr/src** 和 **/usr/obj**。然后，运行 `shutdown now` 进入单用户模式，安装新内核和世界，并像往常一样运行 `etcupdate`。完成后，重启以返回正常的多用户操作模式。

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

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


---

# Agent Instructions: Querying This Documentation

If you need additional information that is not directly available in this page, you can query the documentation dynamically by asking a question.

Perform an HTTP GET request on the current page URL with the `ask` query parameter:

```
GET https://book.bsdcn.org/hanbook/di-26-zhang-freebsd-geng-xin-yu-sheng-ji/26.8.-duo-tai-ji-qi-de-zhui-zong.md?ask=<question>
```

The question should be specific, self-contained, and written in natural language.
The response will contain a direct answer to the question and relevant excerpts and sources from the documentation.

Use this mechanism when the answer is not explicitly present in the current page, you need clarification or additional context, or you want to retrieve related documentation sections.
