> 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-30-zhang-chuan-xing-tong-xin/30.4.-bo-ru-fu-wu.md).

# 30.4.拨入服务

配置 FreeBSD 系统以支持拨入服务与配置终端设备类似，不同之处在于使用调制解调器代替终端设备。FreeBSD 支持外部和内部调制解调器。

外部调制解调器更加方便，因为它们通常可以通过存储在非易失性 RAM 中的参数配置，并且通常提供显示重要 RS-232 信号状态的指示灯，表明调制解调器是否正常工作。

内部调制解调器通常缺少非易失性 RAM，因此其配置可能仅限于设置 DIP 开关。如果内部调制解调器有信号指示灯，它们通常在机箱盖关闭时很难查看。

使用外部调制解调器时，需要使用合适的电缆。标准的 RS-232C 串行电缆应足够使用。

FreeBSD 需要 RTS 和 CTS 信号用于速率高于 2400 bps 时的流控制，CD 信号用于检测电话是否接通或线路是否已挂断，DTR 信号用于在会话结束后重置调制解调器。有些电缆的接线没有所有需要的信号，因此如果在电话挂断时登录会话未结束，可能是电缆有问题。有关这些信号的更多信息，请参阅 [串行电缆和端口](/di-30-zhang-chuan-xing-tong-xin/30.2.-chuan-hang-shu-yu-he-ying-jian.md)。

与其他类 UNIX® 操作系统一样，FreeBSD 使用硬件信号来了解电话是否接通或线路是否挂断，并在通话结束后挂断并重置调制解调器。FreeBSD 避免向调制解调器发送命令或监控调制解调器的状态报告。

FreeBSD 支持基于 NS8250、NS16450、NS16550 和 NS16550A 的 RS-232C（CCITT V.24）通信接口。8250 和 16450 设备具有单字符缓冲区，而 16550 设备提供 16 字符缓冲区，这可以提高系统性能。普通的 16550 设备存在缺陷，无法使用 16 字符缓冲区，因此如果可能，建议使用 16550A 设备。由于单字符缓冲区设备需要操作系统做更多的工作，所以基于 16550A 的串行接口卡更受欢迎。如果系统有多个活动串行端口或负载较重，基于 16550A 的卡更适合低错误率通信。

本节其余部分演示如何配置调制解调器以接收传入连接，如何与调制解调器通信，并提供一些故障排除的提示。

## 30.4.1. 调制解调器配置

与终端设备一样，`init` 为每个配置的串行端口生成一个 `getty` 进程，用于拨入连接。当用户拨打调制解调器的线路并且调制解调器连接成功时，调制解调器会报告“Carrier Detect”信号。内核检测到载波信号后，会指示 `getty` 打开端口，并以指定的初始行速显示 `login:` 提示符。在典型的配置中，如果接收到垃圾字符，通常是由于调制解调器的连接速度与配置速度不匹配，`getty` 会尝试调整行速，直到接收到合理的字符。在用户输入登录名后，`getty` 会执行 `login`，通过要求用户输入密码并启动用户的 shell 完成登录过程。

关于拨号调制解调器有两种不同的配置思想。第一种配置方法是将调制解调器和系统设置为无论远程用户以何种速度拨号，拨入 RS-232 接口始终保持在固定速度。此配置的优点是远程用户总是立即看到系统登录提示符。缺点是系统不知道用户的真实数据速率，因此像 Emacs 这样的全屏程序将不会根据慢速连接调整其屏幕绘制方式，以提供更好的响应。

第二种方法是根据远程用户的连接速度配置 RS-232 接口的速度变化。由于 `getty` 无法理解任何特定调制解调器的连接速度报告，它会以初始速度给出 `login:` 消息，并观察返回的字符。如果用户看到乱码，可以按 Enter 直到看到可识别的提示符。如果数据速率不匹配，`getty` 会将用户输入的内容视为乱码，尝试下一个速度，并再次显示 `login:` 提示符。此过程通常只需一两次按键，用户就能看到正确的提示符。虽然这种登录过程看起来不如固定速度方法那样简洁，但低速连接上的用户将获得更好的交互响应，特别是在使用全屏程序时。

当将调制解调器的数据通信速率锁定为特定速度时，无需更改 **/etc/gettytab**。然而，对于匹配速度的配置，可能需要添加额外的条目来定义调制解调器使用的速度。以下示例配置了 14.4 Kbps 调制解调器，其接口的最高速度为 19.2 Kbps，使用 8 位、无奇偶校验的连接。它将 `getty` 配置为以 19.2 Kbps 启动 V.32bis 连接的通信速率，然后依次尝试 9600 bps、2400 bps、1200 bps、300 bps，再返回到 19.2 Kbps。通信速率的切换通过 `nx=`（下一个表）能力实现。每一行都使用 `tc=`（表格续接）条目来获取特定数据速率的其余设置。

```sh
#
# 为 V.32bis 调制解调器添加的条目
#
um|V300|300 8-bit 高速调制解调器:\
        :nx=V19200:tc=std.300:
un|V1200|1200 8-bit 高速调制解调器:\
        :nx=V300:tc=std.1200:
uo|V2400|2400 8-bit 高速调制解调器:\
        :nx=V1200:tc=std.2400:
up|V9600|9600 8-bit 高速调制解调器:\
        :nx=V2400:tc=std.9600:
uq|V19200|19200 8-bit 高速调制解调器:\
        :nx=V9600:tc=std.19200:
```

对于 28.8 Kbps 调制解调器，或者要利用 14.4 Kbps 调制解调器上的压缩功能，可以使用更高的通信速率，如下所示：

```sh
#
# 为 V.32bis 或 V.34 调制解调器添加的条目
# 从 57.6 Kbps 开始
#
vm|VH300|300 8-bit 非常高速调制解调器:\
        :nx=VH57600:tc=std.300:
vn|VH1200|1200 8-bit 非常高速调制解调器:\
        :nx=VH300:tc=std.1200:
vo|VH2400|2400 8-bit 非常高速调制解调器:\
        :nx=VH1200:tc=std.2400:
vp|VH9600|9600 8-bit 非常高速调制解调器:\
        :nx=VH2400:tc=std.9600:
vq|VH57600|57600 8-bit 非常高速调制解调器:\
        :nx=VH9600:tc=std.57600:
```

对于较慢的 CPU 或负载较重的系统，且没有基于 16550A 的串行端口，这种配置可能会在 57.6 Kbps 时产生 `uart`“silo”错误。

**/etc/ttys** 的配置与 [配置终端条目](/di-30-zhang-chuan-xing-tong-xin/30.3.-zhong-duan.md) 类似，但会传递不同的参数给 `getty`，并且使用 `dialup` 作为终端类型。用进程 `init` 在设备上运行的程序替换 *xxx*：

```sh
ttyu0   "/usr/libexec/getty xxx"   dialup on
```

`dialup` 终端类型可以更改。例如，将 `vt102` 设置为默认终端类型，让用户能在远程系统上使用 VT102 模拟。

对于固定速度配置，使用 **/etc/gettytab** 中列出的有效类型来指定速度。以下示例用于端口速度锁定为 19.2 Kbps 的调制解调器：

```sh
ttyu0   "/usr/libexec/getty std.19200"   dialup on
```

对于匹配速度配置，该条目需要引用 **/etc/gettytab** 中适当的初始“auto-baud”条目。继续为从 19.2 Kbps 开始的匹配速度调制解调器，使用以下条目：

```sh
ttyu0   "/usr/libexec/getty V19200"   dialup on
```

编辑 **/etc/ttys** 后，等待调制解调器正确配置并连接，再向 `init` 发送信号：

```sh
# kill -HUP 1
```

高速调制解调器（如 V.32、V.32bis 和 V.34 调制解调器）使用硬件（`RTS/CTS`）流控制。使用 `stty` 设置调制解调器端口的硬件流控制标志。以下示例在 **COM2** 的拨入和拨出初始化设备上设置 `crtscts` 标志：

```sh
# stty -f /dev/ttyu1.init crtscts
# stty -f /dev/cuau1.init crtscts
```

## 30.4.2. 故障排除

本节提供了一些故障排除建议，用于解决无法连接到 FreeBSD 系统的拨号调制解调器问题。

将调制解调器连接到 FreeBSD 系统并引导系统。如果调制解调器有状态指示灯，观察 `login:` 提示符出现在系统控制台时，调制解调器的 DTR 指示灯是否亮起。如果亮起，这意味着 FreeBSD 已经在相应的通信端口上启动了 `getty` 进程，并且正在等待调制解调器接受来电。

如果 DTR 指示灯没有亮起，通过控制台登录到 FreeBSD 系统并输入 `ps ax` 查看 FreeBSD 是否正在正确端口上运行 `getty` 进程：

```sh
114 ??  I      0:00.10 /usr/libexec/getty V19200 ttyu0
```

如果第二列包含 `d0` 而不是 `??`，并且调制解调器尚未接受来电，这意味着 `getty` 已经完成了通信端口的打开。这可能表明电缆连接或调制解调器配置有问题，因为 `getty` 在接收到调制解调器的载波检测信号之前不应能打开通信端口。

如果没有 `getty` 进程在等待打开端口，请再次检查 **/etc/ttys** 中的端口配置是否正确。还可以检查 **/var/log/messages** 文件，查看是否有来自 `init` 或 `getty` 的日志消息。

接下来，尝试拨号连接到系统。确保在远程系统上使用 8 位、无奇偶校验和 1 位停止位。如果提示符没有立即显示，或者提示符显示乱码，可以每秒按一次 Enter 键。如果仍然没有 `login:` 提示符，尝试发送 `BREAK`。在使用高速调制解调器时，可以在锁定拨号调制解调器接口速度后重新尝试拨号。

如果仍然没有 `login:` 提示符，再次检查 **/etc/gettytab** 并确认：

* **/etc/ttys** 中的条目指定的初始能力名称与 **/etc/gettytab** 中的能力名称匹配。
* 每个 `nx=` 条目都与另一个 **gettytab** 能力名称匹配。
* 每个 `tc=` 条目都与另一个 **gettytab** 能力名称匹配。

如果 FreeBSD 系统上的调制解调器没有响应，请确保调制解调器在 DTR 线激活时配置为接听电话。如果调制解调器似乎配置正确，检查调制解调器的指示灯，确认 DTR 线已经激活。

如果仍然无法解决问题，请尝试向 [FreeBSD 通用问题邮件列表](https://lists.freebsd.org/subscription/freebsd-questions) 发送电子邮件，说明调制解调器和问题。
