20.4. 拨入服务

Contributed by Guy Helmer. Additions by Sean Kelly.

为拨入服务配置FreeBSD系统与连接到终端是非常相似的,除非您正在使用 modem来拨号而不是终端。

20.4.1. 外置vs.内置modem

外置modem看起来很容易拨号。 因为,外置 modem 可以通过储存在非易失性的RAM中的参数来配置, 它们通常提供指示器来显示重要的RS-232信号的状态。 不停闪光的信号灯能给用户留下比较深刻的印象, 而且指示器也可以用来查看modem是否正常地工作。

内置modem通常缺乏非易失性的RAM, 所以对它们的配置可能会限制在通过 DIP 开关来设置。 如果您的内置modem有指示灯,您也很难看得到。

20.4.1.1. Modem和线缆

如果您使用一个外置的 modem,那您将需要适当的电缆线。 一个标准的串行线应当足够长以至普通的信号能够连接上:

  • Transmitted Data (TD)

  • Received Data (RD)

  • Request to Send (RTS)

  • Clear to Send (CTS)

  • Data Set Ready (DSR)

  • Data Terminal Ready (DTR)

  • Carrier Detect (CD)

  • Signal Ground (SG)

FreeBSD需要对速度超过2400bit/s的RTSCTS信号进行流控制, 当一个呼叫被回复或线路被挂起的时候, CD 信号就会被侦测到,一个会话完成之后,DTR 信号就会刷新modem。 一些线缆不需要任何信号就可以连接, 所以如果您有问题, 当线路被挂断时, 一个登录任务就会丢失, 您可能会在线缆上有问题。

像其他 UNIX® 类的操作系统一样, FreeBSD 使用硬件信号来寻找出一个呼叫什么时候会回复或一个线路会被挂起。 FreeBSD 避免发送命令给 modem 或监视 modem 的状况。 如果您熟悉连接 modem 到基于 PC 的 BBS,这可能看起来有点笨拙。

20.4.2. 串行接口的考虑

FreeBSD支持基于 NS8250, NS16450, NS16550 和 NS16550A 的EIA RS-232C通讯接口。 8250和16450设备有单字符缓冲。 16550设备提供了一个 16 个字符的缓冲, 可以提高更多的系统性能。 因为单字符缓冲设备比 16 个字符的缓冲需要更多的系统资源来工作, 所以基于16550A的接口卡可能更好。 如果系统没有活动的串口, 或有较大的负载, 16 字符缓冲的卡对于低错误率的通讯来说更好。

20.4.3. 快速预览

对于终端, init 会在每个配置串口上为每个拨入连接产生一个 getty 进程。 例如, 如果一个 modem 被附带在 /dev/ttyd0 中,用命令ps ax可以显示下面这些:

 4850 ??  I      0:00.09 /usr/libexec/getty V19200 ttyd0

当用户拨上modem, 并使用它进行连接时, CD 线就会被 modem 认出。 内核注意到载波信号已经被检测到, 需要完成 getty 端口的打开。 getty 发送一个登录:在指定的初始线速度上的命令行。 Getty 会检查合法的字符是否被接收, 在典型的配置中, 如果发现 “垃圾”, getty 就会设法调节线速度,直到它接收到合理的字符。

用户在键入他/她的登录名称后, getty执行/usr/bin/login, 这会要求用户输入密码来完成登录, 然后启动用户的shell。

20.4.4. 配置文件

/etc 目录中,有三个您将需要编辑的系统配置文件, 来允许拨号访问到您的 FreeBSD 系统。 第一, /etc/gettytab 包含了针对 /usr/libexec/getty 守护程序的配置信息。 第二, 保存信息来告诉 /sbin/init 什么 tty 设备将有运行在它们系统上的 getty进程。 最后, 您可以把端口初始化命令放在 /etc/rc.serial 脚本中。

UNIX 上, 关于拨号 modem 的想法主要有两种。 一种是把本地接口配置成一个固定速度, 以至一个远程用户拨号进入时都保持一个固定速度。 这样配置的好处是远程用户总是可以立即看到一个系统的登录界面。 这种下降趋势是系统不知道一个用户真正的数据速度是多少, 所以像 Emacs 全屏程序将不会调节屏幕刷新来确保对比较慢的连接有比较好的回应。

另一所学校将他们的 modem 所在的 RS-232 设置为自动适应远程用户的连接速度。 例如, V.32bis (14.4 Kbps) 的连接将让 modem 所在的 RS-232 接口运行在 19.2 Kbps, 而 2400 bps 的连接则会使 modem 的 RS-232 以 2400 bps 运行。 由于 getty 并不知道任何一个特定的 modem 的连接速率, 因此 getty 会以初始的速率给出一个 login: 消息并监视用户回应的字符。 如果用户看到一些乱码, 则他们应该知道连续按 Enter 键直到能够看到可以识别的提示为止。 如果数据传输速率不匹配, getty 将把用户输入的任何信息看作 “乱码”, 并尝试下一个速度并再次给出 login: 提示。 这个过程可以令人作呕地继续下去, 但用户通常只需按一两次键盘就可以看到正常的提示了。 很明显, 这个登录过程看起来可能没有前面所介绍的 “锁定速率” 方法那样脉络清晰, 但在低速连接上的用户应该能够从全屏幕程序中得到更好的交互响应。

这一节将尽量给出较为公平的配置信息, 但更偏向于使用遵守连接速率的 modem。

20.4.4.1. /etc/gettytab

/etc/gettytab是一个用来配置 getty 信息的 termcap 风格的文件。 请看看 gettytab 的联机手册了解完整的文件格式和功能列表。

20.4.4.1.1. 锁定速度的配置

如果您把您的modem的数据通讯率锁定在一个特殊的速度上, 您不需要对 /etc/gettytab 文件作任何变化。

20.4.4.1.2. 匹配速度的配置

您将需要在 /etc/gettytab 中设置一个记录来告诉 getty 您希望在 modem 上使用的速度。 如果您的 modem 的速率是 2400 bit/s, 则可以使用现有的 D2400 的记录。

#
# Fast dialup terminals, 2400/1200/300 rotary (can start either way)
#
D2400|d2400|Fast-Dial-2400:\
        :nx=D1200:tc=2400-baud:
3|D1200|Fast-Dial-1200:\
        :nx=D300:tc=1200-baud:
5|D300|Fast-Dial-300:\
        :nx=D2400:tc=300-baud:

如果您有一个更高速度的 modem, 必须在 /etc/gettytab 中添加一个记录。 下面是一个让您可以以最高 19.2 Kbit/s 的用在 14.4 Kbit/s的modem上的接口记录:

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

这样做的结果是 8-数据位, 没有奇偶校验的连接。

上面使用19.2 Kbit/s的连接速度的例子,也可以使用 9600 bit/s (for V.32), 2400 bit/s, 1200 bit/s,300 bit/s, 直到 19.2 Kbit/s。 通讯率的调节使用 nx= (“next table”) 来实现。 每条线使用一个 tc= (“table continuation”) 的记录来加速对于一个特殊传输率的标准设置。

如果您有28.8 Kbit/s的modem,或您想使用它的 14.4Kbit/s 模式, 就需要使用一个更高的超过 19.2 Kbit/s 的通讯速度的 modem。 这是一个启动 57.6 Kbit/s 的 gettytab 记录的例子:

#
# 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 Kbit/s上得到 ``sio'' “silo”错误。

20.4.4.2. /etc/ttys

/etc/ttys文件的配置在 Example 20-1中介绍过。 配置 modem 是相似的, 但我们必须指定一个不同的终端类型。 锁定速度和匹配速度配置的通用格式是:

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

上面的第一条是这个记录的设备特定文件 -- ttyd0 表示 /dev/ttyd0 是这个 getty 将被监视的文件。 第二条 "/usr/libexec/getty xxx" 是将运行在设备上的进程 init。 第三条,dialup,是默认的终端类型。 第四个参数, on, 指出了线路是可操作的 init。 也可能会有第五个参数, secure, 但它将只被用作拥有物理安全的终端 (如系统终端)。

默认的终端类型可能依赖于本地参考。 拨号是传统的默认终端类型, 以至用户可以定制它们的登录脚本来注意终端什么时候拨号, 和自动调节它们的终端类型。 然而, 作者发现它很容易在它的站点上指定 vt102 作为默认的终端类型, 因为用户刚才在它们的远程系统上使用的是VT102模拟器。

您对/etc/ttys作修改之后,您可以发送 init 进程给一个 HUP 信号来重读文件。您可以使用下面的命令来发送信号:

# kill -HUP 1
如果这是您的第一次设置系统, 您可能要在发信号 init 之前等一下, 等到您的 modem 正确地配置并连接好。

20.4.4.2.1. 锁定速度的配置

对于一个锁定速度的配置,您的 ttys 记录必须有一个为 getty 提供固定速度的记录。 对于一个速度被锁定在 19.2kbit/s 的 modem, ttys 记录是这样的:

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

如果您的 modem 被锁定在一个不同的数据速度, 为 std.speed 使用适当的速度来代替 std.19200。 确信您使用了一个在 /etc/gettytab 中列出的正确的类型。

20.4.4.2.2. 匹配速度的设置

在一个匹配速度的设置中,您的 ttys 录需要参考在 /etc/gettytab 适当的起始 “auto-baud” 记录。 例如, 如果您为一个以 19.2 Kbit/s 开始的可匹配速度的 modem 添加上面建议的记录, 您的 ttys 记录可能是这样的:

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

20.4.4.3. /etc/rc.serial

高速modem, 像 V.32,V.32bis,和 V.34 modem,需要使用硬件 (RTS/CTS) 流控制。 您可以在 /etc/rc.serial 中添加 stty 命令来设置硬件流控制标记。

例如,在拨入和拨出初始设备的第一个 (COM2) 串行端口上设置termios标记crtscts, 下面这些行会被添加到 /etc/rc.serial中:

# Serial port initial configuration
stty -f /dev/ttyid1 crtscts
stty -f /dev/cuaia1 crtscts

20.4.5. Modem设置

如果您有一个 modem, 它的参数能被存储在非易失性的 RAM 中, 您将必须使用一个终端程序来设置参数。 使用同样的通讯速度来连接 modem 作为初始速度 getty 将使用和配置 modem 的非易失性RAM来匹配这些要求:

请读读您的 modem 的文档找到您需要用什么命令和 DIP 接口设置。

例如,要在一个 USRobotics Sportster 14400 的外置 modem 上设置上面的参数,可以用下面这些命令:

ATZ
AT&C1&D2&H1&I0&R2&W

您也可能想要在 modem 上寻找机会调节这个设置, 例如它是否使用 V.42bis 和 MNP5 压缩。

外置 modem 也有一些用来设置的 DIP 开关, 也许您可以使用这些设置作为一个例子:

在拨号 modem 上的结果代码应该被 禁用/抑制, 以避免当 getty 在 modem 处于命令模式并回显输入时错误地给出 login: 提示时可能造成的问题。 这样可能导致 getty 与 modem 之间产生更长的不必要交互。

20.4.5.1. 锁定速度的配置

对于锁定速度的配置, 您需要配置 modem 来获得一个不依赖于通讯率的稳定的 modem到计算机 的传输率。 在一个 USR Sportster 14400 外置 modem 上, 这些命令将锁定 modem到计算机 的传输率:

ATZ
AT&B1&W

20.4.5.2. 匹配速度的配置

对于一个变速的配置, 您需要配置 modem 调节它的串行端口传输率匹配接收的传输率。 在一个 USR Sportster 14400 的外置 modem 上, 这些命令将锁定 modem 的错误修正传输率适合命令要求的速度, 但允许串行端口速度适应没有纠错的连接:

ATZ
AT&B2&W

20.4.5.3. 检查modem的配置

大多数高速的modem提供了用来查看当前操作参数的命令。 在USR Sportster 14400外置modem上, 命令 ATI5 显示了存储在非易失性RAM中的设置。 要看看正确的 modem 操作参数, 可以使用命令 ATZ 然后是 ATI4

如果您有一个不同牌子的 modem, 检查 modem 的使用手册看看如何双重检查您的 modem 的配置参数。

20.4.6. 问题解答

这儿是几个检查拨号modem的步骤。

20.4.6.1. 检查FreeBSD系统

把您的modem连接到FreeBSD系统, 启动系统, 然后, 如果您的 modem 有一个指示灯, 当登录时看看 modem 的 DTR 指示灯是否亮: 会在系统控制台出现命令行——如果它亮, 意味着 FreeBSD 已经在适当的通讯端口启动了一个 getty 进程, 等待 modem 接收一个呼叫。

如果DTR指示灯不亮, 通过控制台登录到 FreeBSD系统,然后执行一个 ps ax 命令来看 FreeBSD 是否正在正确的端口运行 getty进程。 您将在进程显示中看到像这样的一行:

  114 ??  I      0:00.10 /usr/libexec/getty V19200 ttyd0
  115 ??  I      0:00.10 /usr/libexec/getty V19200 ttyd1

如果您看到是这样的:

  114 d0  I      0:00.10 /usr/libexec/getty V19200 ttyd0

modem 不接收呼叫, 这意味着 getty 已经在通讯端口打开了。 这可以指出线缆有问题或 modem 错误配置, 因为 getty 无法打开通讯端口。

如果您没有看到任何 getty 进程等待打开想要的 ttydN 端口, 在 /etc/ttys 中双击您的记录看看那儿是否有错误。 另外,检查日志文件 /var/log/messages 看看是否有一些来自 initgetty 的问题日志。 如果有任何信息, 仔细检查配置文件 /etc/ttys/etc/gettytab,还有相应的设备文件 /dev/ttydN, 是否有错误,丢失记录,或丢失了设备指定文件。

20.4.6.2. 尝试接入Try Dialing In

设法拨入系统。 确信使用8位, 没有奇偶检验, 在远程系统上的1阻止位。 如果您不能立刻得到一个命令行, 试试每隔一秒按一下 Enter。 如果您仍没有看到一个登录: 设法发送一个 BREAK。 如果您正使用一个高速的 modem 来拨号, 请在锁定拨号 modem 的接口速度后再试试。

如果您不能得到一个登录:prompt,再检查一下 /etc/gettytab,重复检查:

  • /etc/ttys 中指定的初始可用的名称与 /etc/gettytab 的一个可用的相匹配。

  • 每个 nx= 记录与另一个 gettytab 可用名称匹配。

  • 每个 tc= 记录与另一个 gettytab可用名称相匹配。

如果您拨号但 FreeBSD 系统上的 modem 没有回应, 确信 modem 能回应电话。 如果 modem 看起来配置正确了, 通过检查 modem 的指示灯来确认 DTR 线连接正确。

如果您做了好几次,它仍然无法工作,打断一会,等会再试试。 如果还不能工作, 也许您应该发一封电子邮件给 FreeBSD 一般问题邮件列表 寻求帮助。