第 29 章。串行通信

29.1. 概述

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

阅读完本章后,您将了解

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

  • 如何使用调制解调器拨号连接到远程主机。

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

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

在阅读本章之前,您应该

29.2. 串行术语和硬件

串行通信中经常使用以下术语

bps

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

DTE

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

DCE

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

RS-232

定义硬件串行通信的原始标准。后来被重新命名为 TIA-232。

在提及通信数据速率时,本节不使用术语“波特率”。波特率指的是在一段时间内发生的电气状态转换次数,而 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

信号接地

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 支持四个串行端口,通常称为 COM1COM2COM3COM4。FreeBSD 还支持哑多端口串行接口卡,例如 BocaBoard 1008 和 2016,以及更智能的多端口卡,例如 Digiboard 制造的卡。但是,默认内核只查找标准的 COM 端口。

要查看系统是否识别串行端口,请查找以 uart 开头的系统启动消息

# grep uart /var/run/dmesg.boot

如果系统未识别所有需要的串行端口,则可以在 /boot/device.hints 中添加更多条目。该文件已经包含用于 COM1hint.uart.0.* 条目和用于 COM2hint.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.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 设置。如果终端连接到另一个端口,则为该端口添加一个条目。

配置终端条目/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 类型配置终端线路上的特性,例如波特率和奇偶校验。可用的 getty 类型列在 /etc/gettytab 中。在几乎所有情况下,以 std 开头的 getty 类型都适用于硬连线终端,因为这些条目会忽略奇偶校验。每个波特率(从 110 到 115200)都有一个 std 条目。有关更多信息,请参阅 gettytab(5)。设置 getty 类型时,请确保与终端使用的通信设置相匹配。对于此示例,Wyse-50 不使用奇偶校验,并以 38400 波特率连接。电脑不使用奇偶校验,并以 19200 波特率连接。

第三个字段是终端类型。对于拨号端口,通常使用 unknowndialup,因为用户可以使用几乎任何类型的终端或软件拨号。由于硬连线终端的终端类型不会改变,因此可以指定 /etc/termcap 中的真实终端类型。对于此示例,Wyse-50 使用真实终端类型,而运行 Procomm 的电脑设置为模拟 VT-100。

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

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

/etc/ttys 进行任何更改后,向 init 进程发送一个 SIGHUP(挂起)信号,以强制其重新读取其配置文件

# kill -HUP 1

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

如果一切都设置正确,所有电缆都已到位,并且终端已通电,那么现在应该在每个终端上运行一个 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 13wire 条目类似于 std,但会忽略硬件握手。在使用 3wire 时,可能还需要降低波特率或启用软件流控制,以防止缓冲区溢出。

如果出现垃圾字符而不是登录提示,请确保终端和 FreeBSD 在波特率和奇偶校验设置方面达成一致。检查 getty 进程以确保使用正确的getty 类型。如果不是,请编辑 /etc/ttys 并运行 kill -HUP 1

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

29.4. 拨号服务

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

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

内部调制解调器通常没有非易失性 RAM,因此它们的配置可能仅限于设置 DIP 开关。如果内部调制解调器有任何信号指示灯,则在系统盖子关闭时难以查看它们。

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

FreeBSD 需要 RTS 和 CTS 信号在高于 2400 波特率的速率下进行流控制,需要 CD 信号来检测何时接通电话或线路已挂断,以及需要 DTR 信号在会话结束后重置调制解调器。有些电缆没有连接所有需要的信号,因此,如果登录会话在线路挂断后没有消失,则可能是电缆存在问题。有关这些信号的更多信息,请参阅 串行电缆和端口

与其他类 UNIX® 操作系统一样,FreeBSD 使用硬件信号来确定何时接通电话或线路已挂断,以及在通话结束后挂断和重置调制解调器。FreeBSD 避免向调制解调器发送命令或监控来自调制解调器的状态报告。

FreeBSD 支持基于 NS8250、NS16450、NS16550 和 NS16550A 的 RS-232C(CCITT V.24)通信接口。8250 和 16450 设备具有单字符缓冲区。16550 设备提供一个 16 字符缓冲区,这可以提高系统性能。普通 16550 设备中的错误会阻止使用 16 字符缓冲区,因此如果可能,请使用 16550A 设备。由于单字符缓冲区设备比 16 字符缓冲区设备需要操作系统的更多工作,因此优先使用基于 16550A 的串行接口卡。如果系统具有许多活动的串行端口或将承受沉重的负载,则基于 16550A 的卡更适合低错误率通信。

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

29.4.1. 调制解调器配置

与终端一样,init 为每个配置的用于拨入连接的串行端口生成一个 getty 进程。当用户拨打调制解调器的线路并且调制解调器连接时,调制解调器将报告“载波检测”信号。内核注意到载波已检测到,并指示 getty 打开端口并在指定的初始行速率下显示 login: 提示符。在典型的配置中,如果收到乱码字符(通常是由于调制解调器的连接速度与配置速度不同),getty 会尝试调整行速率,直到收到合理的字符。用户输入登录名后,getty 会执行 login,它会通过询问用户的密码并启动用户的 shell 来完成登录过程。

关于拨号调制解调器,有两种不同的观点。一种配置方法是设置调制解调器和系统,以便无论远程用户以何种速度拨号,拨入 RS-232 接口都以锁定速度运行。这种配置的优点是远程用户始终立即看到系统登录提示符。缺点是系统不知道用户的真实数据速率,因此像 Emacs 这样的全屏程序不会调整其屏幕绘制方法以使其对较慢的连接产生更好的响应。

第二种方法是配置 RS-232 接口以根据远程用户的连接速度改变其速度。由于 getty 不了解任何特定调制解调器的连接速度报告,因此它会在初始速度下提供一个 login: 消息,并观察返回的字符。如果用户看到垃圾信息,他们应该按 Enter 键,直到看到可识别的提示符。如果数据速率不匹配,getty 会将用户输入的任何内容视为垃圾信息,尝试下一个速度,并再次给出 login: 提示符。此过程通常只需要一两次击键,用户就可以看到一个良好的提示符。此登录序列看起来不像锁定速度方法那么干净,但低速连接的用户应该从全屏程序中获得更好的交互式响应。

当以特定速度锁定调制解调器的数据通信速率时,无需对 /etc/gettytab 进行任何更改。但是,对于匹配速度的配置,可能需要在 /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=(表格延续)条目来获取特定数据速率的其余设置。

#
# 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:

对于没有基于 16550A 的串行端口的慢速 CPU 或负载很重的系统,此配置可能会在 57.6 Kbps 下产生 uart “筒仓”错误。

的配置 /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 中的相应起始“自动波特率”条目。要继续匹配速度调制解调器的示例,该调制解调器从 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 系统并启动系统。如果调制解调器具有状态指示灯,请观察调制解调器的 DTR 指示灯在系统控制台上出现 login: 提示符时是否点亮。如果点亮,则意味着 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 通用问题邮件列表 发送电子邮件,描述调制解调器和问题。

29.5. 拨出服务

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

如果使用 PPP 时存在问题,这种连接有助于获取 Internet 上的文件。如果 PPP 不工作,请使用终端会话通过 FTP 获取所需的文件。然后使用 zmodem 将其传输到机器。

29.5.1. 使用库存 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 中创建一个“直接”条目。例如,如果调制解调器连接到第一个串行端口 /dev/cuau0,请使用以下行

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

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

或者,以 root 身份使用 cu,使用以下命令

# cu -lline -sspeed

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

29.5.3. @ 符号不起作用

电话号码功能中的 @ 符号告诉 tip/etc/phones 中查找电话号码。但是,@ 符号也是 /etc/remote 等功能文件中的特殊字符,因此需要使用反斜杠对其进行转义

pn=\@

29.5.4. 从命令行拨号

/etc/remote 中放置一个“通用”条目。例如

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. 设置 bps 速率

输入 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. 使用强制字符

Ctrl+P是默认的“强制”字符,用于告诉tip下一个字符是文字数据。强制字符可以使用~s转义符设置为任何其他字符,这意味着“设置变量”。

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

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

force=single-char

29.5.9. 大写字符

当按下Ctrl+A时会发生这种情况,它是tip的“提升字符”,专门为那些Caps Lock键损坏的人设计。使用~sraisechar设置为一个合理的值。如果这两个功能都没有使用,它可以设置为与强制字符相同。

以下是一个适用于需要输入Ctrl+2Ctrl+A的Emacs用户的示例~/.tiprc

force=^^
raisechar=^^

^^Shift+Ctrl+6

29.5.10. 使用tip进行文件传输

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

没有错误检查,因此应该使用其他协议,如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,将ttyu0条目的off更改为on,将dialup更改为vt100。否则,将不需要密码通过串行控制台连接,这会导致潜在的安全漏洞。

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

如果需要其他配置,请参阅下一节以获取更深入的配置说明。

29.6.2. 深入串行控制台配置

本节详细介绍了在 FreeBSD 中设置串行控制台所需步骤。

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

    使用零调制解调器电缆或标准串行电缆和零调制解调器适配器。有关串行电缆的讨论,请参阅串行电缆和端口

  2. 拔掉键盘。

    许多系统在开机自检 (POST) 期间探测键盘,如果未检测到键盘,则会产生错误。一些机器会拒绝启动,直到键盘插入。

    如果计算机抱怨错误,但仍然启动,则不需要进一步配置。

    如果计算机在没有连接键盘的情况下拒绝启动,请配置 BIOS 以忽略此错误。有关如何执行此操作的详细信息,请参阅主板手册。

    尝试在 BIOS 中将键盘设置为“未安装”。此设置告诉 BIOS 在开机时不要探测键盘,因此如果键盘不存在,它应该不会抱怨。如果 BIOS 中没有该选项,请改为查找“在错误时停止”选项。将其设置为“除键盘以外的所有内容”或“无错误”将产生相同的效果。

    如果系统配备了 PS/2® 鼠标,也请拔掉它。PS/2® 鼠标与键盘共享一些硬件,如果鼠标插着,可能会欺骗键盘探测器,使其认为键盘仍然存在。

    虽然大多数系统可以在没有键盘的情况下启动,但相当一部分系统在没有图形适配器的情况下无法启动。可以通过将 BIOS 配置中的“图形适配器”设置更改为“未安装”来配置一些系统,使其在没有图形适配器的情况下启动。其他系统不支持此选项,如果系统中没有显示硬件,则会拒绝启动。对于这些机器,请保留某种类型的显卡插着,即使它只是一个旧的单色板。不需要连接显示器。

  3. 将哑终端、带有调制解调器程序的旧计算机或另一个 UNIX® 盒子的串行端口连接到串行端口。

  4. 将适当的hint.uart.*条目添加到/boot/device.hints中,以对应串行端口。一些多端口卡也需要内核配置选项。有关每个支持的串行端口的所需选项和设备提示,请参阅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的状态来确定内部视频或串行端口应该成为控制台。这意味着,如果指定了-D,但在/boot.config中未指定-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/loader.conf/boot/loader.conf.local 中的这行配置了引导加载程序和内核,以便将它们的引导消息发送到串行控制台,而不管 /boot.config 中的选项如何。

console="comconsole"

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

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

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

虽然不是必需的,但可以通过串行线提供 login 提示。要配置此选项,请使用 终端配置 中的说明编辑 /etc/ttys 中串行端口的条目。如果串行端口的速度已更改,请将 std.115200 更改为与新设置匹配。

29.6.3. 设置更快的串行端口速度

默认情况下,串行端口设置为 115200 波特率、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 调试器

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

options BREAK_TO_DEBUGGER
options DDB

最后修改时间:2024 年 9 月 23 日,作者:Fernando Apesteguía