# 29.3.终端

终端提供了一种便捷且低成本的方式，用于在不直接接触计算机控制台或不在连接的网络上的情况下访问 FreeBSD 系统。本节介绍如何在 FreeBSD 中使用终端。

最初的 UNIX® 系统没有控制台。用户通过连接到计算机串行端口的终端登录并运行程序。

在几乎所有 UNIX® 类操作系统中，包括 FreeBSD，现在仍然可以通过串行端口建立登录会话。通过使用连接到未使用串行端口的终端，用户可以登录并运行任何通常在控制台或 `xterm` 窗口中运行的文本程序。

许多终端可以连接到 FreeBSD 系统。可以将一台旧的备用计算机用作终端，将其连接到运行 FreeBSD 的更强大计算机。这可以将原本单用户的计算机转变为一个强大的多用户系统。

FreeBSD 支持三种类型的终端：

**终端**提供了一种便捷且低成本的方式，用于在不直接接触计算机控制台或不在连接的网络上的情况下访问 FreeBSD 系统。本节介绍如何在 FreeBSD 中使用终端。

最初的 UNIX® 系统没有控制台。用户通过连接到计算机串行端口的终端登录并运行程序。

在几乎所有 UNIX® 类操作系统中，包括 FreeBSD，现在仍然可以通过串行端口建立登录会话。通过使用连接到未使用串行端口的终端，用户可以登录并运行任何通常在控制台或 `xterm` 窗口中运行的文本程序。

许多终端可以连接到 FreeBSD 系统。可以将一台旧的备用计算机用作终端，将其连接到运行 FreeBSD 的更强大计算机。这可以将原本单用户的计算机转变为一个强大的多用户系统。

FreeBSD 支持三种类型的终端：

**哑终端**

哑终端是通过串行线路连接到计算机的专用硬件。它们被称为“哑”，因为它们只有足够的计算能力来显示、发送和接收文本。无法在这些设备上运行程序。哑终端应连接到运行所需程序的计算机。

有成百上千种由许多制造商生产的哑终端，几乎任何类型的哑终端都能与 FreeBSD 配合使用。一些高端终端甚至可以显示图形，但只有某些软件包能够利用这些高级功能。

哑终端在不需要访问图形应用程序的工作环境中非常流行。

**计算机充当终端**\
由于哑终端仅具有足够的能力来显示、发送和接收文本，任何备用计算机都可以充当哑终端。所需的只是正确的电缆和一些 *终端仿真* 软件来运行在计算机上。

这种配置可能很有用。例如，如果一个用户正在忙于在 FreeBSD 系统的控制台上工作，另一个用户可以同时从连接到 FreeBSD 系统的性能较低的个人计算机上进行文本-only 工作。

在 FreeBSD 的基本系统中，至少有两个实用程序可以通过串行连接进行工作：[cu(1)](https://man.freebsd.org/cgi/man.cgi?query=cu\&sektion=1\&format=html) 和 [tip(1)](https://man.freebsd.org/cgi/man.cgi?query=tip\&sektion=1\&format=html)。

例如，要从运行 FreeBSD 的客户端系统连接到另一个系统的串行连接：

```sh
# cu -l /dev/cuauN
```

端口从零开始编号。这意味着 **COM1** 是 **/dev/cuau0**。

可以通过 Ports 获取额外的程序，例如 [comms/minicom](https://cgit.freebsd.org/ports/tree/comms/minicom/)。

**X 终端**\
X 终端是最复杂的终端类型。它们通常通过像以太网这样的网络连接，而不是通过串行端口。它们不仅仅局限于文本应用程序，还可以显示任何 Xorg 应用程序。

本章不包括 X 终端的设置、配置或使用。

## 29.3.1. 终端配置

本节描述了如何配置 FreeBSD 系统，以在串行终端上启用登录会话。它假定系统已识别连接终端的串行端口，并且终端已用正确的电缆连接。

在 FreeBSD 中，`init` 读取 **/etc/ttys** 文件，并在可用终端上启动 `getty` 进程。`getty` 进程负责读取登录名并启动 `login` 程序。FreeBSD 系统上允许登录的端口在 **/etc/ttys** 文件中列出。例如，第一个虚拟控制台 **ttyv0** 在此文件中有一个条目，允许在控制台上进行登录。该文件还包含其他虚拟控制台、串行端口和伪终端的条目。对于硬接线终端，串行端口的 **/dev** 条目列出时不带 `/dev` 部分。例如，**/dev/ttyv0** 被列为 `ttyv0`。

默认的 **/etc/ttys** 配置支持前四个串行端口 **ttyu0** 到 **ttyu3**：

```sh
ttyu0   "/usr/libexec/getty std.115200"   dialup  off secure
ttyu1   "/usr/libexec/getty std.115200"   dialup  off secure
ttyu2   "/usr/libexec/getty std.115200"   dialup  off secure
ttyu3   "/usr/libexec/getty std.115200"   dialup  off secure
```

当将终端连接到这些端口之一时，需要修改默认条目，设置所需的速率和终端类型，将设备设置为 `on`，并根据需要更改端口的 `secure` 设置。如果终端连接到其他端口，则需要为该端口添加一个条目。

[配置终端条目](https://docs.freebsd.org/en/books/handbook/serialcomms/#ex-etc-ttys) 配置了 **/etc/ttys** 中的两个终端。第一个条目配置了连接到 **COM2** 的 Wyse-50 终端。第二个条目配置了一台运行 Procomm 终端软件的旧计算机，该计算机模拟 VT-100 终端，并连接到多端口串行卡上的第六个串行端口。

**示例 1. 配置终端条目**

```sh
ttyu1  "/usr/libexec/getty std.38400"  wy50   on insecure
ttyu5   "/usr/libexec/getty std.19200"  vt100  on insecure
```

第一个字段指定串行终端的设备名称。

第二个字段告诉 `getty` 初始化并打开线路，设置线路速度，提示输入用户名，然后执行 `login` 程序。可选的 *getty 类型* 配置终端线路的特性，如波特率和奇偶校验。可用的 getty 类型列在 **/etc/gettytab** 中。在几乎所有情况下，开始于 `std` 的 getty 类型都能用于硬接线终端，因为这些条目忽略了奇偶校验。对于从 110 到 115200 的每个波特率，都有一个 `std` 条目。有关更多信息，请参考 [gettytab(5)](https://man.freebsd.org/cgi/man.cgi?query=gettytab\&sektion=5\&format=html)。在设置 getty 类型时，请确保与终端使用的通信设置匹配。例如，Wyse-50 使用无奇偶校验，并以 38400 bps 连接。该计算机使用无奇偶校验，并以 19200 bps 连接。

第三个字段是终端的类型。对于拨号端口，通常使用 `unknown` 或 `dialup`，因为用户可能使用任何类型的终端或软件进行拨号。由于硬接线终端的终端类型不会改变，因此可以指定 **/etc/termcap** 中的实际终端类型。对于本示例，Wyse-50 使用实际的终端类型，而运行 Procomm 的计算机则设置为模拟 VT-100 终端。

第四个字段指定是否启用端口。要启用该端口上的登录，必须将此字段设置为 `on`。

最后一个字段用于指定端口是否安全。将端口标记为 `secure` 意味着它足够信任，可以允许从该端口登录 `root` 用户。非安全端口不允许 `root` 登录。在非安全端口上，用户必须从非特权账户登录，然后使用 `su` 或类似机制获得超级用户权限，如 [“超级用户账户”](https://docs.freebsd.org/en/books/handbook/basics/#users-superuser) 中所述。出于安全考虑，建议将此设置更改为 `insecure`。

在对 **/etc/ttys** 进行任何更改后，发送 SIGHUP（挂起）信号到 `init` 进程，以强制其重新读取配置文件：

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

由于 `init` 是系统上运行的第一个进程，它的进程 ID 始终为 `1`。

如果一切设置正确，所有电缆连接到位，终端已通电，则每个终端上应该都有一个 `getty` 进程在运行，并且每个终端上应该出现登录提示。

## 29.3.2. 排除连接故障

即使是最细致的配置，也可能在设置终端时出现问题。以下是一些常见症状以及一些建议的解决方法。

如果没有显示登录提示，请确保终端已插入并通电。如果是个人计算机充当终端，请确保它在正确的串行端口上运行终端仿真软件。

确保电缆已牢固连接到终端和 FreeBSD 计算机。确保使用的是正确类型的电缆。

确保终端和 FreeBSD 在波特率和奇偶校验设置上达成一致。对于视频显示终端，确保对比度和亮度控制已调高。如果是打印终端，请确保纸张和墨水充足。

使用 `ps` 确保 `getty` 进程正在运行并为终端提供服务。例如，以下列表显示 `getty` 正在第二个串行端口 **ttyu1** 上运行，并使用 **/etc/gettytab** 中的 `std.38400` 条目：

```sh
# ps -axww|grep ttyu
22189  d1  Is+    0:00.03 /usr/libexec/getty std.38400 ttyu1
```

如果没有运行 `getty` 进程，请确保在 **/etc/ttys** 中启用了该端口。修改 **/etc/ttys** 后，记得运行 `kill -HUP 1`。

如果 `getty` 进程正在运行，但终端仍未显示登录提示，或者显示了提示但不接受键入输入，终端或电缆可能不支持硬件握手。尝试将 **/etc/ttys** 中的条目从 `std.38400` 更改为 `3wire.38400`，然后在修改 **/etc/ttys** 后运行 `kill -HUP 1`。`3wire` 条目类似于 `std`，但忽略硬件握手。在使用 `3wire` 时，可能还需要降低波特率或启用软件流控制，以防止缓冲区溢出。

如果出现乱码而不是登录提示，请确保终端和 FreeBSD 在波特率和奇偶校验设置上达成一致。检查 `getty` 进程，确保使用了正确的 *getty* 类型。如果不是，请编辑 **/etc/ttys** 并运行 `kill -HUP 1`。

如果字符出现重复，且输入时密码会显示，请将终端或终端仿真软件从“半双工”或“本地回显”模式切换到“全双工”模式。
