Linux网络管理员手册(3)
2000-07-28 13:14
发布者:netbull 阅读次数:3095
翻译:赵炯
gohigh@shtdu.edu.cn
第三章 配置网络硬件
3.1 设备、驱动程序等等
直到现在,我们已经讨论了许多有关网络接口以及一般TCP/IP问题,但是并没有真正地包括当内核中的“网络代码”访问一个硬件时会确切地发生什么事情。对此,我们将简要地讨论一下有关接口和驱动程序的概念。
当然,首先是硬件本身,例如一块以太网卡:这是一块环氧树脂板,上面散布着许多有着糊涂数字的很小的芯片,这块板插在你的PC机的一个插槽中。这就是我们通常所称的设备。
为了让你能够使用这块以太网卡,你的内核中必须含有一些特殊函数,这些函数知道如何访问这个设备的特定方法。这些就是所谓的设备驱动程序。例如,Linux有几种以太网卡牌子的设备驱动程序,它们在功能上很相似。它们以“Becker系列驱动程序”而知名,与它们的作者同名,唐纳德贝克(Donald Becker)。另一个例子是处理连接至并行口的D-Link 袖珍适配器的D-Link驱动程序。
但是,当我们说一个驱动程序“处理”一个设备是什么意思呢?让我们回到上面讨论的以太网板卡上。驱动程序必须能够与外围设备板上的某些逻辑电路通信:它必须往板卡上发送命令和数据,而板卡应该能够传递任何收到的数据给驱动程序。
图3.1 驱动程序、接口、以及硬件之间的关系。
在PC机中,通信是通过映射到板卡上的寄存器等的I/O存储器(内存)进行的。内核发送到板卡上的所有命令和数据都要经过这些寄存器。I/O存储器通常是用给定的开始地址或基地址(base address)来描述的。以太网板卡的典型基地址是0x300,或0x360。
通常,你不用担心有关基地址之类的任何硬件问题,因为内核会在引导时试图检测到板卡上基地址的位置。这称为自动探测(autoprobing),它意味着内核读取几个存储器位置并且将读取的数据与如果安装了某个以太网卡所应有的数据作比较。然而,有些以太网卡不能够自动地被检测出来;当使用其它生产厂商的不是完全按照标准板卡复制的便宜的以太网板卡时有时就会碰到这种情况。同样,在引导时,内核将只试图检测一块以太网设备。如果你使用了不止一块网卡,你就必须明确地将这块网卡告知内核。
你必须告诉内核的另一个这样的参数是中断请求通道(interrupt request channel)。当硬件部件需要得到照料时,常常中断内核的操作,例如,当数据来到时、或者一个特殊情况发生时。在一台PC机中,中断可以发生在15个中断通道之一上,编号从0、1、以及3到15。分配给一个硬件部件的中断号被称为是中断请求号(interrupt request number),或IRQ。[1]
正如第二章中所述,内核是通过一个所谓的接口访问一个设备的。接口提供了一个对于所有硬件类型都一样的抽象的函数(功能)集,比如发送或接收一个数据报。
接口是通过名字识别的。这些名字是在内核里定义的,而不是在/dev目录下的设备文件中定义的。对于以太网接口来说,典型的名字有eth0、eth1等等。对设备的接口分配通常依赖于配置设备次序;例如,第一块安装的以太网卡将成为eth0,下一个将成为eth1,等等。这个规则的一个例外是SLIP接口,它是动态分配的;也即,无论何时只要建立了一个SLIP连接,就为该串行端口分配一个接口。
图3.1中给出的图片试图显示出硬件、设备驱动程序以及接口之间的关系。
当引导时,内核会显示出检测到什么设备,以及它安装了什么接口。下面是一个典型引导屏幕的摘录:
.
.
This processor honours the WP bit even when in supervisor mode. Good.
Floppy drive(s): fd0 is 1.44M
Swansea University Computer Society NET3.010
IP Protocols: ICMP, UDP, TCP
PPP: version 0.2.1 (4 channels) OPTIMIZE_FLAGS
TCP compression code copyright 1989 Regents of the University of California
PPP line discipline registered.
SLIP: version 0.7.5 (4 channels)
CSLIP: code copyright 1989 Regents of the University of California
Dl0: D-Link DE-600 pocket adapter, Ethernet Address: 00:80:C8:71:76:95
Checking 386/387 coupling… Ok, fpu using exception 16 error reporting.
Linux version 1.1.11 (okir@monad) #3 Sat May 7 14:57:18 MET DST 1994
这表明内核是在TCP/IP激活的状态下编译的,并且包括了SLIP、CSLIP和PPP的驱动程序。倒数第三行说明检测到一个D-Link袖珍适配器,并作为接口dl0安装了。如果你有一块不同类型的以太网卡,内核通常将打印出以eth0开始的一行信息来,接下来是所检测到的卡的类型。如果已经安装了一块以太网卡,但是没有看到任何这样的消息,这表示内核不能正确地检测出你的网卡。这将在稍后的小节中加以讨论。
3.2 内核的配置
大多数的Linux版本带有引导启动盘,它可以在所有普通PC机类型的硬件上使用。这表明在那些盘片上的内核,配置进了所有种类的驱动程序,其中一些你永远不会用到,但是它们却会浪费宝贵的系统内存,因为部分内核是不能被交换出去的。因此,你通常将配置你自己的内核,只包括那些你实际需要或想要的驱动程序。
当运行一个Linux系统时,你应该熟悉内核的建立。这个工作的基本原理在Matt Welsh的“安装与入门”手册中作出了解释,这本手册同样也是文档计划系列中的一本。因此,在本节中,我们将只讨论那些影响网络的配置选项。
当运行make config时,你首先将被问及一些普通配置,例如你是否需要内核数学仿真,等等。这些询问之一是问你是否要TCP/IP网络支持。你必须用y作答以得到一个支持连网的内核。
3.2.1 Linux 1.0及以上版本的内核选项
在普通选项部分完成以后,配置将继续进行询问你各种特性,如SCSI驱动程序等等。随后列出了与网络支持有关的问题。由于正在进行中的研制开发,确切的配置选项集是在不停的变动中。大多数1.0到1.1内核版本所提供的一个典型的选项列表看上去象这样(注解用斜体给出):
*
* Network device support
*
Network device support? (CONFIG_ETHERCARDS) [y]
不管方括号中宏名字(macro name)是什么,如果你想要使用任何类型的连网设备的话,你就必须用y回答这个问题,而不管这是否是以太网、SLIP、或PPP。当用y回答这个问题时,对以太网类型设备的支持是自动激活的。对其它网络驱动程序类型的支持必须分别进行激活:
SLIP (serial line) support ? (CONFIG_SLIP) [y]
SLIP compressed headers (SL_COMPRESSED) [y]
PPP (point-to-point) support (CONFIG_PPP) [y]
PLIP (parallel port) support (CONFIG_PLIP) [n]
这些问题涉及到Linux支持的各种链路层协议。SLIP使得你能够在串行线路上传输IP数据报。压缩首部选项提供了对CSLIP的支持,一种将TCP/IP首部压缩成只有三个字节的技术。这个内核选项不会自动打开CSLIP,这仅仅为它提供所需的内核函数。
PPP是另外一种在串行线路上传输网络通信量的协议。它比SLIP更灵活,而且并不限于IP,一旦开发完成也将支持IPX。由于PPP的支持只是在最近才完成,这个选项可能没有出现在你的内核中。
PLIP提供了在并行端口连接上发行IP数据报的方法。它主要是用于与运行DOS的PC机进行通信。
下面的问题涉及到各个供应商的以太网卡。随着更多的驱动程序开发出来,你很可能看到更多的问题被加入这部分。如果你想建立一个能用于许多不同机器上的内核,你可以激活不止一个驱动程序。
NE2000/NE1000 support (CONFIG_NE2000) [y]
WD80*3 support (CONFIG_WD80x3) [n]
SMC Ultra support (CONFIG_ULTRA) [n]
3c501 support (CONFIG_EL1) [n]
3c503 support (CONFIG_EL2) [n]
3c509/3c579 support (CONFIG_EL3) [n]
HP PCLAN support (CONFIG_HPLAN) [n]
AT1500 and NE2100 (LANCE and Pcnet-ISA) support (CONFIG_LANCE) [n]
AT1700 support (CONFIG_AT1700) [n]
DEPCA support (CONFIG_DEPCA) [n]
D-Link DE600 pocket adaptor support (CONFIG_DE600) [y]
AT-LAN-TEC/RealTek poket adaptor support (CONFIG_ATP) [n]
*
* CD-ROM drivers
*
…
最后,在文件系统部分中,配置脚本将询问你是否需要支持NFS,网络文件系统。NFS可以让你输出文件系统到几个主机上,这使得文件显现出好象它们是在主机的一个普通硬盘上一样。
NFS filesystem support (CONFIG_NFS_FS) [y]
3.2.2 Linux 1.1.14及以上版本的内核选项
从Linux 1.1.14开始,(其中加入了对IPX的alpha支持),配置过程稍有改变。在普通选项部分中现在会问你是否需要通用的网络支持。这问题后立刻就是几个各种连网选项问题。
*
* Networking options
*
TCP/IP networking (CONFIG_INET) [y]
为了使用TCP/IP网络,你必须用y回答这个问题。然而,如果你回答n,你将仍能够编译出支持IPX的内核。
IP forwarding/gatewaying (CONFIG_IP_FORWARD) [n]
你必须激活这个选项,如果你的系统将在两个以太网之间、或在任何以太网与SLIP链路等之间作为网关运行的话。尽管缺省地激活这个选项并无害处,你也许想要禁用这个选项以配置主机成为一个所谓的防火墙(firewall)。防火墙是连接两个或多个网络的主机,但并不在网络之间路由通信量。它们通常是用于为公司网络的用户以对内部网最小的危险性提供Internet的访问。用户将被允许登录到防火墙并且使用Internet服务,但公司的机器将受到从外界攻击的保护,因为任何进入的连接都不能通过防火墙。
*
* (it is safe to leave these untouched)
*
PC/TCP compatibility mode (CONFIG_INET_PCTCP) [n]
这个选项用于弥补与某些PC/TCP版本的不兼容性,一个用于基于DOS的PC机上的TCP/IP商业版本。如果你激活这个选项,你将仍然能够与正常的机器通信,但在慢连接上性能可能将受到影响。
Reverse ARP (CONFIG_INET_RARP) [n]
这个功能将激活RARP,逆向地址解析协议。RARP被用于无盘客户以及X终端,即用于在引导时查询它们的IP地址。只有在你计划想要为这些客户服务时才激活这个选项。最新的网络工具包(net-0.32d)中包括一个小工具名字为rarp,它允许你将系统加到RARP缓冲中。
Assume subnets are local (CONFIG_INET_SNARL) [y]
当通过TCP传送数据时,内核必须在递送给IP之间将数据流分割成几个信息包。对于通过本地网络,如以太网,就能到达的主机,将使用大的信息包,而对于要通过很长距离连接的主机则使用稍小一些的信息包。[2] 如果你不激活SNARL,内核将假设只有实际上有接口连接的网络才是本地的。然而,如果你考虑Groucho Marx大学的B类网络,那么整个B类网络是本地的,但是,大多数主机只有一个或两个子网接口。如果你激活SNARL,内核将会假设当谈及校园网上的主机时所有的子网都是本地的并且都使用大的信息包。
如果你确实想使用最大包长度更小一些的包来传送数据到特殊的主机(例如,因为数据要经过SLIP连接),你可以使用route的mtu选项来做到,这在本章结束部分将概要讨论之。
Disable NAGLE algorithm (normally enabled) (CONFIG_TCP_NAGLE_OFF) [n]
Nagle规则一个启发式的避免发送特别小的IP包,也成为微型报(tinygrams)。微型报通常是由交互式的网络工具创建的,它通常只传送单个击键,比如象telnet或rsh。微型报在低带宽的连接上,如SLIP,可能会变得特别浪费。Nagle算法试图在某些情况下暂时抑制TCP数据的传输来避免这个问题。你只有在遇到严重的信息包丢失问题时才禁用Nagle算法。
The IPX protocol (CONFIG_IPX) [n]
这激活了对IPX的支持,--用于Novell网络的传输协议。这个功能仍在开发中,至今并没有什么用。使用它的好处是某一天你可以与基于IPX的DOS实用程序交换数据,并且通过一个PPP链接在基于Novell的网络之间路由通信量。对Novell网络高层协议的支持还没有眉目,因为这些协议的说明书只有付出可怕的高价并且在不能泄露的协议下才能得到。
从1.1.16内核开始,Linux支持另外一种驱动程序类型,虚拟[伪](dummy)驱动程序。下面的问题出现在设备驱动程序节的开始部分。
Dummy net driver support (CONFIG_DUMMY) [y]
虚拟驱动程序实际上并没有做很多事情,但对于单机(不连网的)或是SLIP主机来说是很有用的。它基本上是一个伪装的回送接口。要有这类接口的原因是在有SLIP而没有以太网的主机上,你要有一个一直负担你的IP地址的接口。这将在第五章的虚拟接口一小节中进行进一步的讨论。
3.3 Linux网络设备一览
Linux内核支持许多各种设备类型的硬件驱动程序。这一节给出了现有驱动程序族的一个简要概述,以及它们所使用的接口名称。
在Linux中,接口有许多标准名称,现列在下面。许多驱动程序支持多个接口,在这种情况下,接口被编上了号,就如eth0、eht1等等。
lo 本地回送接口。它用于测试目的,以及几个网络程序。它工作起来象一个闭合电路,任何发送给它的数据报将被立即返回给主机的网络层。在内核中总有一个回送设备,并且有几个或多个几乎是没有意义的。
ethn 第n个以太网卡。这是大多数以太网卡的普通接口名。
dln 这些接口访问D-Link DE-600袖珍适配器,是另一种以太网设备。它有一个特别之处,就是DE-600是通过并行口驱动的。
sln 第n个SLIP接口。SLIP接口以他们被分配给SLIP的次序,与串行线路相关;例如,配置成SLIP的第一条串行线路成为sl0,等等。内核最多支持四个SLIP接口。
PPPn 第n个PPP接口。正如SLIP接口。一个PPP接口是与一条转换成PPP模式的串行线路相关联的。目前,最多支持四个接口。
plipn 第n个PLIP接口。PLIP在并行线上传输IP数据报。同时可以支持三个PLIP接口。它们在系统引导启动时由PLIP驱动程序分配,并且被映射到并行端口上。
对于将来可能要加进来的其它接口驱动程序,象ISDN、或AX.25,将引进其他名称。IPX的驱动程序(Novell的网络协议),以及AX.25(用于业余无线电爱好者)正处于开发阶段,仍处于alpha阶段。
在下面的部分中,我们将讨论使用上述驱动程序的细节。
3.4 以太网的安装
目前的Linux网络代码支持各种牌子的以太网卡。绝大多数的驱动程序是由Danald Becker(becker@cesdis.gsfc.nasa.gov)编制的,他为基于国家半导体-8390芯片的网卡编制了一族的驱动程序;这些已经作为Becker系列驱动程序而知名。还有几个D-Link的产品的驱动程序,在其中,D-Link的袖珍适配器允许你通过一个并行端口访问一个以太网。这个驱动程序是由Bjørn Ekwall (bj0rn@blox.se)编制的。DEPCA驱动程序是由David C. Davies(davies@wanton.lkg.dec.com)编制的。
3.4.1 以太网电缆
如果你是平生第一次安装以太网的话,这里有关电缆连接的几句话也许是比较合适的。以太网连网对电缆是十分挑剔的。电缆的两端必须用50欧姆的电阻端接,而且不能有任何分支(也即,三根电缆连成星型)。如果你使用细同轴电缆和T型BNC接头,这些接头必须直接旋在网卡的接头上;你不能在其中插入一段电缆。
如果你连接到粗电缆网上,你必须通过一个收发器将主机连在网上(有时称作以太网附件单元)。你可以直接将收发器插入网卡的15针AUI端口上,但也可以使用一屏蔽电缆。
3.4.2 支持的板卡
在以太网HOWTOS中有已支持板卡的一个完整的列表,由Paul Gortmaker每月投递到comp.os.linux.announce上来。[3]
下面是Linux所支持的广为所知的板卡一张列表。在HOWTO中列表的实际长度大约有这个的三倍长。然而,即使你在这张列表中找到了你的网卡,还是要首先检查HOWTO文档;因为有时候它包括对这些网卡操作的重要的详细资料。一个相关的场合是某些基于DMA的以太网卡使用与Adaptec 1542 SCSI控制器的缺省DMA通道相同的DMA,此时该以太网卡会将信息包数据往你的硬盘上乱写一气,使你神经紧蹦!
3Com EtherLink 3c503和3c503/16两者都支持,同样也支持3c507和
3c509。也支持3c501,但它太慢了,不值得去购买。
Novell Eagle NE1000和NE2000,以及各种各样的仿制品。也支持NE1500
和NE2100。
Western Digital/SMC WD8003和WD8013(与SMC Elite和SMC Elite
Plus相同)两者都支持,同样支持新的SMC Elite 16 Ultra。
Hewlett Packard HP 27252,HP 27247B,和HP J2405A。
D-Link DE-600袖珍适配器,DE-100,DE-200,和DE-220-T。对
DE-650-T还有一个补丁程序,这是一个PCMCIA卡[4]。
DEC DE200(32K/64K),DE202,DE100,和DEPCA rev E。
Allied Teliesis AT1500和AT1700。
要在Linux中使用这些网卡中的一块,你可以从主要Linux发行版中使用一个预编译的内核。通常这些驱动程序都被编译进了内核。就长远观点来说,最好配置你自己的内核并且仅将你实际所使用的驱动程序编译进内核。
3.4.3 以太网卡的自动检测(探测)
在引导时,以太网程序代码将试图定位你的网卡并确定它的类型。网卡是以下面的地址和顺序进行检测的。
Board Addresses probed for
WD/SMC
SMC 16 Ultra
3c501
3c503
NEx000
HP
DEPCA 0x300, 0x280, 0x380, 0x240
0x300, 0x280
0x280
0x300, 0x310, 0x330, 0x350, 0x250,
0x280, 0x2a0, 0x2e0
0x300, 0x280, 0x320, 0x340, 0x360
0x300, 0x320, 0x340, 0x280, 0x2C0,
0x200, 0x240
0x300, 0x320, 0x340, 0x360
自动检测代码存在两个局限性。第一,它不能够正确地识别出所有的网卡。尤其是对于那些非常便宜的刻隆(仿制)出来的大路货板子会识别不出来。有些WD80x3板子也检测不出来。第二个问题是内核此时不能自动检测多于一块的网卡。这是一个特色,因为内核假设你想控制哪一块卡被分配哪一个接口。
如果你正在使用多块网卡,或者自动检测没有检测出你的网卡,你必须把网卡的基地址和名称明确地告知内核。
在Net-3中,你可以有两种不同的方案来完成这个操作。一个方法是在内核原代码的包括所有有关驱动程序信息的drivers/net/Space.c文件中更改或增加信息。只有你是很熟悉网络代码时才推荐使用这个方法。更好的方法是在系统引导时给内核提供这些信息。如果你用lilo启动你的系统,你可以在lilo.conf中通过使用append选项指定这些参数来传递给内核。为了通知内核有关一个以太网设备,你可以传递以下的参数:
ether=irq, base_ addr, param1, param2, name
前四个参数是数字型的,而最后一个是设备名。所有数字型的值都是可选的;如果省略或被置零,内核将会试着去探测这些值,或使用一缺省值。
第一个参数设置分配给设备的IRQ。默认地,内核将自动探测设备的IRQ通道。3c503驱动程序有一个特殊的特性,它可以从5、9、3、4中断中选择一个未用的IRQ,并配置网卡使用这个中断。
Base_addr参数给出网卡的I/O基地址;零值表示要内核探测列于上面的地址。
剩余的两个参数对不同的驱动程序有不同的用途。对于共享内存的板子,如WD30x3,它们指定共享内存区域的起始和终了地址。其它的网卡通常使用param1来设置要显示的调试信息的级别。值1到7表示逐步增加显示信息的长度,而8却是关闭所有信息的显示;0表示使用缺省值。3c503使用param2来选择内部收发器(默认的)或一个外部收发器(置为1)。前者使用板上的BNC接头;后者使用板上的AUI端口。
如果你有两块以太网卡,你可以让Linux自动检测一块,而用lilo来传递第二块板的参数给内核。然而,你必须确信驱动程序没有意外地首先发现第二块板子,否则的话另一块网卡将完全不会被登记了。可以通过给lilo加上一个reserve选项,该选项明确地告知内核避免检测由第二块网卡所占用的I/O空间。
例如,为了让Linux将第二块以太网卡作为eth1安装在0x300,你应该将下面的参数传给内核:
reserve=0x300, 32 ether=0, 0x300, eth1
reserve选项确定当检测某个设备时,没有设备驱动程序会访问这个板子的I/O空间。你也可以使用内核参数来覆盖对eth0的自动探测。
Reverse=0x340, 32 ether=0, 0x340, eth0
为了完全关闭自动检测,你可以指定base_addr为-1:
ether=0, -1, eth0
3.5 PLIP驱动程序
PLIP代表并行线路IP(Parallel Line IP),并且当你只想连接两台机器时,这是一个廉价的方法。它使用一个并行端口和一个特殊的电缆,能达到10kBps至20kBps的速率。
PLIP最初是由Crynwr公司开发的。它的设计是相当直率的(ingenuous)(或者说是有创造性的):长期以来,PC机上的并行端口只用来作为单向打印机端口;也即,8根数据线只能用来从PC机向外设发送数据,而不是反向使用。PLIP通过使用端口的五根状态线作为输入来达到目的,这限制了它只能以半个字节(half bytes)来传输所有的数据。这个操作模式称为模式零PLIP。今天,这些单向端口不再被广泛使用了。因此,还有一个PLIP扩展称为模式1,它使用了全8比特的 接口。
目前,Linux只支持模式0。不象早期版本的PLIP代码,它现在试图与Crynwr的PLIP实现、以及NCSA telnet中的PLIP驱动程序相兼容。[5] 为了用PLIP连接两台机器,你需要一根特殊的电缆,在某些商店里作为“Null Printer”或“Turbo Laplink”出售的电缆。然而,你可以很容易地自己做出一根来。附录A示出了如何制作。
Linux的PLIP驱动程序几乎是无数人的工作结果。它目前由Niibe Yutaka维护。如果把它编译进内核,它就会为每个可能的打印机端口设置一个网络接口,plip0相应于并行端口lp0、plip1相应于lp1等等。目前接口到端口的映射是这样的:
Interface I/O Port IRQ
plip0
plip1
plip2 0x3BC
0x378
0x278 7
7
5
如果你已经将你的打印机配置成了不同的方式,你就必须改变在Linux 内核原代码drivers/net/Space.c中的值,并建立一个新内核。
然而,这个映射并不是说你就不能象通常一样使用这些并行端口了。仅当相应的接口被配置成那样,它们才会被PLIP驱动程序访问。
3.6 SLIP和PPP驱动程序
SLIP(串行线路IP)(Serial Line IP),和PPP(点对点协议)(Point-to-Point Protocol)是一种在串行线路链接上传输IP-信息包的广泛使用的协议。许多机构提供SLIP和PPP拨号访问到互连网上的机器中,这样,为个人提供了IP连通性(这是用别的方法很难做到的)。
为了运行SLIP或PPP,无需修改硬件;你可以使用任何一个串行端口。由于串行端口的配置是与TCP/IP连网无关的,因此将在独立的章节中专门讨论之。详细信息请参见第四章。
注释
[1] IRQs 2和9是相同的,因为PC机有两个层叠的中断处理器,每个处理器有八个IRQs;第二个处理器连接在第一个处理器的IRQ-2上。
[2] 这是为了避免具有很小最大包长度的连接产生的碎片。
[3] 可以用gpg109@rsphysse.anu.edu.au联系到Paul。
[4] 它可以从tsx-11.mit.edu的packages/laptops上得到,连同其它一些与便携机有关的软件。
[5] NCSA telnet是DOS的一个流行程序,在以太网上或PLIP上运行TCP/IP,并且支持telnet和FTP。
来源:Linux自由鸽