27.4. 拨入服务

配置 FreeBSD 系统的拨入服务与配置终端相似,只是使用调制解调器而不是终端设备。FreeBSD 同时支持外部和内部调制解调器。

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

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

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

FreeBSD 需要 RTS 和 CTS 信号来实现 2400bps 以上的流量控制,需要 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 的卡更适合于低错误率的通信。

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

27.4.1. 调制解调器配置

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

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

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

当把调制解调器的数据通信速率锁定在一个特定的速度时,应该不需要改变 /etc/gettytab。然而,对于匹配速度的配置,可能需要额外的条目,以定义调制解调器的速度。这个例子配置了一个 14.4Kbps 的调制解调器,最高接口速度为 19.2Kbps,使用8位无奇偶校验连接。它将 getty 配置为以 19.2Kbps 开始 V.32bis 连接的通信速率,然后在 9600 bps、2400 bps、1200 bps、300 bps 之间循环,最后回到 19.2Kbps。通信速率循环是通过 nx=(下一个表)功能实现的。每一行都使用一个 tc=(表的延续)条目来获取特定数据速率的其余设置:

  1. #
  2. # Additions for a V.32bis Modem
  3. #
  4. um|V300|High Speed Modem at 300,8-bit:\
  5. :nx=V19200:tc=std.300:
  6. un|V1200|High Speed Modem at 1200,8-bit:\
  7. :nx=V300:tc=std.1200:
  8. uo|V2400|High Speed Modem at 2400,8-bit:\
  9. :nx=V1200:tc=std.2400:
  10. up|V9600|High Speed Modem at 9600,8-bit:\
  11. :nx=V2400:tc=std.9600:
  12. uq|V19200|High Speed Modem at 19200,8-bit:\
  13. :nx=V9600:tc=std.19200:

对于 28.8Kbps 的调制解调器,或者为了利用 14.4Kbps 调制解调器的压缩优势,请使用较高的通信速率,如本例所示:

  1. #
  2. # Additions for a V.32bis or V.34 Modem
  3. # Starting at 57.6 Kbps
  4. #
  5. vm|VH300|Very High Speed Modem at 300,8-bit:\
  6. :nx=VH57600:tc=std.300:
  7. vn|VH1200|Very High Speed Modem at 1200,8-bit:\
  8. :nx=VH300:tc=std.1200:
  9. vo|VH2400|Very High Speed Modem at 2400,8-bit:\
  10. :nx=VH1200:tc=std.2400:
  11. vp|VH9600|Very High Speed Modem at 9600,8-bit:\
  12. :nx=VH2400:tc=std.9600:
  13. vq|VH57600|Very High Speed Modem at 57600,8-bit:\
  14. :nx=VH9600:tc=std.57600:

对于一个缓慢的 CPU 或者一个没有基于 16550A 的串行端口的重载系统,这种配置可能会在 57.6Kbps 的速度下产生 sio silo错误。

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

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

拨号 (dialup) 终端类型可以被改变。例如,将 vt102 设置为默认的终端类型,允许用户在其远程系统上使用 VT102 模拟。

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

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

在一个匹配速度的配置中,该条目需要参考 /etc/gettytab 中适当的开头auto-baud条目。要继续执行匹配速度调制解调器的例子,即从 19.2Kbps 开始,使用这个条目:

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

编辑完 /etc/ttys 后,等待调制解调器被正确配置和连接,然后向 init 发出信号:

  1. # kill -HUP 1

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

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

27.4.2. 故障排除

这一节提供了一些排除拨号调制解调器无法连接到 FreeBSD 系统的故障的提示。

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

如果 DTR 指示灯不亮,通过控制台登录到 FreeBSD 系统,并键入 ps ax 来查看 FreeBSD 是否在正确的端口上运行 getty 进程:

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

如果第二列包含一个 d0 而不是 ??,并且调制解调器还没有接受呼叫,这意味着 getty 已经完成了对通信端口的打开。这可能表明布线有问题或调制解调器配置错误,因为在调制解调器发出载波检测信号之前,getty 不应该能够打开通信端口。

如果没有 getty 进程等待打开该端口,请仔细检查 /etc/ttys 中该端口的条目是否正确。另外,检查 /var/log/messages ,看是否有任何来自 initgetty 的日志信息。

接下来,试着拨号进入系统。确保在远程系统上使用 8 位,无奇偶校验,和 1 个停止位。如果没有马上出现提示,或者提示显示为垃圾,试着每秒钟按一次回车。如果仍然没有 login: 提示,尝试发送 BREAK。当使用高速调制解调器时,在锁定拨号调制解调器的接口速度后再尝试拨号。

如果仍然没有 login: 提示,再次检查 /etc/gettytab,仔细检查。

  • /etc/ttys 中的条目所指定的初始能力名称与 /etc/gettytab 中的能力名称相符。

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

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

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

如果仍然不能工作,试着向 FreeBSD 一般问题邮件列表 发送电子邮件,描述调制解调器和问题。