第 29 章 串行通信

如果发现翻译错误,请直接 发起PR修改

29.1. 简介

UNIX® 一直以来都支持串行通信,因为最早的 UNIX® 机器依赖串行线路进行用户输入和输出。从平均终端只包含一个每秒 10 个字符的串行打印机和一个键盘的时代以来,情况发生了很大变化。本章介绍了在 FreeBSD 上使用串行通信的一些方法。

阅读完本章后,您将了解:

  • 如何将终端连接到 FreeBSD 系统。

  • 如何使用调制解调器拨打远程主机。

  • 如何允许远程用户通过调制解调器登录到 FreeBSD 系统。

  • 如何从串行控制台启动 FreeBSD 系统。

在阅读本章之前,你应该:

29.2. 串行术语和硬件

以下术语常用于串行通信:

bps

每秒比特数(bps)是数据传输的速率。

DTE

数据终端设备(DTE)是串行通信中的两个端点之一。一个例子就是计算机。

DCE

数据通信设备(DCE)是串行通信中的另一端点。通常情况下,它是一个调制解调器或串行终端。

RS-232

最初定义硬件串行通信的标准。后来更名为 TIA-232。

在涉及通信数据速率时,本节不使用术语“波特(baud)”。波特是指在一段时间内进行的电气状态转换的数量,而 bps 是正确的术语。

要将串行终端连接到 FreeBSD 系统,需要计算机上的串行端口和连接到串行设备的适当电缆。已经熟悉串行硬件和电缆的用户可以安全地跳过本节。

29.2.1. 串行电缆和端口

有几种不同类型的串行电缆。其中最常见的两种类型是空模拟电缆和标准 RS-232 电缆。硬件的文档应该描述所需的电缆类型。

这两种类型的电缆在连接线缆到连接器的方式上有所不同。每根线代表一个信号,定义的信号总结在 RS-232C 信号名称 中。标准的串行电缆直接传递所有的 RS-232C 信号。例如,电缆一端的“传输数据”引脚连接到另一端的“传输数据”引脚。这种类型的电缆用于将调制解调器连接到 FreeBSD 系统,并且也适用于某些终端。

空模拟电缆将一个端口上的“传输数据”引脚与另一个端口上的“接收数据”引脚进行切换。连接器可以是 DB-25 或 DB-9。

可以使用在 DB-25 到 DB-25 空调制模电缆DB-9 到 DB-9 的空模线缆DB-9 到 DB-25 空模拟电缆 中总结的引脚连接来构建一个空调制电缆。虽然标准要求使用直通的引脚 1 到引脚 1 的“保护地”线,但通常会省略。一些终端只使用引脚 2 、 3 和 7 ,而其他终端则需要不同的配置。如果有疑问,请参考硬件的文档。

表 1. RS-232C 信号名称
首字母缩略词 名称

RD

接收到的数据

TD

传输的数据

DTR

数据终端就绪

DSR

数据集准备完毕

DCD

数据载波检测

SG

Signal Ground

RTS

请求发送

CTS

发送准备

表 2. DB-25 到 DB-25 空调制模电缆
信号 引脚号码 引脚号码 信号

SG

7

连接到

7

SG

TD

2

连接到

3

RD

RD

3

连接到

2

TD

RTS

4

连接到

5

CTS

CTS

5

连接到

4

RTS

DTR

20

连接到

6

DSR

DTR

20

连接到

8

DCD

DSR

6

连接到

20

DTR

DCD

8

连接到

20

DTR

表 3. DB-9 到 DB-9 的空模线缆
信号 引脚号码 引脚号码 信号

RD

2

连接到

3

TD

TD

3

连接到

2

RD

DTR

4

连接到

6

DSR

DTR

4

连接到

1

DCD

SG

5

连接到

5

SG

DSR

6

连接到

4

DTR

DCD

1

连接到

4

DTR

RTS

7

连接到

8

CTS

CTS

8

连接到

7

RTS

表 4. DB-9 到 DB-25 空模拟电缆
信号 引脚号码 引脚号码 信号

RD

2

连接到

2

TD

TD

3

连接到

3

RD

DTR

4

连接到

6

DSR

DTR

4

连接到

8

DCD

SG

5

连接到

7

SG

DSR

6

连接到

20

DTR

DCD

1

连接到

20

DTR

RTS

7

连接到

5

CTS

CTS

8

连接到

4

RTS

当一个端口的一根引脚连接到另一个端口的一对引脚时,通常会使用一根短线连接这对引脚的连接器,以及一根长线连接到另一个单独的引脚。

串口是在 FreeBSD 主机和终端之间传输数据的设备。存在几种类型的串口。在购买或制作电缆之前,请确保它适配终端和 FreeBSD 系统上的串口。

大多数终端设备都有 DB-25 端口。个人电脑可能有 DB-25 或 DB-9 端口。多端口串行卡可能有 RJ-12 或 RJ-45 端口。请查看随附硬件的文档,以了解端口类型的规格,或者通过目视确认端口类型。

在 FreeBSD 中,每个串口通过 /dev 中的一个条目进行访问。有两种不同类型的条目:

  • 呼叫端口的命名方式为 /dev/ttyuN ,其中 N 为端口号,从零开始计数。如果终端连接到第一个串口(COM1),则使用 /dev/ttyu0 来引用该终端。如果终端连接到第二个串口(COM2),则使用 /dev/ttyu1 ,依此类推。通常,呼叫端口用于终端。呼叫端口要求串行线路正确工作时要断言“数据载波检测”信号。

  • 在 FreeBSD 8.X 及更高版本上,呼叫输出端口被命名为 /dev/cuauN,而在 FreeBSD 7.X 及更低版本上被命名为 /dev/cuadN。呼叫输出端口通常不用于终端,而是用于调制解调器。如果串行电缆或终端不支持“数据载波检测”信号,可以使用呼叫输出端口。

FreeBSD 还提供了初始化设备(/dev/ttyuN.init/dev/cuauN.init/dev/cuadN.init)和锁定设备( /dev/ttyuN.lock/dev/cuauN.lock/dev/cuadN.lock)。初始化设备用于在每次打开端口时初始化通信端口参数,例如对于使用 RTS/CTS 信号进行流量控制的调制解调器,可以使用 crtscts。锁定设备用于锁定端口上的标志,以防止用户或程序更改某些参数。有关终端设置、锁定和初始化设备以及设置终端选项的信息,请参阅 termios(4)uart(4)stty(1)

29.2.2. 串口配置

默认情况下,FreeBSD 支持四个串口,通常被称为 COM1、COM2、COM3 和 COM4。FreeBSD 还支持一些简单的多串口接口卡,如 BocaBoard 1008 和 2016,以及一些更智能的多串口卡,如 Digiboard 制造的卡。然而,默认内核只会寻找标准的 COM 端口。

要查看系统是否识别串口,请查找以 uart 开头的系统引导消息。

# grep uart /var/run/dmesg.boot

如果系统无法识别所有所需的串口,可以将其他条目添加到 /boot/device.hints 文件中。该文件已经包含了针对 COM1 的 hint.uart.0. 条目和针对 COM1hint.uart.1. 条目。当为 COM3 添加串口条目时,请使用 0x3E8 ,而对于 COM4,请使用 0x2E8。常见的 IRQ 地址是 COM35COM49

要确定端口使用的默认终端 I/O 设置集,请指定其设备名称。此示例确定了 COM2 上呼入端口的设置。

# stty -a -f /dev/ttyu1

系统范围内的串行设备初始化由 /etc/rc.d/serial 控制。该文件影响串行设备的默认设置。要更改设备的设置,请使用 stty 命令。默认情况下,更改的设置在设备关闭之前有效,当设备重新打开时,它会恢复到默认设置。要永久更改默认设置,请打开并调整初始化设备的设置。例如,要为 ttyu5 打开 CLOCAL 模式、 8 位通信和 XON/XOFF 流控制,请输入:

# stty -f /dev/ttyu5.init clocal cs8 ixon ixoff

为了防止应用程序更改某些设置,请对锁定设备进行调整。例如,要将 ttyu5 的速度锁定为 57600 bps ,请输入:

# stty -f /dev/ttyu5.lock 57600

现在,任何打开 ttyu5 并尝试更改端口速度的应用程序都将被困在 57600 bps。

29.3. 终端

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

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

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

FreeBSD 系统可以连接多个终端。可以使用一台旧的备用计算机作为终端,通过有线连接到运行 FreeBSD 的更强大的计算机上。这可以将原本可能是单用户计算机转变为功能强大的多用户系统。

FreeBSD 支持三种类型的终端:

哑终端

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

有许多制造商生产的数百种哑终端,几乎任何一种终端都可以与 FreeBSD 配合使用。一些高端终端甚至可以显示图形,但只有特定的软件包才能利用这些高级功能。

在工作环境中,工人不需要访问图形应用程序时,哑终端非常受欢迎。

计算机作为终端的角色

由于哑终端只具备足够的能力来显示、发送和接收文本,任何多余的计算机都可以成为哑终端。所需的只是正确的电缆和一些在计算机上运行的“终端仿真”软件。

这个配置非常有用。例如,如果一个用户正在忙于在 FreeBSD 系统的控制台上工作,另一个用户可以同时使用一台性能较弱的个人电脑作为终端连接到 FreeBSD 系统上进行纯文本工作。

在 FreeBSD 的基本系统中,至少有两个工具可以通过串行连接进行使用:cu(1)tip(1)

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

# cu -l /dev/cuauN

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

通过 Ports Collection 可以获得其他的程序,例如 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 配置支持前四个串口,即 ttyu0ttyu3

ttyu0   "/usr/libexec/getty std.9600"   dialup  off secure
ttyu1   "/usr/libexec/getty std.9600"   dialup  off secure
ttyu2   "/usr/libexec/getty std.9600"   dialup  off secure
ttyu3   "/usr/libexec/getty std.9600"   dialup  off secure

当连接终端到其中一个端口时,修改默认条目以设置所需的速度和终端类型,打开设备,并且如果需要,更改端口的安全设置。如果终端连接到另一个端口,添加一个端口的条目。

配置终端条目 配置了两个终端在 /etc/ttys 中。第一个条目配置了一个连接到 COM2 的 Wyse-50 终端。第二个条目配置了一台运行 Procomm 终端软件模拟 VT-100 终端的旧计算机。该计算机连接到多端口串行卡的第六个串行端口。

例 1. 配置终端条目
ttyu1  "/usr/libexec/getty std.38400"  wy50   on insecure
ttyu5   "/usr/libexec/getty std.19200"  vt100  on insecure

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

第二个字段告诉 getty 初始化并打开线路,设置线路速度,提示用户输入用户名,然后执行 login 程序。可选的 getty 类型 配置终端线路的特性,如 bps 速率和奇偶校验。可用的 getty 类型在 /etc/gettytab 中列出。在几乎所有情况下,以 std 开头的 getty 类型适用于硬连线终端,因为这些条目忽略奇偶校验。每个 bps 速率从 110 到 115200 都有一个 std 条目。有关更多信息,请参阅 gettytab(5)。在设置 getty 类型时,请确保与终端使用的通信设置匹配。对于此示例,Wyse-50 不使用奇偶校验,并以 38400 bps 连接。计算机不使用奇偶校验,并以 19200 bps 连接。

第三个字段是终端的类型。对于拨号端口,通常使用 unknowndialup,因为用户可以使用几乎任何类型的终端或软件进行拨号。由于有线终端的终端类型不会改变,可以指定来自 /etc/termcap 的真实终端类型。在这个例子中, Wyse-50 使用真实的终端类型,而运行 Procomm 的计算机设置为模拟 VT-100 。

第四个字段指定端口是否应该被启用。要在该端口上启用登录,此字段必须设置为 on

最后一个字段用于指定端口是否安全。将端口标记为 secure 表示该端口足够可信,允许 root 从该端口登录。不安全的端口不允许 root 登录。在不安全的端口上,用户必须从非特权帐户登录,然后使用 su 或类似的机制获取超级用户权限,如 “超级用户帐户” 中所述。出于安全原因,建议将此设置更改为 insecure

在对 /etc/ttys 文件进行任何更改后,向 init 进程发送 SIGHUP(hangup)信号,强制其重新读取配置文件。

# kill -HUP 1

由于 init 始终是系统上运行的第一个进程,因此它的进程 ID 始终为 1

如果一切设置正确,所有电缆都已连接好,终端已经启动,那么每个终端现在应该运行着一个 getty 进程,并且每个终端上都应该有登录提示符可用。

29.3.2. 连接故障排除

即使在对细节极为细致入微的情况下,设置终端时仍然可能出现问题。以下是一些常见症状和一些建议的解决方法。

如果没有出现登录提示,请确保终端已插好并已开机。如果终端是个人电脑充当的,确保它在正确的串口上运行终端仿真软件。

确保电缆牢固地连接到终端和 FreeBSD 计算机上。确保它是正确类型的电缆。

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

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

# 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

如果字符出现重复,并且在键入时密码出现,请将终端或终端仿真软件从“half duplex”或“local echo”切换到“full duplex”。

29.4. 拨入服务

为了配置一个用于拨入服务的 FreeBSD 系统,与配置终端类似,只是使用调制解调器而不是终端设备。 FreeBSD 支持外部和内部调制解调器。

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

内置调制解调器通常缺乏非易失性 RAM ,因此它们的配置可能仅限于设置 DIP 开关。如果内置调制解调器有任何信号指示灯,当系统盖盖上时时很难查看。

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

FreeBSD 在超过 2400 bps 的速度下需要 RTS 和 CTS 信号进行流控制,需要 CD 信号来检测呼叫是否已接听或线路是否已挂断,并且需要 DTR 信号在会话结束后重置调制解调器。有些电缆没有连接所有必需的信号,所以如果登录会话在线路挂断后仍然存在,可能是电缆存在问题。有关这些信号的更多信息,请参考 串行电缆和端口

与其他类 UNIX® 操作系统一样, FreeBSD 使用硬件信号来判断呼叫是否已接听或线路是否已挂断,并在呼叫结束后挂断和重置调制解调器。 FreeBSD 避免向调制解调器发送命令或监视调制解调器的状态报告。

FreeBSD 支持 NS8250 、 NS16450 、 NS16550 和 NS16550A 基于 RS-232C (CCITT V.24) 通信接口。8250 和 16450 设备具有单字符缓冲区。 16550 设备提供了一个 16 字符缓冲区,可以提高系统性能。普通的 16550 设备存在缺陷,无法使用 16 字符缓冲区,因此如果可能的话,请使用 16550A 设备。由于单字符缓冲区设备需要操作系统进行更多的工作,所以更倾向于使用基于 16550A 的串行接口卡。如果系统有许多活动的串行端口或将承受重负载,基于 16550A 的卡对于低误码率通信更好。

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

29.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= (next table) 功能实现的。每行使用 tc= (table continuation) 条目来获取特定数据速率的其余设置。

#
# Additions for a V.32bis Modem
#
um|V300|High Speed Modem at 300,8-bit:\
        :nx=V19200:tc=std.300:
un|V1200|High Speed Modem at 1200,8-bit:\
        :nx=V300:tc=std.1200:
uo|V2400|High Speed Modem at 2400,8-bit:\
        :nx=V1200:tc=std.2400:
up|V9600|High Speed Modem at 9600,8-bit:\
        :nx=V2400:tc=std.9600:
uq|V19200|High Speed Modem at 19200,8-bit:\
        :nx=V9600:tc=std.19200:

对于一个 28.8 Kbps 的调制解调器,或者为了利用 14.4 Kbps 调制解调器上的压缩功能,可以使用更高的通信速率,如下面的示例所示:

#
# Additions for a V.32bis or V.34 Modem
# Starting at 57.6 Kbps
#
vm|VH300|Very High Speed Modem at 300,8-bit:\
        :nx=VH57600:tc=std.300:
vn|VH1200|Very High Speed Modem at 1200,8-bit:\
        :nx=VH300:tc=std.1200:
vo|VH2400|Very High Speed Modem at 2400,8-bit:\
        :nx=VH1200:tc=std.2400:
vp|VH9600|Very High Speed Modem at 9600,8-bit:\
        :nx=VH2400:tc=std.9600:
vq|VH57600|Very High Speed Modem at 57600,8-bit:\
        :nx=VH9600:tc=std.57600:

对于 CPU 速度较慢或负载较重的系统,如果没有基于 16550A 的串口,这种配置可能会在 57.6 Kbps 时产生 uart "silo" 错误。

/etc/ttys 的配置与 配置终端条目 类似,但是传递给 getty 的参数不同,并且使用 dialup 作为终端类型。将 xxx 替换为 init 将在设备上运行的进程。

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

dialup 终端类型可以进行更改。例如,将 vt102 设置为默认终端类型,允许用户在远程系统上使用 VT102 仿真。

对于锁定速度的配置,请使用 /etc/gettytab 中列出的有效类型指定速度。以下示例是针对一个端口速度锁定在 19.2 Kbps 的调制解调器:

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

在匹配速度配置中,该条目需要引用 /etc/gettytab 中适当的起始 "auto-baud" 条目。继续以一个以 19.2 Kbps 启动的匹配速度调制解调器为例,使用以下条目:

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

在编辑 /etc/ttys 文件后,在向 init 发送信号之前,请等待调制解调器正确配置并连接。

# kill -HUP 1

高速调制解调器,如 V.32、V.32bis 和 V.34 调制解调器,使用硬件(RTS/CTS)流控制。使用 stty 命令为调制解调器端口设置硬件流控制标志。以下示例在 COM2 的拨入和拨出初始化设备上设置了 crtscts 标志:

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

29.4.2. 故障排除

本节提供了一些解决无法连接到 FreeBSD 系统的拨号调制解调器的技巧。

将调制解调器连接到 FreeBSD 系统并启动系统。如果调制解调器具有状态指示灯,请观察当系统控制台上出现 login: 提示时,调制解调器的 DTR 指示灯是否亮起。如果它亮起,那应该意味着 FreeBSD 已经在适当的通信端口上启动了一个 getty 进程,并且正在等待调制解调器接受呼叫。

如果 DTR 指示灯没有亮起,请通过控制台登录 FreeBSD 系统,并输入 ps ax 命令查看 FreeBSD 是否在正确的端口上运行了 getty 进程:

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

如果第二列包含的是 d0 而不是 ?? ,并且调制解调器尚未接受呼叫,这意味着 getty 已经完成了对通信端口的打开。这可能表明存在电缆问题或调制解调器配置错误,因为在调制解调器断开检测信号被断言之前,getty 不应该能够打开通信端口。

如果没有 getty 进程等待打开端口,请再次检查在 /etc/ttys 中端口的条目是否正确。此外,请检查 /var/log/messages 以查看是否有来自 initgetty 的日志消息。

接下来,请尝试拨入系统。确保在远程系统上使用 8 位、无奇偶校验和 1 个停止位。如果没有立即出现提示符,或者提示符显示乱码,请尝试每秒按下 Enter 键一次。如果仍然没有出现 login: 提示符,请尝试发送 BREAK 信号。当使用高速调制解调器时,在锁定拨号调制解调器的接口速度后再次拨号。

如果仍然没有出现 login: 提示符,请再次检查 /etc/gettytab ,并仔细确认以下内容:

  • /etc/ttys 文件中指定的初始能力名称与 /etc/gettytab 文件中的能力名称匹配。

  • 每个 nx= 条目都与 gettytab 的能力名称相匹配。

  • 每个 tc= 条目都与另一个 gettytab 能力名称匹配。

如果 FreeBSD 系统上的调制解调器不会应答,请确保调制解调器配置为在 DTR 被断开时接听电话。如果调制解调器似乎已正确配置,请通过检查调制解调器的指示灯来验证 DTR 线是否被断开。

如果仍然无法解决问题,请尝试发送电子邮件到 FreeBSD general questions mailing list,描述调制解调器和问题。

29.5. 拨出服务

以下是通过调制解调器将主机连接到另一台计算机的提示。这适用于与远程主机建立终端会话。

如果使用 PPP 存在问题,这种连接方式可以帮助获取互联网上的文件。如果 PPP 无法正常工作,可以使用终端会话来通过 FTP 获取所需文件。然后使用 zmodem 将其传输到计算机上。

29.5.1. 使用一台 Stock Hayes 调制解调器

tip 内置了一个通用的 Hayes 拨号器。在 /etc/remote 文件中使用 at=hayes

Hayes 驱动程序不够智能,无法识别一些较新调制解调器消息的高级功能,例如 BUSYNO DIALTONECONNECT 115200。在使用 tipATX0&W 时,请关闭这些消息。

tip 的拨号超时时间为 60 秒。调制解调器应该使用更短的时间,否则 tip 会认为存在通信问题。尝试使用 ATS7=45&W

29.5.2. 使用 AT 命令

/etc/remote 中创建一个"direct"条目。例如,如果调制解调器连接到第一个串口, /dev/cuau0 ,请使用以下行:

cuau0:dv=/dev/cuau0:br#19200:pa=none

br 功能中使用调制解调器支持的最高 bps 速率。然后,键入 tip cuau0 以连接到调制解调器。

或者,使用以下命令将 cu 作为 root 使用:

# cu -lline -sspeed

line 是串口,例如 /dev/cuau0 ,而 speed 是速度,例如 57600 。输入完 AT 命令后,输入 ~. 退出。

29.5.3. @ 符号不起作用

电话号码功能中的 @ 符号告诉 tip/etc/phones 文件中查找电话号码。但是,在像 /etc/remote 这样的功能文件中, @ 符号也是一个特殊字符,因此需要用反斜杠进行转义:

pn=\@

29.5.4. 从命令行拨号

/etc/remote 中添加一个 "generic" 条目。例如:

tip115200|Dial any phone number at 115200 bps:\
        :dv=/dev/cuau0:br#115200:at=hayes:pa=none:du:
tip57600|Dial any phone number at 57600 bps:\
        :dv=/dev/cuau0:br#57600:at=hayes:pa=none:du:

现在应该可以工作了。

# tip -115200 5551234

喜欢使用 cu 而不是 tip 的用户可以使用通用的 cu 条目:

cu115200|Use cu to dial any number at 115200bps:\
        :dv=/dev/cuau1:br#57600:at=hayes:pa=none:du:

并且类型:

# cu 5551234 -s 115200

29.5.5. 设置波特率

tip1200cu1200 添加一个条目,但请根据 br 功能使用适当的 bps 速率。 tip 认为默认的速率是 1200 bps ,这就是为什么它会寻找 tip1200 条目的原因。然而,并不一定非要使用 1200 bps 。

29.5.6. 通过终端服务器访问多台主机

不必每次等待连接并输入 CONNECT host ,可以使用 tipcm 功能。例如,在 /etc/remote 中添加以下条目,可以通过输入 tip paintip muffin 连接到主机 painmuffin ,以及通过输入 tip deep13 连接到终端服务器。

pain|pain.deep13.com|Forrester's machine:\
        :cm=CONNECT pain\n:tc=deep13:
muffin|muffin.deep13.com|Frank's machine:\
        :cm=CONNECT muffin\n:tc=deep13:
deep13:Gizmonics Institute terminal server:\
        :dv=/dev/cuau2:br#38400:at=hayes:du:pa=none:pn=5551234:

29.5.7. 使用多行显示 tip 提示信息

这通常是一个问题,当一所大学拥有多条调制解调器线路,并有几千名学生试图使用它们时。

/etc/remote 中添加一条条目,并使用 ` @ ` 作为 pn 功能的标识符:

big-university:\
        :pn=\@:tc=dialout
dialout:\
        :dv=/dev/cuau3:br#9600:at=courier:du:pa=none:

然后,在 /etc/phones 中列出电话号码:

big-university 5551111
big-university 5551112
big-university 5551113
big-university 5551114

tip 会按照列表中的顺序尝试每个数字,然后放弃。要保持重试,可以在一个 while 循环中运行 tip

29.5.8. 使用 Force 字符

Ctrl+P 是默认的 "force" 字符,用于告诉 tip 下一个字符是字面数据。可以使用 ~s 转义将强制字符设置为任何其他字符,该转义意味着 "set a variable."。

在新行后面输入 ~sforce=single-charsingle-char 是任意一个字符。如果省略 single-char,则强制字符为空字符,可以通过键入 Ctrl+2Ctrl+Space 来访问。一个很好的 single-char 值是 Shift+Ctrl+6,这只在某些终端服务器上使用。

要更改 force 字符,请在 ~/.tiprc 中指定以下内容:

force=single-char

29.5.9. 大写字母

当按下 Ctrl+A 时,会发生这种情况,这是 tip 的 "raise character",专为那些键盘上的大写锁定键损坏的人设计的。使用 ~s 来设置 raisechar 为合理的值。如果两个特性都没有使用,它可以被设置为与强制字符相同。

这是一个给需要在 Emacs 中输入 Ctrl+2Ctrl+A 的用户的示例 ~/.tiprc 文件:

force=^^
raisechar=^^

^^Shift+Ctrl+6

29.5.10. 使用 tip 进行文件传输

当与另一个类 UNIX® 操作系统进行通信时,可以使用 ~p(put)和 ~t(take)命令发送和接收文件。这些命令在远程系统上运行 catecho 命令来接受和发送文件。语法如下:~p 本地文件 [ 远程文件 ] ~t 远程文件 [ 本地文件 ] 。

没有错误检查,所以可能应该使用另一种协议,比如 zmodem。

29.5.11. 使用 tip 与 zmodem 一起使用?

要接收文件,请在远程端启动发送程序。然后,输入 ~C rz 以开始在本地接收文件。

要发送文件,请在远程端启动接收程序。然后,输入 ~C sz files 将文件发送到远程系统。

29.6. 设置串行控制台

FreeBSD 具有通过串口作为控制台来启动系统的能力。这种配置对于希望在没有键盘或显示器连接的机器上安装 FreeBSD 的系统管理员以及希望调试内核或设备驱动程序的开发人员非常有用。

FreeBSD 引导过程 中所描述的,FreeBSD 采用了三阶段的引导过程。前两个阶段是存储在引导磁盘上 FreeBSD 分区的开头的引导块代码。然后,引导块加载并运行引导加载程序作为第三阶段的代码。

为了设置从串行控制台启动,需要配置引导块代码、引导加载程序代码和内核。

29.6.1. 快速串行控制台配置

本节提供了设置串行控制台的快速概述。当哑终端连接到 COM1 时,可以使用此过程。

过程:在 COM1 上配置串行控制台
  1. 将串行电缆连接到 COM1 和控制终端。

  2. 要配置启动消息在串行控制台上显示,以超级用户身份执行以下命令:

    # echo 'console="comconsole"' >> /boot/loader.conf
  3. 编辑 /etc/ttys 文件,将 off 改为 on ,将 dialup 改为 vt100 ,针对 ttyu0 条目。否则,通过串行控制台连接时将不需要密码,可能导致安全漏洞。

  4. 重新启动系统以查看更改是否生效。

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

29.6.2. 深入的串行控制台配置

本节提供了在 FreeBSD 中设置串行控制台所需步骤的更详细解释。

过程:配置串行控制台
  1. 准备一根串行电缆。

    使用空模拟电缆或标准串行电缆和空模拟适配器。有关串行电缆的讨论,请参见 串行电缆和端口

  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. 在串口上,向 /boot/device.hints 添加适当的 hint.uart.* 条目。一些多串口卡还需要内核配置选项。请参考 uart(4) 获取所需的选项和每个支持的串口的设备提示。

  5. 在引导驱动器的 a 分区的根目录中创建名为 boot.config 的文件。

    这个文件指示引导块代码如何引导系统。为了激活串行控制台,需要一个或多个以下选项。当使用多个选项时,请将它们都包含在同一行中:

    -h

    在内部和串行控制台之间切换。使用此选项来切换控制台设备。例如,要从内部(视频)控制台启动,请使用 -h 将引导加载程序和内核指定使用串行端口作为控制台设备。或者,要从串行端口启动,请使用 -h 告诉引导加载程序和内核使用视频显示作为控制台。

    -D

    在单一和双重控制台配置之间切换。在单一配置中,控制台将根据 -h 的状态,选择内部控制台(视频显示)或串口。在双重控制台配置中,无论 -h 的状态如何,视频显示和串口将同时成为控制台。然而,双重控制台配置仅在引导块运行时生效。一旦引导加载程序获得控制权,由 -h 指定的控制台将成为唯一的控制台。

    -P

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

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

    使用 -P 来自动选择控制台,或者使用 -h 来激活串行控制台。更多详细信息请参考 boot(8)boot.config(5)

    除了 -P 之外的选项都会传递给引导加载程序。引导加载程序将通过检查 -h 的状态来确定内部视频还是串口应该成为控制台。这意味着如果在 /boot.config 中指定了 -D 但未指定 -h ,则串口只能在引导块期间用作控制台,因为引导加载程序将使用内部视频显示作为控制台。

  6. 启动机器。

    当 FreeBSD 启动时,引导块会将 /boot.config 的内容回显到控制台。例如:

    /boot.config: -P
    Keyboard: no

    如果在 /boot.config 中存在 -P ,则第二行才会出现,并指示键盘的存在或不存在。这些消息会发送到串行或内部控制台,或者两者都会发送,具体取决于 /boot.config 中的选项。

    选项 消息发送至

    内部控制台

    -h

    串行控制台

    -D

    串行和内部控制台

    -Dh

    串行和内部控制台

    -P ,键盘存在

    内部控制台

    -P ,键盘缺失

    串行控制台

    在消息之后,启动块将会有一个小的暂停,然后继续加载引导加载程序,并在打印任何进一步的消息到控制台之前。在正常情况下,没有必要中断启动块,但可以这样做以确保设置正确。

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

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

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

    如果串行终端上没有提示符,说明设置有问题。输入 -h 然后按下键盘上的 EnterReturn 键,告诉引导块(然后是引导加载程序和内核)选择串行端口作为控制台。系统启动后,返回并检查出了什么问题。

在引导过程的第三阶段,可以通过在引导加载程序中设置适当的环境变量来在内部控制台和串行控制台之间切换。有关更多信息,请参阅 loader(8)

无论 /boot.config 中的选项如何,此行在 /boot/loader.conf/boot/loader.conf.local 中配置引导加载程序和内核将其引导消息发送到串行控制台。

console="comconsole"

这行应该是 /boot/loader.conf 的第一行,以便尽早在串行控制台上显示引导消息。

如果该行不存在,或者设置为 console ="vidconsole" ,引导加载程序和内核将使用引导块中通过 -h 指定的控制台。有关更多信息,请参阅 loader.conf(5)

目前,引导加载程序没有与引导块中的 -P 选项相当的选项,并且没有根据键盘的存在自动选择内部控制台和串行控制台的功能。

虽然不是必需的,但可以通过串行线提供“登录”提示。要配置此功能,请按照 终端配置 中的说明编辑 /etc/ttys 中串行端口的条目。如果串行端口的速度已更改,请将 std.9600 更改为与新设置匹配的值。

29.6.3. 设置更快的串口速度

默认情况下,串口设置为 9600 波特率, 8 位数据位,无奇偶校验, 1 个停止位。要更改默认控制台速度,请使用以下选项之一:

  • 编辑 /etc/make.conf 文件,并将 BOOT_COMCONSOLE_SPEED 设置为新的控制台速度。然后,重新编译并安装引导块和引导加载程序:

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

    如果串行控制台的配置方式与使用 -h 引导不同,或者内核使用的串行控制台与引导块使用的不同,可以将以下选项添加到自定义内核配置文件中,并编译一个新的内核,以设置所需的速度:

    options CONSPEED=19200
  • -S19200 引导选项添加到 /boot.config 文件中,将 19200 替换为要使用的速度。

  • 将以下选项添加到 /boot/loader.conf 文件中。将 115200 替换为要使用的速度。

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

29.6.4. 通过串行线进入 DDB 调试器

要配置从串行控制台进入内核调试器的能力,请将以下选项添加到自定义内核配置文件中,并按照 Configuring the FreeBSD Kernel 中的说明编译内核。请注意,虽然这对于远程诊断很有用,但如果串口上生成了一个虚假的 BREAK 信号,也是很危险的。有关内核调试器的更多信息,请参阅 ddb(4)ddb(8)

options BREAK_TO_DEBUGGER
options DDB

上次修改时间: September 18, 2024 by github actions