Linux操作系統下乙太網卡的安裝及配置

火星人 @ 2014-03-09 , reply:0


Linux操作系統以其獨有的開放性、穩定性、高效率等特點,受到越來越多有識之士的青睞.隨著IT產業巨頭紛紛宣布對Linux的支持,Linux正在迅速擴展其應用市場,特別是伺服器市場.在標準上,Linux與POSIX1003.1兼容,但它具有比以住的UNIX系統更合理的內核結構.它的開放性,各種被人們廣泛應用的網路協議都在該系統中得到了實現.目前人們所使用的Linux系統一般是指由Linux核心、外殼(SHELL)及外圍應用軟體構成的發行版本.Linux發行版本是不同的公司或組織將Linux核心、外殼、安裝工具、應用軟體有效捆綁起來的結果,種類繁多,各有各的優缺點.但就其總體而言,這些發行版本具有對儘可能多的網卡的支持.本文僅就RedHat5.1這個特定發行版本下的網卡的選擇、安裝、配置進行討論,希望對於其他發行版本的同樣問題有點借鑒作用.

就象UNIX,Linux支持的網卡主要是乙太網卡.如3COM、ACCTON、AT&T、IBM、CRYSTAL、D-LINK等眾多品牌的乙太網卡只要安裝配置正確,都可以得到你所期望的效果.

一、 Linux中網卡的工作原理

為了將這個問題說明的更清楚一些,不妨先簡要地剖析一下Linux是如何讓網卡工作的.一般來說,Linux核心已經實現了OSI參考模型的網路層及更上層部分.網路層的實現依賴於數據鏈路層的有效工作.網卡的驅動程序就是數據鏈路層與物理層的介面.通過調用驅動程序的發送常式向物理埠發送數據,調用驅動程序的接收常式從物理埠接收數據.

1.網卡驅動程序

簡單地說,要將你手中的網卡利用起來,你唯一要做的是得到這塊網卡的驅動程序.驅動程序提供了面向操作系統核心的介面和面向物理層的介面.

驅動程序的操作系統介面是一些用於發現網卡、檢測網卡參數以及發送接收數據的常式.當驅動程序開始運作時,操作系統調用檢測常式以發現系統中安裝的網卡.如果該網卡支持即插即用,那麼檢測常式應該可以自動發現網卡的各種參數;否則你就要在驅動程序運作前,設置好網卡的參數供驅動程序使用.當核心要發送數據時,它調用驅動程序的發送常式.發送常式將數據寫入正確的空間,然後激活物理髮送過程.

驅動程序面向物理層的介面是中斷處理常式.當網卡接收到數據、發送過程結束,或者發現錯誤時,網卡產生一個中斷,然後核心調用該中斷的處理常式.中斷處理常式判斷中斷髮生的原因,並進行響應的處理.比如當網卡接收到數據而發生中斷時,中斷處理常式調用接收常式進行接收.

2.驅動程序工作參數

驅動程序的工作參數因網卡性質的不同而不同,大致包括I/O埠號、中斷號、DMA通道、共享存儲區等.輸入輸出埠號又被稱為輸入輸出基地址,當網卡工作於埠輸入輸出模式時被使用.埠輸入輸出模式需要CPU的全程干預,但所需硬體及存儲空間要求較低.CPU通過埠號指定的空間與網卡交換數據.中斷號是網卡的中斷序號,只要不與其它設備衝突即可.當網卡使用DMA方式時,它要使用DMA通道批量傳輸數據而不需要CPU的干預.

對於一塊具體的網卡,如果網卡支持完全自動檢測,那麼一個參數也不用指定,驅動程序的檢測常式會自動設定所需參數.一般情況,你需要人工設定這些參數的一部分.如果你的網卡使用埠輸入輸出模式,你要設定埠號和中斷號.如果你的網卡使用DMA模式,你要設定DMA通道和中斷號.如果你的網卡使用共享存儲區的模式,那你就得設定共享存儲區的地址範圍.

3.驅動程序的使用方式

有了網卡的驅動程序后,你可以選擇是把驅動程序加入到Linux核心之中還是把驅動程序加工成獨立模塊.Linux系統一個引人入勝的長處就是可以定製系統的核心.把需要頻繁調用的功能加入系統核心,可以大大提高系統的效率.在這種情況下系統啟動時,系統核心自動載入網卡的驅動程序.驅動程序的參數可以通過LILO命令參數加以指定.系統啟動后驅動程序永久駐留核心,不能用常規的方法將其卸載.至於定製的系統核心,是通過重新編譯得到的;如何編譯核心將在後文敘及.

如果把驅動程序編譯成可裝載模塊,就可以用系統提供的命令在系統啟動后隨時載入.隨時載入的好處是減少內存開銷,易於管理,但同時也犧牲了一點網路傳輸的效率.驅動程序的參數是在命令行中直接輸入或通過配置文件指定.

二、 網卡安裝前的準備

在安裝網卡前,務必檢查是否具備下列條件:

1.硬體方面

●乙太網卡

●網路連接線及連接頭,如10base-T一般為8芯雙絞線配RJ-45介面

2.軟體方面

●Linux操作系統

●網卡驅動程序(目標碼或源代碼)

●*網卡配置程序

●*軟體開發工具,如GNU工具包(包括編譯器gcc、make等)

3.系統配置信息

●可用的埠地址

●可用的中斷號

以上不帶星號標記的是必要條件,帶星號的是視情況不同而要求的條件.具體情況在下面進一步說明.

三、 網卡的安裝及配置

第一步:配置乙太網卡的工作參數

配置網卡就是配置網卡的工作參數,如埠地址、中斷號等.網卡的預設參數一般存儲於網卡內部的EEPROM,這是網卡出廠前設置好的.預設參數在大多數情況下是可行的,但如果這些參數與你的系統有衝突並且網卡又不支持軟體動態設置,那麼你就要使用網卡的設置程序.並不是所有的網卡都要經過這一步,有些網卡支持通過驅動軟體及其輸入參數來確定網卡的工作參數.可以通過查閱網卡使用說明書來確定這一點.

網卡的設置程序與驅動程序不同,設置程序僅僅用來對網卡EEPROM中的設置進行修改.網卡程序本身可能運行在其它操作系統下,如WINDOWS95/98、OS/2、DOS等.如果是非Linux平台,那你就先在適合設置程序運行的系統中安裝網卡,按設置程序說明設置網卡參數.然後再在Linux系統下安裝該網卡.

第二步:安裝Linux系統

假如你將要安裝乙太網卡的Linux系統本身還未安裝,那麼可以先試著在安裝Linux的同時安裝網卡.這一步成功的前提是你的Linux發行版本包含將要安裝的網卡的驅動程序.

運行Linux的安裝程序,按提示進行操作,別忘了安裝核心的網路部分.當進行到LAN配置時,安裝程序會列出它支持的所有網卡的類型.看看你的網卡是否榜上有名.隨著Linux發行版本的不斷升級,目前RedHat 6.0已經覆蓋了常用的網卡類型.如果很幸運地你的網卡恰好在其中,那麼下文討論的很多步驟都可以不必考慮了,安裝程序會自動完成網卡的安裝與驅動.但如果沒找到適用於你的網卡類型,也不必擔心,繼續下一步.

第三步:手工安裝網卡

安裝網卡也就是安裝網卡的驅動程序.網卡要工作要有驅動程序,並且驅動程序越成熟越好.驅動程序一般由網卡的生產或供應商提供.Linux是一個起步不久的新興操作系統,網卡的生產商並不一定提供Linux環境下的驅動程序.這時候你就得從其它途徑想辦法了,比如到INTERNET上專門提供硬體驅動程序的網站查找一下,也可以在新聞組上貼個求助信息.總之,只有得到網卡的驅動程序后,方可進行下一步.

網卡的驅動程序有兩種類型.一是可直接使用的二進位代碼;另一種是驅動程序的源代碼.二進位代碼一般是預先編譯好的可裝載模塊.源代碼可以編譯成可裝載模塊,也可以編譯成系統核心的一部分.如何把源代碼編譯成可裝載模塊不在本文討論之列,具體可以查閱驅動程序的說明書.

1.可裝載模塊的使用

系統提供了一組命令用於將驅動程序模塊載入內存執行.這些命令包括modprobe、insmod、Ismod、rmmod.modprobe 與insmod命令功能相似,但是方式各異.

●modprobe 命令使用配置文件/erc/config.modules來載入可執行模塊.要用 modprobe命令載入乙太網卡的驅動程序,可以在 config.modules文件中加入:

alias eth0 drivermodule (drivermodule是驅動程序模塊的名稱)

這行配置信息把乙太網卡的設備名與驅動程序模塊聯繫起來.modprobe命令依據這條信息,自動載入存放於 /lib/library/xxxx/net目錄下名為 drivermodule.o的模塊.因此要使 modprobe命令找到驅動程序模塊,將該模塊放在 /lib/library/xxxx/net目錄下.

那麼驅動程序的參數如何指定呢?還是使用conf.modules文件.方法是在接著上述配置信息的後面加入下行信息:

options drivermodule parml=valuel,parm2=value2,……

這裡parm1 是驅動程序可以接受的參數名,valuel是該參數值;依次類推.

比如options cs89x0 io=0x200 irq=0xA media=aui

●insmod命令直接通過命令行參數將驅動程序模塊載入內存,並可以在命令中指定驅動程序參數.例如:

insmod drivermodule.o parml=valuel,parm2=value2,……

以上兩個命令中可以使用驅動程序參數要依據具體的網卡及其驅動程序而定,要仔細閱讀網卡及驅動程序的說明書.有的網卡驅動程序可以用這些參數覆蓋網卡本身EEPROM中存儲的參數.有的則使用EEPROM中的參數.有的驅動程序不自動檢測網卡使用的參數,還得把網卡使用的EEPROM中的參數傳給驅動程序.

卸載驅動程序模塊使用rmmod命令:

rmmod drivermodule.o

2.把驅動程序編譯入系統核心

除了以可裝載模塊的形式使用驅動程序,還可以把驅動程序編譯進Linux核心,以獲取更高的效率.這種方式需要驅動程序的源代碼、Linux核心源代碼及其編譯工具.Linux核心的編譯過程包括配置核心、重建依賴關係、生成核心代碼等步驟.配置核心的過程是用系統提供的配置工具(make config 或make menuconfig)重新生成用來編譯核心的眾多make文件的過程.為了讓核心的配置工具了解你的網卡驅動程序,你需要修改一些核心的配置文件.

(1)修改配置文件:主要修改核心源代碼目錄下的四個文件,即drivers/net/CONFIG文件、drivers/net/Config.in文件、drivers/net/Makefile 文件和drivers/net/Space.c文件.CONFIG和Config.in文件用於控制核心配置工具(make config 或make menuconfig)的運行,主要是加入關於是否包括該網卡的支持提示.Makefile 和Space.c文件用於編譯核心代碼並說明面向核心的介面.詳細語句參見下面例子.

(2)運行核心配置工具:在核心源代碼目錄下執行make config或 make menuconfig命令. make config是面向命令行的,通過逐句回答提問來配置核心.其在配置過程中不可改變或撤消以前的回答,故多有不便.make menuconfig 則是通過窗口菜單方式,使用起來很方便.就本文而言,你只要在上一步中正確修改了配置文件,那麼在config中會出現是否需要該網卡支持的提問,你選擇『y』.或者在menuconfig中的 network菜單中出現表示該網卡的菜單項,把它選上即可.

(3)重建依賴關係:很簡單,執行make dep和make clean命令.

(4)生成核心代碼:執行make zImage 命令.這個命令開始真正編譯核心代碼,並把核心代碼存放為arch/i386/boot 目錄下的zImage.

(5)為了使用新的核心代碼,你需要用新的核心代碼替換原有的.原有的核心代碼一般存放在/boot 目錄下,文件名稱類似於vmlinuz-v.s.r-m (v.s.r-m)表示核心的版本號).如vmlinuz-2.0.34-1.執行下列命令:

cp arch/i386/boot/zImage /boot/vmlinuz-v.s.r-m

為了安全起見,可以先把原有的核心代碼做個備份,以便發生錯誤時恢復.

至此,你可以重新引導系統以使用新的帶有正確網卡驅動支持的Linux核心.唯一剩下未解決的是驅動程序的參數問題.有些網卡驅動程序如果不輸入參數,那它工作就會不正常,甚至根本不工作.現在網卡的驅動程序是系統啟動時由核心載入運行的,系統啟動之後用戶就很難改變這些參數了,在系統啟動時告訴Linux核心網卡驅動程序使用的參數.具體方法有兩種:

(1)在系統引導程序LILO中輸入.

在LILO開始引導系統時,用ether子命令設定乙太網卡驅動程序的參數.ether命令的使用方式為:

LILO:linu xether=IRO.BASE_ADDR,NAME

這裡帶下劃線的是要輸入的部分,IRQ表示中斷號,BASE_ADDR表示埠號,NAME表示網卡的設備名.例如:linux ether=15,0x320,eth0

(2)在LILO配置文件中設定.

每次在系統啟動時再輸入驅動程序參數似乎有點過於麻煩.幸好系統提供了LILO的配置文件可以用來永久性的設置Linux系統啟動時的子命令.方法是在/etc/lilo.conf文件中的適當位置加入以下一行:

append=「ether=IRQ, BASE_ADDR,NAME」

這裡帶下劃線部分的意義同上.加入這一行后,還需要用/sbin/lilo命令把這個配置寫入引導程序.

第四步:網路配置及測試

安裝完網卡就可以配置網路通信了.配置網路簡單地就是使用ifconfig命令,

例如:

ifconfig eth0 1.2.3.4 netmask 255.0.0.0 up

ping一下網上其它機器的ip地址,檢查網路是否連通.

四、一個乙太網卡安裝實例

下面以Cirrus公司生產的Crystal CS8920乙太網卡為例,詳細說明上述安裝配置過程.本例中,有些命令參數,如核心源代碼目錄等,是以我使用的系統環境為出發點.具體應用中還要加以本地化.為了更接近實際,例子中也包括了對安裝中碰到的問題的描述.

1.此網卡是IBM PC機的內置式網卡,機器只提供了Windows95/98環境下的驅動程序.RedHat 5.0發行版本尚未提供對此網卡的直接支持,從Cirrus的站點上找到並下載了該網卡驅動程序的Linux版本,是一個名為Linux102_tar.gz的壓縮文件.

2.文件Linux102_tar.gz解壓后包括五個文件.包括源代碼,僅適用於Linux 2.0版本的目標模塊以及readme文件.

3.查閱readme文件后,了解到這個驅動程序只能使用網卡EEPROM中設定的埠號(I/O基地址)、中斷號.為了知道網卡EEPROM的設置,又從Cirrus站點下載了該網卡DOS版本的設置程序setup.exe

4.在DOS中運行setup.exe,發現網卡的起始埠號為0x360,中斷號為10,與別的設備有衝突.選擇setup.exe程序的相應菜單,把中斷號改成5.另外,此驅動程序不支持plug and Play,故也在setup.exe中將網卡的PnP功能屏蔽掉.

5.我所使用的RedHat 5.0的Linux核心版本為2.0.34,不能用現成的驅動程序目標模塊,需要自己動手編譯.如上文所述,有兩種方式使用此驅動程序.

6.如果要編譯成獨立模塊,執行下列命令:

gcc -D_KERNEL_-I/usr/src/linux/include -I/usr/src/linux/net/inet-Wall -Wstrictprototypes -02 -fomit-frame-pointer -DMODULE -DCONFIG_MODVERSIONS -ccs89x0.c

編譯結果是名為cs89x0.o的驅動程序目標模塊.要裝載此驅動程序,輸入下列命令: insmod cs89x0.o io=0x360 irq=10

要卸載此驅動程序,用rmmod命令:

rmmod cs89x0.o

7.如果要將驅動程序編進系統核心,

修改/usr/src/linux/drivers/net/CONFIG,加入:

CS89x0_OPTS=

修改/usr/src/linux/drivers/net/Config.in,加入:

tristate『CS8920 Support』CONFIG_CS8920

以上兩行是為了讓make config在配置過程中詢問是否增加CS8920網卡的支持.修改/usr/src/linux/drivers/net/Makefile加入:

ifeq((CONFIG_CS8920),y)

L_OBJS+=cs89x0.o

endif

修改/usr/src/linux/drivers/net/Space.c,加入:

extern int cs89x0_probe(struct device *dev);

……

#ifdef CONFIG_CS8920

&& cs89x0_probe(dev);

#endif

以上兩段是為了編譯並輸出網卡驅動程序及其常式.

把驅動程序源代碼拷到/usr/src/linux/drivers/net目錄下.

在/usr/src/linux目錄下執行 make config或 make menuconfig,選擇核心CS8920網卡支持.

執行make dep、make clean命令.用 make zImage 編譯Linux核心.

如何設置核心驅動程序參數,上節已有說明,不再贅述.

六、結束語

與其它外設一樣,乙太網卡種類繁多,對於新興的操作系統Linux來說,是否能夠有效地支持這些設備,直接關係著Linux的發展前途.本文敘述的乙太網卡安裝配置只是其中的一小部分,未盡事宜希望與有識之仕共同探討.




[火星人 via ] Linux操作系統下乙太網卡的安裝及配置已經有83次圍觀

http://www.coctec.com/docs/linux/show-post-55707.html