# 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`。

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


---

# 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-29-zhang-chuan-xing-tong-xin/29.3.-zhong-duan.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.
