FreeBSD 使用手册
上一页 | 第27章 　串口通讯 | 下一页

# 27.4 拨入服务

Contributed by Guy Helmer. Additions by Sean Kelly.

> 警告: 从 FreeBSD 8.0 开始， 用于串口的设备节点从 `/dev/cuad`N`` 改为了 `/dev/cuau`N``； 从 `/dev/ttyd`N`` 改为了 `/dev/ttyu`N``。 FreeBSD 7.X 用户需要根据实际情况对这份文档中的例子进行必要的调整。

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

## 27.4.1 外置vs.内置modem

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

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

### 27.4.1.1 Modem和线缆

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

表 27-4. 信号名称

缩写 | 全名
--- | ---
RD | 收到数据 (Received Data)
TD | 传出数据 (Transmitted Data)
DTR | 数据终端就绪 (Data Terminal Ready)
DSR | 数据集就绪 (Data Set Ready)
DCD | 数据载波检测 (Data Carrier Detect) (RS-232 的收到线路信号检测器)
SG | 信号地 (Signal Ground)
RTS | 要求发送数据 (Request to Send)
CTS | 允许对方发送数据 (Clear to Send)

FreeBSD 对速度超过 2400 bps 的情形需要通过 RTS 和 CTS 信号来完成流控制， 通过 CD 信号来检测呼叫响应和挂机， 并通过 DTR 信号来在会话结束时对调制解调器进行复位。 某些电缆在连接时没有提供全部需要的信号， 这会给您带来问题， 例如在挂断时登录会话不消失， 这就有可能是电缆的问题。

与其它类 UNIX® 操作系统类似， FreeBSD 使用硬件信号来检测呼叫响应， 以及在挂断时挂断并复位调制解调器。 FreeBSD 避免发送命令给调制解调器， 或监视其状态。 如果您熟悉通过调制解调器来连接基于 PC 的 BBS 系统， 这可能看起来有点难用。

## 27.4.2 串口的考虑

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

## 27.4.3 快速预览

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

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

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

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

## 27.4.4 配置文件

如果希望允许拨入您的 FreeBSD 系统， 在 `/etc` 目录中有三个系统配置文件需要您关注。 其一是 `/etc/gettytab`， 其中包含用于 `/usr/libexec/getty` 服务的配置信息。 其二是 `/etc/ttys`， 它的作用是告诉 `/sbin/init` 哪些 `tty` 设备上应该运行 `getty`。 最后， 关于端口的初始化命令， 应放到 `/etc/rc.d/serial` 脚本中。

关于在 UNIX 上配置拨入调制解调器有两种主要的流派。 一种是将本地计算机到调制解调器的 RS-232 接口配置为固定速率。 这样做的好处是， 远程用户总能立即见到系统的登录提示符， 而其缺点则是， 系统并不知道用户真实的数据速率是多少， 因而， 类似 Emacs 这样的程序， 也就无法调整它们绘制屏幕的方式， 以便为慢速连接改善响应时间。

另一种流派将调制解调器的 RS-232 接口速率配置为随远程用户的连接速率变化。 例如， 对 V.32bis (14.4 Kbps) 连接， 调制解调器会让自己的 RS-232 接口以 19.2 Kbps 的速率运行， 而 2400 bps 连接， 则会使调制解调器的 RS-232 接口以 2400 bps 的速率运行。 由于 `getty` 并不能识别具体的调制解调器的连接速率反馈信息， 因此， `getty` 会以初始速度给出一个 `login:` 提示， 并检查用户的响应字符。 如果用户看到乱码， 则他们应知道此时应按下 Enter 键， 直到看到可以辨认的提示符为止。 如果数据速率不匹配， 则 `getty` 会将用户输入的任何信息均视为 “乱码”， 并尝试以下一种速率来再次给出 `login:` 提示符。 这一过程可能需要令人作呕地重复下去， 不过一般而言， 用户只要敲一两下键盘就能看到正确的提示符了。 显然， 这种登录过程看起来不如前面所介绍的 “锁定速率” 方法那样简单明了， 但使用低速连接的用户， 却可以在运行全屏幕程序时得到更好的交互响应。

这一节将尽可能公平地介绍关于配置的信息， 但更着力于介绍调制解调器速率随连接速率变化的配置方法。

### 27.4.4.1 `/etc/gettytab`

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

#### 27.4.4.1.1 锁定速度的配置

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

#### 27.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”错误。

### 27.4.4.2 `/etc/ttys`

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

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

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

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

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

    # kill -HUP 1

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

#### 27.4.4.2.1 锁定速度的配置

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

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

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

#### 27.4.4.2.2 匹配速度的设置

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

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

### 27.4.4.3 `/etc/rc.d/serial`

高速调制解调器， 如使用 V.32、 V.32bis， 以及 V.34 的那些， 需要使用硬件 (`RTS/CTS`) 流控制。 您可以在 `/etc/rc.d/serial` 中增加 `stty` 命令来在 FreeBSD 内核中， 为调制解调器设置硬件流控制标志。

例如， 在 1 号串口 (`COM2`) 拨入和拨出设备上配置 `termios` 标志 `crtscts`， 可以通过在 `/etc/rc.d/serial` 增加下面的设置来实现：

    # Serial port initial configuration
    stty -f /dev/ttyu1.init crtscts
    stty -f /dev/cuau1.init crtscts

## 27.4.5 Modem 设置

如果您有一个 modem， 它的参数能被存储在非易失性的 RAM 中， 您将必须使用一个终端程序来设置参数 （比如 MS-DOS® 下的 Telix 或者 FreeBSD 下的 `tip`）。 使用同样的通讯速度来连接 modem 作为初始速度 `getty` 将使用和配置 modem 的非易失性 RAM 来适应这些要求：

- 连接时宣告 CD

- 操作时宣告 DTR； DTR 消失时挂断线路并复位调制解调器

- CTS 传输数据流控制

- 禁用 XON/XOFF 流控制

- RTS 接收数据流控制

- 宁静模式 (无返回码)

- 无命令回显

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

例如，要在一个 U.S. Robotics® Sportster® 14400 的外置 modem 上设置上面的参数，可以用下面这些命令：

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

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

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

- Switch 1: UP ── DTR Normal

- Switch 2: N/A (Verbal Result Codes/Numeric Result Codes)

- Switch 3: UP ── Suppress Result Codes

- Switch 4: DOWN ── No echo, offline commands

- Switch 5: UP ── Auto Answer

- Switch 6: UP ── Carrier Detect Normal

- Switch 7: UP ── Load NVRAM Defaults

- Switch 8: N/A (Smart Mode/Dumb Mode)

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

### 27.4.5.1 锁定速度的配置

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

    ATZ
    AT&B1&W

### 27.4.5.2 匹配速度的配置

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

    ATZ
    AT&B2&W

### 27.4.5.3 检查modem的配置

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

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

## 27.4.6 问题解答

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

### 27.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 ttyu0
      115 ??  I      0:00.10 /usr/libexec/getty V19200 ttyu1

如果您看到是这样的：

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

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

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

### 27.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 一般问题邮件列表 寻求帮助。

上一页 | 起始页 | 下一页
终端 | 上一级 | 拨出设备

本文档和其它文档可从这里下载：ftp://ftp.FreeBSD.org/pub/FreeBSD/doc/.

如果对于FreeBSD有问题，请先阅读文档，如不能解决再联系<questions@FreeBSD.org>.
关于本文档的问题请发信联系 <doc@FreeBSD.org>.