Linux网络管理员手册(4)
翻译:赵炯
[email protected]
第四章 设置串行硬件
有这样的传言,在网络世界中有这样一些人,他们只有一台PC机并且钱去花在一根T1-互连网连接上。然而,为了进行他们的新闻(news)和邮件(mail)的日常工作,他们说是用公共电话网络,依靠SLIP连接、UUCP网络、和[电子]公告牌系统(bulletin board systems BBS’s)来施行的。
本章打算帮助所有那些依靠modem来维持他们的连接的人。然而,有许多细节本章将不会加以讨论,例如,如何为拨入配置你的modem。所有这些话题都会包括在Greg Hankins的即将发表的HOWTO系列中,[1] 它将定期地投递到comp.os.linux.announce上。
4.1 Modem连接的通信软件
Linux有许多通信软件包,其中许多是终端程序(terminal programs),用以让一个用户拨接到另一台计算机上,就好象她正坐在一个普通的终端面前一样。传统的拨号终端程序是kermit。然而,这个软件有些简单。现已有许多支持电话号码薄的、含有拨号和登录远程计算机系统脚本语言等等的更适用的程序。这种软件之一是minicom,它与先前DOS用户可能很习惯的某些终端程序相近似。也有一些基于X的通信软件包,例如,seyon。
同样,也有许多基于Linux的BBS软件包,用于那些想运行[电子]公告牌系统的人。这些软件包有些可以在sunsite.unc.edu的/pub/Linux/system/Network中找到。
除终端程序以外,还有一些非交互式地使用串行连接的软件,用于你的计算机收发数据。这种技术的优点在于能够比某些需要在线阅读邮件的mailbox程序和查找有趣文章而浏览公告牌所需的时间,花费更少的时间来自动下载几十KB的数据。另一方面来讲,因为你常常得到的一些无用信息的装入,需要更多的磁盘存储空间。
这类通信软件的摘要[体现]是UUCP。这是从一台主机拷贝文件到另一台、在远程主机上执行程序等的一个程序组。它常用于在私人网络中传送mail或news。能运行在Linux下的Ian Taylor的UUCP软件包将在后面章节中进行讨论。其它非交互式的通信软件是,例如,用于闻名于Fidonet。也有象ifmail这样的Fidonet应用程序的端口。
SLIP,串行线路互连网协议,相对来说有些属于中间类型的,它允许交互式的或非交互式的使用。许多人使用SLIP拨号上到他们的校园网络或一些其他的公共SLIP网络服务器上来运行FTP会话等等。然而SLIP同样也能用于网到网的固定的和半固定的连接,尽管这实际上只对使用ISDN的才感兴趣。
4.2 串行设备概述
UNIX内核为访问串行设备所提供的设备[驱动程序]典型地称为ttys。这是Teletype ™的缩写,它曾经是UNIX早期主要终端生产厂商之一。现今这个术语用于指任何字符型数据终端。贯穿本章,我们都将使用该术语专指内核设备[驱动程序]。
区别三种类型的ttys:(虚拟)控制台、伪终端(类似于一个双向的管道,用于象X11这样的应用程序)、以及串行设备。后一种也称作ttys,因为它允许在一个串行连接上进行交互式的会话操作;而不管它是固定布线连接的终端,还是通过电话线的一个远程主机。
Ttys有许多可配置的参数,这些参数可以使用系统调用ioctl(2)来设置。这些参数中的许多只对串行设备有用,因为它们需要有非常大的灵活性来处理各种类型的连接。
最突出的线路参数是线路速率和奇偶性。但是同样还有大小写字符的转换标志、回车转换成换行等等。tty驱动程序也可以支持各种线路规范(line disciplines),它使得设备驱动程序的表现完全不同。例如,Linux的SLIP驱动程序是按照特殊的线路规范实现的。
关于如何测试线路速度有些含糊不清。正确的术语是比特率,这是与用每秒比特数(或简写作bps)测量的线路传输速度相关的。有时你听会到人们以波特率(Baud rate)来谈到它,这并不是很正确的。然而,这两个术语是不可互换的。波特率指的是某些串行设备的物理特性,也即发出脉冲的时钟速率。比特率则更恰当地表示了两点之间的一个已知连接的当前状态,也即每秒钟传输的平均比特数。知道这两个值通常是不同的很重要,因为大多数设备在每个电脉冲中起码多编码了一个比特。
4.3 访问串行设备
正象UNIX系统中的所有设备一样,串行端口是通过与设备相关的位于/dev目录中的特定文件进行访问的。有两种与串行驱动程序相关的设备文件,而且对于每一个端口,都有这两种的一个设备文件。根据设备所访问的文件,设备的表现将有所不同。
第一种用于当端口用作拨入时;它有一个主号码4,并且文件被命名为ttyS0、ttyS1等等。第二种用于当端口用作拨出时;文件被称为cua0等等,并且有个主号码5。
次号码对两种类型是同样的。如果你在端口COM1到COM4中的一个上面连了个modem的话,那么它的次号码就是COM端口号加63。如果你的设置与此不同,例如,当使用一块支持多串行线的板子时,请参阅Serial Howto。
假设你的modem在COM2上。这样,它的次号码将是65,对于是拨出时主号码将是5。将会有一个设备文件cua1有这些号码。对/dev目录中的串行ttys进行列表。第五列和第六列应该分别显示主号码和次号码:
$ ls -l /dev/cua*
crw-rw-rw- 1 root root 5, 64 Nov 30 19:31 /dev/cua0
crw-rw-rw- 1 root root 5, 65 Nov 30 22:08 /dev/cua1
crw-rw-rw- 1 root root 5, 66 Oct 28 11:56 /dev/cua2
crw-rw-rw- 1 root root 5, 67 Mar 19 1992 /dev/cua3
如果没有这样的设备,你就必须创建一个:作为超级用户,键入
# mknod –m 666 /dev/cua1 c 5 65
#chown root.root /dev/cua1
有些人建议做一个符号联接/dev/modem到你的modem设备,这样临时用户不需要记住这个不太直觉的cua1。然而,你不能在一个程序中使用modem名称,而在另一个程序中使用实际的设备文件名。这是因为这些程序使用所谓的锁定文件(lock file)来通知该设备已被占用。按照惯例,cua1的锁定文件,例如,是LCK..cua1。给同一个端口使用不同的设备文件意味着程序将不能识别出其它的锁定文件,并且大家同时使用这个设备。结果,两个应用程序都完全不能工作。
4.4 串行硬件
目前Linux支持许多种类型的使用RS-232标准的串行板卡。RS-232是目前PC世界串行通信中最通用的标准了。它使用了一些电路来传输单个比特数据和进行同步。另外一些连线可以用于载波信号(用于modems)以及握手信号。
尽管硬件握手信号仅是供选用的,但是很有用的。它使得两个站点的任何一方都能通知对方它是否已准备好接收更多的数据,或者另一个站点是否将要暂停直到接收方已经处理完接收到的数据。用于此目的的连线分别称为“Clear to Send”(CTS)和“Ready to Send”(RTS),它说明了硬件握手信号的俗称,也即“RTS/CTS”。
在PC机中,RS-232接口通常是由UART芯片驱动的,该芯片源自于国家半导体公司的16450芯片,或它的一个新版本NSC16550A。[2] 有些牌子(多数显著的内置modems装配有Rockwell芯片集)也使用完全不同的芯片集,这些芯片被编程成好象它们就是16550芯片。
16450与16550的主要不同之处在于后者有一个16字节的FIFO缓冲区,而前者只有1个字节的缓冲区。这使得16450适合于速度最高为9600 Baud,而更高的速度需要一个与16550兼容的芯片。除了这些芯片以外,Linux还支持8250芯片,该芯片是PC-AT的原始芯片。
在缺省配置情况下,内核检查四个标准的串行端口COM1至COM4。次号码64到67将被分配给这些端口,正如上面所述。
如果你要正确地配置你的串行端口,你应该安装Ted Tso的setserial命令以及rc.serial脚本。这个脚本应该在系统引导启动时从/etc/rc中调用。它使用setserial配置内核的串行设备。一个典型的rc.serial脚本看上去象这样:
# /etc/rc.serial - serial line configuration script.
#
# Do wild interrupt detection
/sbin/setserial -W /dev/cua*
# Configure serial devices
/sbin/setserial /dev/cua0 auto irq skip test autoconfig
/sbin/setserial /dev/cua1 auto irq skip test autoconfig
/sbin/setserial /dev/cua2 auto irq skip test autoconfig
/sbin/setserial /dev/cua3 auto irq skip test autoconfig
# Display serial device configuration
/sbin/setserial -bg /dev/cua*
请参阅setserial附带的文档对其有关参数的解释。
如果你的串行卡没有被检测出来,或者setserial –bg命令显示出设置不正确,你必须通过明确地给出正确的参数值来进行强行的配置。报导称配备有Rockwell芯片的内置modems的用户会碰到这个问题。例如,如果UART芯片被检测出是NSC16450,而实际上它是NSC16550时,你就必须将被错置端口的配置命令改成
/sbin/setserial /dev/cua1 auto irq skip test autoconfig
uart 16550
对COM端口、基地址、以及IRQ的设置有相似的选择操作。请参阅setserial的手册页。
如果你的modem支持硬件握手的话,你必须确信激活了它。令人感到奇怪的是,多数通信程序缺省地并没有试图激活它;因而你必须手工地设置它。这最好使用stty命令在rc.serial脚本中进行操作:
$ stty crtscts < /dev/cua1
要检查硬件握手是否起作用,使用
$ stty –a < /dev/cua1
这将给出那个设备所有标志的状态;如果标志前带有一个减号,如-crtscts,表示这个标志被关闭了。
注释
[1] 可以用[email protected]联系到。
[2] 也有一个NSC16550,但它的FIFO从没有正常工作过。
发布人:netbull 来自:Linux自由鸽