常见问题 Kyland/东土工业以太网的常见问题>>

做些什么才能让Linux运行两块以太网卡?

发布时间:2010-12-06 11:52:05

答案:

这个问题的答案取决于驱动程序是否被用做可载入的模块或者直接编译进了内核。大多数Linux发行版本现在都使用模块化的驱动程序。这样就不用发行许多内核,每种内核设置一个不同的内建驱动程序。使用一个单一的基本内核,如果特定用户系统需要,一旦系统启动,就足以从驱动程序模块文件(通常存储在/lib/modules/)中载入个别的驱动程序。

把驱动程序作为模块使用:对于PCI驱动程序,模块通常会自动检测该品牌类型所有安装的网卡。但对于ISA网卡,探寻一个网卡是不安全的操作,因此你需要提供网卡的I/O地址以便模块知道去哪里查找。这一信息存储在文件/etc/conf.modules中。

例如,如果一个用户有两块ISA NE2000网卡,一块在0x300,一块在0x240,它们在/etc/conf.modules文件中显示如下:

alias eth0 ne
alias eth1 ne
options ne io=0x240,0x300

这几行的意义:就是说如果管理员(或内核)进行modprobe eth0或者modprobe eth1,那么为eth0或者eth1载入ne.o驱动程序。此外,在载入ne.o模块时,使用选项io=0x240,0x300,这样驱动程序就知道去哪里寻找网卡。注意0x很重要 - DOS里常用的300h在这里没有用。改变0x240和0x300的顺序会使哪一块物理网卡以eth0和eth1结尾发生改变。

同这个例子一样,大多数ISA模块驱动程序可以接受多个以逗号分隔的I/O值以处理多块网卡。但是,某些(老的?)驱动程序,比如3c501.o模块,目前载入一个模块只能处理一块网卡。这样,要检测两块网卡就必须载入两次该模块。此时,文件/etc/conf.modules将如下所示:

alias eth0 3c501
alias eth1 3c501
options eth0 -o 3c501-0 io=0x280 irq=5
options eth1 -o 3c501-1 io=0x300 irq=7

在此例中,选项-o用来给每个模块实例一个唯一的名字,因为不能用同一个名字载入两个模块。选项irq=也是用来指定网卡设置的硬件IRQ。(此方法也能用于可接受多个以逗号分隔的I/O值的模块,但这样会使模块被不必要地载入两次,降低了效率。)

最后一个例子,假设用户有一块在0x350的3c503网卡和一块在0x280的SMC Elite16 (wd8013)网卡。则应该这样:

alias eth0 wd
alias eth1 3c503
options wd io=0x280
options 3c503 io=0x350

对于PCI网卡,只要用alias语句把ethN接口和相应的驱动程序名联系起来就行了,因为PCI网卡的I/O地址可以被安全地检测到。

可用的模块一般存放在/lib/modules/`uname -r`/net下,这里uname -r命令可以得到内核的版本(比如2.0.34)。你可以在这里看看哪一个驱动程序适合你的网卡。一旦你在conf.modules文件里进行了正确的设置,就可以用下面的方法检查一下:

modprobe ethN
dmesg | tail

这里“N”是你要检测的以太网卡的接口号。

使用编译进内核的驱动程序:如果你需要的驱动程序编译进了内核,那么处理多块以太网卡的接口已经存在了。但缺省情况下只自动检测一块以太网卡。这样就避免了启动时检测敏感网卡可能引起的麻烦。

(注意:在2.1.x之后的内核中,启动检测被分为安全和不安全的两类,所有安全的检测(如对PCI和EISA网卡)可以自动找到所有相关的网卡。在至少有一块ISA网卡的多网卡系统中还需要进行以下的处理。)

有两种方法可以启动对第二块(或第三块等等)网卡的自动检测。最简单的方法是向内核传递启动参数,由LILO完成。使用ether=0,0,eth1这样简单的启动参数就可以完成对第二块网卡的检测。此时按照启动时找到的网卡顺序分配eth0和eth1。假如你想让0x300处的网卡为eth0,而0x280处的网卡为eth1,那么可以使用

LILO: linux ether=5,0x300,eth0 ether=15,0x280,eth1
命令ether=可以接受的参数并不仅限于如上所示的IRQ + I/O + name。请参看传递以太网参数......以了解全部的句法、网卡特定参数和LILO使用技巧。

这些启动参数可以固定,这样就不用每次都必须重新敲一遍。参看LILO手册中有关LILO 的配置选项“append”。

第二种方法(不建议使用)是编辑文件Space.c并用零替换I/O地址中的0xffe0入口。0xffe0入口是用来告诉内核不要检测该设备 -- 把它替换为零就启动了对该设备的自动检测。

注意,如果想用Linux作为两个网络间的路由,你需要启动IP转发并重新编译内核。一般在一台老式的AT/286上运行“kbridge”一类的软件就相当不错了。

如果你是一边在网络冲浪,一边看本文档,最好去阅读Donald的WWW站点上的mini-howto。看一下多块以太网卡.

下一步您可以:
查看Kyland/东土工业以太网产品 >>
查看工业以太网产品 >>
查看Kyland/东土工业以太网常见问题 >>