# 29.6.设置串行控制台

## 29.6.1. 快速串行控制台配置

本节提供了配置串行控制台的快速概述。此过程适用于将哑终端连接到 **COM1** 的情况。

**配置 COM1 上的串行控制台的过程：**

1. 将串行电缆连接到 **COM1** 和控制终端。
2. 以超级用户身份发出以下命令，以将启动信息显示到串行控制台：

   ```sh
   # echo 'console="comconsole"' >> /boot/loader.conf
   ```
3. 编辑 **/etc/ttys** 文件，将 **ttyu0** 项中的 `off` 改为 `on`，将 `dialup` 改为 `vt100`。否则，通过串行控制台连接时将不需要密码，这会导致潜在的安全隐患。
4. 重启系统，检查更改是否生效。

如果需要不同的配置，请参阅下一节获取更详细的配置说明。

## 29.6.2. 串行控制台的详细配置

本节提供了设置 FreeBSD 串行控制台的更详细说明。

**配置串行控制台的步骤：**

1. 准备串行电缆。\
   使用 null-modem 电缆或标准串行电缆和 null-modem 适配器。有关串行电缆的讨论，请参见 [Serial Cables and Ports](https://docs.freebsd.org/en/books/handbook/serialcomms/#term-cables-null)。
2. 拔掉键盘。\
   许多系统在开机自检（POST）时会探测键盘，如果未检测到键盘，会产生错误。某些机器在没有插入键盘时会拒绝启动。

   如果计算机报告错误，但仍然启动，则无需进一步配置。

   如果计算机拒绝启动且没有键盘连接，请在 BIOS 中配置以忽略此错误。请参考主板手册以了解如何执行此操作。

> **技巧**
>
> 尝试在 BIOS 中将键盘设置为 "Not installed"。此设置会告诉 BIOS 在开机时不探测键盘，因此如果没有键盘连接，它不会报告错误。如果在 BIOS 中没有这个选项，请查找 "Halt on Error" 选项。将其设置为 "All but Keyboard" 或 "No Errors" 将具有相同的效果。

如果系统有 PS/2® 鼠标，也应拔掉它。PS/2® 鼠标与键盘共享部分硬件，保持鼠标插入可能会使键盘探测误认为键盘仍然连接。

> **注意**
>
> 尽管大多数系统在没有键盘的情况下会启动，但仍有一些系统在没有图形适配器的情况下无法启动。某些系统可以通过在 BIOS 配置中将 "graphics adapter" 设置为 "Not installed" 来配置无图形适配器启动。其他系统不支持此选项，若系统中没有显示硬件，则会拒绝启动。在这种情况下，即使只是插入一个废弃的单色显卡，也应留下一种图形卡。无需连接显示器。

3. 将哑终端、带调制解调器程序的旧计算机或另一个 UNIX® 系统的串行端口连接到串行端口。
4. 将适当的 `hint.uart.*` 条目添加到 **/boot/device.hints** 文件中。某些多端口卡还需要内核配置选项。请参考 [uart(4)](https://man.freebsd.org/cgi/man.cgi?query=uart\&sektion=4\&format=html) 以获取每个支持的串行端口所需的选项和设备提示。
5. 在启动驱动器的 `a` 分区的根目录中创建 **boot.config** 文件。\
   该文件指示引导块代码如何启动系统。为了激活串行控制台，需要以下一个或多个选项。在使用多个选项时，将它们都写在同一行：

   `-h` 切换内部和串行控制台。用此选项可以切换控制台设备。例如，要从内部（视频）控制台启动，请使用 `-h` 将引导加载程序和内核的控制台设置为串行端口。或者，要从串行端口启动，请使用 `-h` 告诉引导加载程序和内核使用视频显示器作为控制台。

   `-D` 切换单控制台和双控制台配置。在单控制台配置中，控制台将是内部控制台（视频显示）或串行端口，具体取决于 `-h` 的状态。在双控制台配置中，无论 `-h` 的状态如何，视频显示器和串行端口都会同时作为控制台。然而，双控制台配置仅在引导块运行时生效。待引导加载程序获得控制权，`-h` 指定的控制台将成为唯一的控制台。

   `-P` 使引导块探测键盘。如果未找到键盘，则会自动设置 `-D` 和 `-h` 选项。

> **注意**
>
> 由于当前版本的引导块空间限制，`-P` 只能检测扩展键盘。没有 F11 和 F12 键的键盘可能无法被检测到。某些笔记本电脑上的键盘也可能无法正确检测到。如果是这种情况，请不要使用 `-P`。

使用 `-P` 自动选择控制台，或者使用 `-h` 激活串行控制台。有关更多详细信息，请参考 [boot(8)](https://man.freebsd.org/cgi/man.cgi?query=boot\&sektion=8\&format=html) 和 [boot.config(5)](https://man.freebsd.org/cgi/man.cgi?query=boot.config\&sektion=5\&format=html)。

除了 `-P`，其他选项将传递给引导加载程序。引导加载程序将通过检查 `-h` 的状态来确定是使用内部视频还是串行端口作为控制台。这意味着，如果在 **/boot.config** 中指定了 `-D` 但没有指定 `-h`，则串行端口只会在引导块期间作为控制台使用，因为引导加载程序会使用内部视频显示器作为控制台。

6. 启动计算机。\
   当 FreeBSD 启动时，引导块会将 **/boot.config** 的内容回显到控制台。例如：

   ```sh
   /boot.config: -P
   Keyboard: no
   ```

   第二行仅在 **/boot.config** 中有 `-P` 时显示，表示是否检测到键盘。这些消息将显示到串行或内部控制台，或同时显示到两者，具体取决于 **/boot.config** 中的选项：

   | 选项         | 消息显示到    |
   | ---------- | -------- |
   | 无          | 内部控制台    |
   | `-h`       | 串行控制台    |
   | `-D`       | 串行和内部控制台 |
   | `-Dh`      | 串行和内部控制台 |
   | `-P`，键盘存在  | 内部控制台    |
   | `-P`，键盘不存在 | 串行控制台    |

   消息显示后，引导块会稍作暂停，然后继续加载引导加载程序，并在控制台打印任何进一步的消息。正常情况下，无需中断引导块，但可以这样做以确保设置正确。

   按下除 Enter 以外的任意键，在控制台中中断引导过程。引导块将提示进一步操作：

   ```sh
   >> FreeBSD/i386 BOOT
   Default: 0:ad(0,a)/boot/loader
   boot:
   ```

   验证上述消息是否显示在串行或内部控制台中，或者根据 **/boot.config** 中的选项显示在两者上。如果消息出现在正确的控制台上，按 Enter 继续引导过程。

   如果串行终端上没有提示消息，则说明设置存在问题。输入 `-h` 然后按 Enter 或 Return，告知引导块（然后是引导加载程序和内核）选择串行端口作为控制台。待系统启动，返回并检查哪里出了问题。

在引导过程的第三阶段，仍然可以通过设置引导加载程序中的适当环境变量在内部控制台和串行控制台之间切换。有关更多信息，请参见 [loader(8)](https://man.freebsd.org/cgi/man.cgi?query=loader\&sektion=8\&format=html)。

> **注意**
>
> 该行可以在 **/boot/loader.conf** 或 **/boot/loader.conf.local** 中配置，引导加载程序和内核将其启动消息发送到串行控制台，而不管 **/boot.config** 中的选项如何：
>
> ```ini
> console="comconsole"
> ```
>
> 该行应该是 **/boot/loader.conf** 的第一行，以便尽早将启动信息显示到串行控制台。
>
> 如果该行不存在，或者设置为 `console="vidconsole"`，则引导加载程序和内核将使用引导块中 `-h` 指定的控制台。更多信息请参考 [loader.conf(5)](https://man.freebsd.org/cgi/man.cgi?query=loader.conf\&sektion=5\&format=html)。
>
> 目前，引导加载器没有与启动块中的 `-P` 等效的选项，也没有机制可以根据是否存在键盘自动选择使用内部控制台还是串口控制台。

> **技巧**
>
> 虽然不是必须的，但可以通过串行线路提供 `login` 提示。要配置此功能，请使用 [Terminal Configuration](https://docs.freebsd.org/en/books/handbook/serialcomms/#term-config) 中的说明编辑 **/etc/ttys** 中的串行端口条目。如果串行端口的速度已更改，请将 `std.115200` 改为新的设置。

## 29.6.3. 设置更快的串口速度

默认情况下，串口设置为 115200 波特率、8 位、无奇偶校验和 1 个停止位。要更改默认的控制台速度，可以使用以下选项：

* 编辑 **/etc/make.conf**，将 `BOOT_COMCONSOLE_SPEED` 设置为新的控制台速度。然后重新编译并安装启动块和引导加载器：

  ```sh
  # cd /sys/boot
  # make clean
  # make
  # make install
  ```

  如果串口控制台的配置方式与通过 `-h` 启动不同，或者内核使用的串口与启动块使用的串口不同，可以在自定义内核配置文件中添加以下选项，并编译新内核：

  ```sh
  options CONSPEED=19200
  ```
* 向 **/boot.config** 中添加 `-S19200` 引导选项，将 `19200` 替换为要使用的速度。
* 向 **/boot/loader.conf** 添加以下选项，将 `115200` 替换为要使用的速度。

  ```sh
  boot_multicons="YES"
  boot_serial="YES"
  comconsole_speed="115200"
  console="comconsole,vidconsole"
  ```

## 29.6.4. 从串口进入 DDB 调试器

要配置从串口进入内核调试器的功能，请将以下选项添加到自定义内核配置文件，并使用 [Configuring the FreeBSD Kernel](https://docs.freebsd.org/en/books/handbook/kernelconfig/#kernelconfig) 中的说明编译内核。请注意，尽管这对于远程诊断非常有用，但如果串口上生成了一个错误的 BREAK 信号，这也可能是危险的。有关内核调试器的更多信息，请参见 [ddb(4)](https://man.freebsd.org/cgi/man.cgi?query=ddb\&sektion=4\&format=html) 和 [ddb(8)](https://man.freebsd.org/cgi/man.cgi?query=ddb\&sektion=8\&format=html)。

```ini
options BREAK_TO_DEBUGGER
options DDB
```
