Linux下網卡驅動安裝及故障排除
網卡是Linux服務器中最重要網絡設備。據統計,Linux網絡故障有35%在物理層、25%在數據鏈路層、10%在網絡層、10%在傳輸層、10%在對話、7%在表示層、3%在應用層。由此可以看出,網絡故障通常發生在網絡七層模型的下三層,即物理層、鏈路層和網絡層。對應于實際網絡也就是使用的網絡線纜、網卡、交換機、路由器等設備故障。Linux的網絡實現是模仿FreeBSD的,它支持FreeBSD的帶有擴展的Sockets(套接字)和TCP/IP協議。它支持兩個主機間的網絡連接和Sockets通訊模型,實現了兩種類型的Sockets:BSD Sockets和INET Sockets。它為不同的通信模型和服務質量提供了兩種傳輸協議,即不可靠的、基于消息的UDP傳輸協議和可靠的、基于流的傳輸協議TCP,并且都是在IP網絡協議上實現的。INET sockets是在以上兩個協議及IP協議之上實現的。
由于交換機、路由器通常獨立于Linux或者其他操作系統。網卡設置故障是造成Linux 服務器故障最主要原因。可能因為硬件的質量或性能、磨損老化、人為誤操作、不正確的網絡設置、管理問題、Linux軟件的BUG、系統受到黑客攻擊和Linux病毒等原因造成。
Linux 服務器網卡故障排除的思路是:應當遵循先硬件后軟件的方法。因為硬件如果出現物理損壞那么如何設定網卡都不能解決故障。解決問題的方法可以從自身Linux計算機的網卡查起,如果確定硬件沒有問題了,再來考慮軟件的設定。
1. 網卡的選擇
一般來說,2.4版本以后的 Linux可以支持的網卡芯片組數量已經很完備了,包括著名廠商如:Intel 以及使用廣泛的 RealTek, Via 等網卡芯片都已經被支持,所以使用者可以很輕易的設定好他們的網絡卡。但是由于Linux發行版本眾多(目前超過188個),使用前最好查看Linux發行版本的文檔。以Redhat Linux 9.0為例,這個設備列表在Ethernet- HOWTO文檔中。另外最直接的方法是查看一個目錄:/lib/modules/release/kernel/drivers/net,其中release是內核版本,可以使用命令:“uname -r”獲得。對于Redhat Linux 9.0是2.4.20-8。
#ls /lib/modules/2.4.20-8/kernel/drivers/net/
3c501.o atp.o eth16i.o ni52.o smc-ultra.o
3c503.o bonding.o ethertap.o ni65.o starfire.o
3c505.o cs89x0.o ewrk3.o ns83820.o strip.o
3c507.o de4x5.o fc pcmcia sundance.o
3c509.o de600.o fealnx.o pcnet32.o sungem.o
3c515.o de620.o hamachi.o plip.o sunhme.o
3c59x.o defxx.o hamradio ppp_async.o tc35815.o
8139cp.o depca.o hp100.o ppp_deflate.o tg3.o
8139too.o dgrs.o hp.o ppp_generic.o tlan.o
82596.o dl2k.o hp-plus.o ppp_synctty.o tokenring
8390.o dmfe.o irda r8169.o tulip
ac3200.o dummy.o lance.o rcpci.o tulip_old
acenic.o e100 lne390.o sb1000.o tun.o
aironet4500_card.o e1000 lp486e.o shaper.o via-rhine.o
aironet4500_core.o e2100.o mii.o sis900.o wan
aironet4500_proc.o eepro100.o natsemi.o sk98lin wavelan.o
amd8111e.o eepro.o ne2k-pci.o skfp wd.o
appletalk eexpress.o ne3210.o slhc.o winbond-840.o
arlan.o epic100.o ne.o slip.o wireless
arlan-proc.o eql.o netconsole.o smc9194.o wireless_old
at1700.o es3210.o ni5010.o smc-ultra32.o yellowfin.o
可以看到這個目錄列出所有Linux內核支持的網絡設備驅動程序。其中大部分是以太網卡(8139、3COM、Intel)。也有一些是其他類型設備。對于初學者應當盡量選擇目錄中已經列出的網卡。注意以.o 后綴結束的文件就是驅動程序。而沒有后綴的是驅動程序目錄(紅色)。
2.檢查網卡是否加載:
驅動硬件是操作系統最基本的功能,操作系統通過各種驅動程序來駕馭硬件設備,和Windows系統不同Linux內核目前采用可加載的模塊化設計(LKMs Loadable Kernel Modules),就是將最基本的核心代碼編譯在內核中,網卡驅動程序是作為內核模塊動態加載的。可以使用命令“lsmod”查看加載情況:
## lsmod
Module Size Used by
dm_mod 54741 0
button 6481 0
battery 8901 0
ac 4805 0
md5 4033 1
joydev 10241 0
uhci_hcd 31065 0
ehci_hcd 30917 0
snd_via82xx 26437 0
snd_ac97_codec 63889 1 snd_via82xx
snd_pcm_oss 49017 0
soundcore 9889 1 snd
tulip 45025 1
via_rhine 23113 2
mii 4673 1 via_rhine
ext3 116809 2
jbd 71257 1 ext3
對每行而言,第一列是模塊名稱;第二列是模塊大小;第三列是調用數。調用數后面的信息對每個模塊而言都有所不同。如果 (unused) 被列在某模塊的那行中,該模塊當前就沒在使用。如果 (autoclean) 被列在某模塊的那行中,該模塊可以被 rmmod -a 命令自動清洗。當這個命令被執行后,所有自從上次被自動清洗后未被使用的被標記了“autoclean”的模塊都會被卸載。叢以上紅色粗體字符可以看到筆者Linux計算機中兩塊網卡模塊:tulip和via_rhine 已經加載。對應的網卡商業型號分別是:
tulip:Lite-On Communications Inc LNE100TX [Linksys EtherFast 10/100]
via_rhine:Via VT6102[Rhine-II] 常見主板集成網卡。
如果沒有檢測到硬件,用硬件檢測程序kuduz檢測網卡,它和Windows中添加新硬件差不多。kudzu程序是通過查看/usr/share/hwdata/目錄下的文件識別各種硬件設備的。如果核心支持該硬件,并且有該驅動程序就可自動裝載。首先說明的是Linux下對網卡的支持往往是只對芯片的,所以對某些不是很著名的網卡,往往需要知道它的芯片型號以配置Linux.比如我的Top link網卡,就不存在Linux的驅動,但是因為它是NE2000兼容,所以把它當NE2000就可以在Linux下用了.所以當你有一塊網卡不能用,在找Linux的驅動程序之前一定搞清楚這個網卡用的什么芯片,跟誰兼容,比如3c509,ne2000等。這樣的型號一般都在網卡上最大的一快芯片上印著,抄下來就是了。對于ISA接口的NE2000卡,先要作的一件事情,是將網卡設定為Jumpless模式.很多現在的網卡缺省 都是PnP模式,這在Windows下的確能減少很多麻煩,但是Linux不支持,所以Linux下必須是Jumpless模式.一般所有網卡都有帶的驅動盤和DOS下可執行的一個設定程序,用該程序將網卡設為 Jumpless。對于PCI網卡,可以使用命令來查看:lspci。在顯示的列表中找到“Ethernet Controller”,記下廠商和型號。然后使用modprobe嘗試加載正確的模塊,比如modprobe 3c509。如果出現錯誤,說明該模塊不存在。這時候你應該找到正確的模塊并且重新編譯。問題一般即可解決。
如果很不幸的,您使用的是比較罕見的一些網卡,或者是 Linux 核心支持不夠的網卡,以致于在安裝 Linux 時,并無法檢測到網卡,那也不用擔心,我們可以使用較為簡單的核心模塊編譯來支持這張網卡。下面以筆者的3Com的3CR990-TX-97 網卡為例(一款具有安全特性網卡)看看如何進行模塊編譯。首先在其網站http://www.3com.com/infodeli/tools/nic/linuxdownload.htm 下載合適你使用內核版本的相關驅動程序,這里以2.4內核為例。
#wegt http://www.3com.com/infodeli/tools/nic/3c990-1.0.0a.tar.gz
另外在開始編譯核心模塊之前,因為驅動程序需要配合核心來編譯,所以會使用到 kernel source 或者是 kernel header 的數據,此外,也需要編譯器 ( compiler ) 的幫助,因此,先確定您的 Linux 系統當中已經下列軟件的存在 :kernel-source 、kernel 、gcc 、make。
#tar zxvf 3c990-1.0.0a.tar.gz
#make
此時會產生3c990.o 驅動模塊。然后使用命令拷貝到相應地方然后查看加載是否正常。
#modprobe 3c990
#cp 3c990.o /lib/modules/2.4.20-8/kernel/drivers/net
# depmod -a
然后使用lsmod 命令檢查加載情況,如果一切正常的話。可以讓系統啟動時自動加載該模塊:
#echo “alias eth0 3c990”>;>; /etc/modules.conf