Mini-HowTo on using multiple Ethercards with Linux

v2.00


作者:Author:Donald Becker

译者:林嘉翔 c s l i n@ m s 2 . u r l . c o m . t w


这篇短文的目的,是要说明如何设定让Linux能抓到多张网路卡 


  • 1.1简便的方式:驱动程序模块(Driver Modules)
  • 1.2简便的方式:内建的驱动程序
  • 2.1驱动程序模块的详细说明
  • 2.2预先连结之驱动程序的详细说明
  • 3.1特殊情况
  • 3.2采取不同做法的网路卡配接卡
  • 搭配 ISA 界面驱动程序的 PCI NE2000
  • ISA 界面之3c509
  • 1.1 简便的方式:驱动程序模块(Driver Modules)

    PCI drivers

    PCI装置有安全的侦测机制,所以我们只要把合适的侦测准则加入/etc/conf.modules之中:

    alias eth0 tulip alias eth1 tulip 将 'tulip' 用适当的驱动程序名称取代  

    但有一点须注意:上述方法,是参考我们给予的装置名称来决定要载入的驱动程序,但并未指定载入系统后,在系统中所使用的名称 举例来说如果仅给予一行 alias eth5 tulip,执行 ifconfig eth5后,就会载入tulip的驱动程序 但如果成功侦测到了网路卡,系统会把他命为"eth0",不是"eth5" 

    ISA 驱动程序

    ISA的侦测方式较不安全,我们一定要指定网路卡的I/O位址 如果是多张使用相同驱动程序的网路卡,则必须个别指定每一张卡的I/O位址 以下是一个载入NE2000的驱动程序-'ne',将三张网路卡各指定一个ISA的I/O位址:

    /etc/conf.modules: alias eth0 ne alias eth1 ne alias eth2 ne options ne io=0x280,0x300,0x220

    1.2便捷的方式:内建的驱动程序

    对于使用配有内建驱动程序的Linux套件,只要把/etc/lilo.conf的顶端加入这行内容:

    append = "ether=0,0,eth1 ether=0,0,eth2 ether=0,0,eth3"

     然后重新执行'lilo',仅需如此,下次Linux启动时即可侦测到四张乙太网路卡 ("eth0"会一直都存在)

    2.1驱动程序模块

    对于如RedHat等使用可载入驱动程序模块的Linux套件,情况反而较复杂些,而且会因套件而有所不同 我们可以从/proc/modules中看是否有'network'这个模块存在,来辨别我们所使用的系统是否为采取驱动程序模块的方式 /proc/modules中会列出所有已载入系统的模块 

    驱动程序模块可透过两种方式载入:一为由'kerneld'处理作业系统核心对网路装置的请求;另一为用'modprobe'尝试载入每一驱动程序,以找到一正确的装置 

    'kerneld'行程会读取/etc/conf.modules来决定要载入的驱动程序 

    2.2 内建驱动程序:我们做了什么,还有是怎么达成目的的 

    在Linux系统核心的预设状态下,多数都会侦测系统中是否有存在一乙太网路卡,如果侦测到了,就停止了侦测动作 有三种已定义好的办法,可以让系统继续再侦测电脑里头的其他网路卡,依难度与效率之顺序为:

    第二种方法最适合大部分的使用者,这也是以上我们所描述的方式 

    2.3 藉由启动载入程序来传递参数

    在下面的步骤当中,将假设我们用的是标准的Linux启动载入程序,LILO 

    Linux的核心可辨别出一在启动时传递过来的参数,这些参数大多数是用来指定无法在启动过程中(boot-time)已先确定的设定 以下是针对网路卡而来,可以被辨识出之参数:

    ether=,,,,

    有效的数字型态引数,可用的表示方式有十进位,八进位(引数以'0'为开端),或是十六进位(开端是'0x')。非数字型态的第一个引数,是用来对装置名称做命名 空白的引数将被当成 是零,而任何在装置名称前漏掉的引数值则不会做改变 

    IRQ

    这个项目是用来指定我们要设定成的IRQ值(网路卡上,可透过软件更改设定的IRQs),或是必须得使用的IRQ值(透过jumper设定的IRQs)。如果为'0'则表示系统将从网路卡上读取应设定的IRQ值(如果可成功读取 到的话) 或者在网路卡无法提供给系统IRQ时,用自动分配方式得到IRQ值 

    IO-ADDR

    这个项目项是用来指定单一I/O位址,提示给系统做侦测,如果为'0',则提示系统侦测所有合法范围内的I/O位址 一般而言,系统会依照一I/O位址的保留范围列表,来决定是否该位址能被成功侦测  除非有另作指定,包括利用"reserve=,"参数把其他装置的I/O位址排除在侦测范围之中 

    PARAM1,PARAM2

    这几个项目原本是用来指定像 WD8013 等网路卡所须要的共用内存(shared memory)之内存位址,但现在则是用来提供给其他特殊驱动程序所需要的信息 

    NAME

    预先定义的装置名称 系统核心至少定义了"eth0","eth1","eth2",和"eth3" 其他的装置名称(例如:PPP,SLIP,或是携带式的乙太网路装置)也可能存在,不过名称可能会不太一样 

    LILO 提供两种方法,来在启动系统时传递参数给系统核心 最常见的方式是是在指定启动影像(boot image)的后头接著输入,下面是个可侦测四个网路卡的例子 :

    linux ether=0,0,eth1 ether=0,0,eth2 ether=0,0,eth3

    如果每次开机都得这样做,当然会很麻烦,而且未考虑到日后系统无预警重新启动的情况 我们可以藉由在LILO的设定档/etc/lilo.conf中增加一行"append"的指令,然后执行lilo来更新设定 

    append = "ether=0,0,eth1 ether=0,0,eth2 ether=0,0,eth3"

    3.1 修改你的的系统核心

    如果可以不需要更改系统的核心程序码,就能成功设定你的系统,我建议你就这么做 修改系统核心码,可不像是做些文字的修改而已,并且会使日后升级时增加一些额外困扰 但还是有少数几种状况适合这么做:

    如果你决定了要走这条路,编辑在drivers/net/Space.c中的device list,在里面加入你需要的值 如果需要增加新的装置,小心有无考量到 连锁反应:参考已存在的项目来进行工作 

    3.2侦测特殊特定网路卡的说明

    PCI 界面网路卡

    PCI 界面(以及 EISA界面)的网路卡,可以比较正确安全的被侦测到 所以大部分的PCI装置驱动程序,可以在不提供额外参数下抓到其支持的网路卡 但在同时支持ISA与PCI界面的驱动程序时例外:NE2000和旧型的 LANCE/PCnet 驱动程序 

    LANCE/PCnet 网路卡

    v1.2.13版的核心与旧版的 LANCE 驱动程序须要特殊的低层内存的 DMA buffers,所以 LANCE 网路卡的侦测动作会在其他网路卡之前,这样的优点是我们可以忽略对这个区域的侦测,多张的 LANCE 网路卡旧会自动的被侦测到 缺点是旧版的 LANCE 驱动程序不能在 LILO 使用 IRQ 之类的参数 

    ISA 界面的 3c509

    3c509 有个特殊功能,可以在 ISA 界面下完全的被正确侦测到,这是一个类似 ISA 即插即用的自动机制 虽然好,但不幸的是与其他的侦测动作无法配合运作 

    最常见的问题是难以去辨别网路卡的顺序 哪一张该做为第一张,其顺序是依照乙太网路卡的实体位址,这表示有最低实体位址之网路卡会被指定成为"eth0",次低的则为"eth1",依 此次序而变 如果"eth0"网路卡移除了,全部的编号将自动往下更动 

    有个相关的议题是不可能将一张旧的网路卡保持为关闭状态,在与 EEPROM 不同设定的 IRQ 或 I/O 位址下启动一张卡,或者是在特定的位址下启动一张卡 


    Scyld Computing Corporation

    Author:Donald Becker
    The HowTo right-to-copy is given in http://metalab.unc.edu/mdw/HOWTO/HOWTO-INDEX-6.html