# 10.4.配置文件

为了创建一个自定义内核配置文件并构建自定义内核，必须首先安装完整的 FreeBSD 源代码树。

如果 `/usr/src/` 目录不存在或为空，则说明源代码未安装。可以按照 [“使用 Git”](https://docs.freebsd.org/en/books/handbook/mirrors/#git) 中的说明通过 Git 安装源代码。

安装完源代码后，请查看 `/usr/src/sys` 目录的内容。该目录包含多个子目录，其中包括表示以下受支持架构的目录：amd64、i386、powerpc 和 sparc64。每个特定架构的目录只处理该架构的相关内容，其他代码则是所有平台通用的机器无关代码。每个受支持架构都有一个 conf 子目录，其中包含该架构的 GENERIC 内核配置文件。

不要直接编辑 GENERIC 文件。相反，应将文件复制并编辑复制的文件。命名约定是使用全大写字母的名称。在管理多台具有不同硬件的 FreeBSD 机器时，建议将其命名为机器的主机名。以下示例为 `amd64` 架构的 GENERIC 配置文件创建名为 MYKERNEL 的副本：

```sh
# cd /usr/src/sys/amd64/conf
# cp GENERIC MYKERNEL
```

现在可以使用任何 `ASCII` 文本编辑器自定义 MYKERNEL。默认编辑器是 vi，但 FreeBSD 还安装了一个更适合初学者的编辑器，名为 ee。

内核配置文件的格式很简单。每行包含一个代表设备或子系统的关键字、一个参数和一个简短的描述。任何在 `#` 后面的文本都被视为注释并被忽略。要从内核配置中删除对某个设备或子系统的支持，请在表示该设备或子系统的行的开头加上 `#`。对于你不理解的行，请不要添加或删除 `#`。

> **警告**
>
> 删除设备或选项的支持很容易导致内核损坏。例如，如果从内核配置文件中删除 [ata(4)](https://man.freebsd.org/cgi/man.cgi?query=ata\&sektion=4\&format=html) 驱动程序，使用 `ATA` 磁盘驱动程序的系统可能无法启动。如有疑问，最好将支持保留在内核中。

除了文件中提供的简短描述外，附加描述还包含在 NOTES 文件中，可以在该架构的 GENERIC 文件所在目录中找到。对于架构无关的选项，请参考 `/usr/src/sys/conf/NOTES`。

> **技巧**
>
> 完成自定义内核配置文件后，将备份副本保存到 `/usr/src` 之外的位置。
>
> 还可以将内核配置文件保存在其他地方，并创建指向该文件的符号链接：
>
> ```sh
> # cd /usr/src/sys/amd64/conf
> # mkdir /root/kernels
> # cp GENERIC /root/kernels/MYKERNEL
> # ln -s /root/kernels/MYKERNEL
> ```

配置文件中可以使用 `include` 指令。这允许将另一个配置文件包含到当前配置文件中，使得相对于现有文件维护小的变化变得容易。如果只需要少量的额外选项或驱动程序，可以通过这种方法维护与 GENERIC 的差异，如下所示：

```ini
include GENERIC
ident MYKERNEL

options         IPFIREWALL
options         DUMMYNET
options         IPFIREWALL_DEFAULT_TO_ACCEPT
options         IPDIVERT
```

使用这种方法，本地配置文件表示与 GENERIC 内核的本地差异。在执行升级时，除非使用 `nooptions` 或 `nodevice` 明确防止，否则 GENERIC 中新增的特性也会添加到本地内核中。有关配置指令及其描述的完整列表，请参阅 [config(5)](https://man.freebsd.org/cgi/man.cgi?query=config\&sektion=5\&format=html)。

> **注意**
>
> 要构建一个包含所有可用选项的文件，请以 `root` 用户身份运行以下命令：
>
> ```sh
> # cd /usr/src/sys/arch/conf && make LINT
> ```


---

# 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://handbook.bsdcn.org/di-10-zhang-pei-zhi-freebsd-nei-he/10.4.-pei-zhi-wen-jian.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.
