v2.00
作者:Author:Donald Becker
譯者:林嘉翔 c s l i n@ m s 2 . u r l . c o m . t w
這篇短文的目的,是要說明如何設定讓Linux能抓到多張網路卡.
PCI裝置有安全的偵測機制,所以我們只要把合適的偵測準則加入/etc/conf.modules之中:
但有一點須注意:上述方法,是參考我們給予的裝置名稱來決定要載入的驅動程式,但並未指定載入系統後,在系統中所使用的名稱.舉例來說如果僅給予一行 alias eth5 tulip,執行 ifconfig eth5後,就會載入tulip的驅動程式.但如果成功偵測到了網路卡,系統會把他命為"eth0",不是"eth5".
ISA的偵測方式較不安全,我們一定要指定網路卡的I/O位址.如果是多張使用相同驅動程式的網路卡,則必須個別指定每一張卡的I/O位址.以下是一個載入NE2000的驅動程式-'ne',將三張網路卡各指定一個ISA的I/O位址:
對於使用配有內建驅動程式的Linux套件,只要把/etc/lilo.conf的頂端加入這行內容:
然後重新執行'lilo',僅需如此,下次Linux啟動時即可偵測到四張乙太網路卡.("eth0"會一直都存在)
對於如RedHat等使用可載入驅動程式模組的Linux套件,情況反而較複雜些,而且會因套件而有所不同.我們可以從/proc/modules中看是否有'network'這個模組存在,來辨別我們所使用的系統是否為採取驅動程式模組的方式./proc/modules中會列出所有已載入系統的模組.
驅動程式模組可透過兩種方式載入:一為由'kerneld'處理作業系統核心對網路裝置的請求;另一為用'modprobe'嘗試載入每一驅動程式,以找到一正確的裝置.
'kerneld'行程會讀取/etc/conf.modules來決定要載入的驅動程式.
在Linux系統核心的預設狀態下,多數都會偵測系統中是否有存在一乙太網路卡,如果偵測到了,就停止了偵測動作.有三種已定義好的辦法,可以讓系統繼續再偵測電腦裡頭的其他網路卡,依難度與效率之順序為:
第二種方法最適合大部分的使用者,這也是以上我們所描述的方式.
在下面的步驟當中,將假設我們用的是標準的Linux啟動載入程式,LILO.
Linux的核心可辨別出一在啟動時傳遞過來的參數,這些參數大多數是用來指定無法在啟動過程中(boot-time)已先確定的設定.以下是針對網路卡而來,可以被辨識出之參數:
有效的數字型態引數,可用的表示方式有十進位,八進位(引數以'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)的後頭接著輸入,下面是個可偵測四個網路卡的例子 :
如果每次開機都得這樣做,當然會很麻煩,而且未考慮到日後系統無預警重新啟動的情況.我們可以藉由在LILO的設定檔/etc/lilo.conf中增加一行"append"的指令,然後執行lilo來更新設定.
如果可以不需要更改系統的核心程式碼,就能成功設定你的系統,我建議你就這麼做.修改系統核心碼,可不像是做些文字的修改而已,並且會使日後升級時增加一些額外困擾.但還是有少數幾種狀況適合這麼做:
如果你決定了要走這條路,編輯在drivers/net/Space.c中的device list,在裡面加入你需要的值.如果需要增加新的裝置,小心有無考量到 連鎖反應:參考已存在的項目來進行工作.
PCI 介面(以及 EISA介面)的網路卡,可以比較正確安全的被偵測到.所以大部分的PCI裝置驅動程式,可以在不提供額外參數下抓到其支援的網路卡.但在同時支援ISA與PCI介面的驅動程式時例外:NE2000和舊型的 LANCE/PCnet 驅動程式.
v1.2.13版的核心與舊版的 LANCE 驅動程式須要特殊的低層記憶體的 DMA buffers,所以 LANCE 網路卡的偵測動作會在其他網路卡之前,這樣的優點是我們可以忽略對這個區域的偵測,多張的 LANCE 網路卡舊會自動的被偵測到.缺點是舊版的 LANCE 驅動程式不能在 LILO 使用 IRQ 之類的參數.
3c509 有個特殊功能,可以在 ISA 介面下完全的被正確偵測到,這是一個類似 ISA 隨插即用的自動機制.雖然好,但不幸的是與其他的偵測動作無法配合運作.
最常見的問題是難以去辨別網路卡的順序.哪一張該做為第一張,其順序是依照乙太網路卡的實體位址,這表示有最低實體位址之網路卡會被指定成為"eth0",次低的則為"eth1",依 此次序而變.如果"eth0"網路卡移除了,全部的編號將自動往下更動.
有個相關的議題是不可能將一張舊的網路卡保持為關閉狀態,在與 EEPROM 不同設定的 IRQ 或 I/O 位址下啟動一張卡,或者是在特定的位址下啟動一張卡.