标签:
无标签
HOWTO:Linux Ethernet
by Paul Gortmaker
轉為 Wiki: Ping (ping 'at' pingyeh 'dot' net), 2003 年 11 月 27 日
本文為以太網-HOWTO,匯集了有關哪些以太網裝置可以用于Linux,以及如何進行設置的信息。請注意本文側重于以太網卡的硬件與底層驅動方面的內容,并未涵蓋諸如ifconfig和route等軟件方面的問題。對于那些問題,請參閱Network-HOWTO。
目录
- 導言
- 本文檔的新版本
- 以太網-HOWTO的用法
- 幫幫我──網卡沒反應!
- 網卡應該支持的電纜類型
- 常見問題
- 該為Linux買什么網卡?
- Alpha驅動程序──獲取與使用
- 一台機器使用多個以太網卡
- 這個以太東東不干活。為什么?
- NE1000/NE2000網卡(及其兼容卡)的問題
- SMC Ultra/EtherEZ和WD80*3網卡的問題
- 3Com網卡的問題
- 非特定網卡的FAQ。
- Linux與ISA的即插即用以太網卡。
- 啟動時沒有檢測到以太網卡。
- ifconfig報告了錯誤的網卡I/O地址。
- PCI機器探測到了網卡,但驅動程序檢測失敗。
- PCI機器里的共享內存ISA網卡不工作(0xffff)
- 網卡看來在發送數據,但沒有收到過數據。
- 異步傳輸模式(ATM)支持
- 吉比特以太網支持
- FDDI支持
- 全雙工支持
- SMP機器上的Linux以太網卡
- Alpha/AXP PCI板上的Linux以太網卡
- SUN/Sparc硬件上的Linux以太網卡。
- 其它硬件上的Linux以太網卡。
- 不使用Hub連接10/100BaseT
- SIOCSIFxxx: No such device
- SIOCSFFLAGS: Try again
- 使用“ifconfig”得到的連接為UNSPEC,而硬件地址是00:00:00:00:00:00
- 大量的RX和TX錯誤
- /dev/下的以太網卡入口
- Linux與“trailers”
- 訪問原始以太網設備
- 性能小技巧
- 一般概念
- ISA網卡和ISA總線速度
- 設置TCP的Rx窗口
- 增強NFS性能
- 有關銷售商/制造廠家/型號的信息
- 3Com
- c501
- EtherLink II, 3c503, 3c503/16
- Etherlink Plus 3c505
- Etherlink-16 3c507
- Etherlink III, 3c509 / 3c509B
- c515
- c523
- c527
- c529
- c562
- c575
- c579
- c589 / 3c589B
- c590 / 3c595
- c592 / 3c597
- c900 / 3c905 / 3c905B / 3c905C
- c985
- Accton
- Accton MPX
- Accton EN1203, EN1207, EtherDuo-PCI
- Accton EN2209 Parallel Port Adaptor (EtherPocket)
- Accton EN2212 PCMCIA Card
- Allied Telesyn/Telesis
- AT1500
- AT1700
- AT2400
- AT2450
- AT2500
- AT2540FX
- AMD / Advanced Micro Devices
- AMD LANCE (7990, 79C960/961/961A, PCnet-ISA)
- AMD 79C965 (PCnet-32)
- AMD 79C970/970A (PCnet-PCI)
- AMD 79C971 (PCnet-FAST)
- AMD 79C972 (PCnet-FAST+)
- AMD 79C974 (PCnet-SCSI)
- Ansel Communications
- AC3200 EISA
- Apricot
- Apricot Xen-II On Board Ethernet
- Arcnet
- ATT
- ATT T7231 (LanPACER+)
- Boca Research
- Boca BEN400
- Boca BEN (ISA, VLB, PCI)
- Cabletron
- E10**, E10**-x, E20**, E20**-x
- E2100
- E22**
- Cogent
- EM100-ISA/EISA
- Cogent eMASTER+, EM100-PCI, EM400, EM960, EM964
- Compaq
- Compaq Deskpro / Compaq XL (Embedded AMD Chip)
- Compaq Nettelligent/NetFlex(嵌入ThunderLAN芯片)
- Compaq PCI card
- Danpex
- Danpex EN9400
- D-Link
- DE-100, DE-200, DE-220-T, DE-250
- DE-520
- DE-528
- DE-530
- DE-600
- DE-620
- DE-650
- DFE-530TX
- DFE-538TX
- DFI
- DFINET-300和DFINET-400
- Digital / DEC
- DEPCA, DE100/1, DE200/1/2, DE210, DE422
- Digital EtherWorks 3 (DE203, DE204, DE205)
- DE425 EISA, DE434, DE435, DE500
- DEC 21040, 21041, 2114x, Tulip
- Farallon
- Farallon Etherwave
- Farallon PCI 593
- Fujitsu
- Fujitsu FMV-181/182/183/184
- Hewlett Packard
- HP Night Director+ 10/100
- A
- HP EtherTwist, PC Lan+ (27247, 27252A)
- HP-J2405A
- HP-Vectra On Board Ethernet
- HP 10/100 VG Any Lan Cards (27248B, J2573, J2577, J2585, J970, J973)
- HP NetServer 10/100TX PCI (D5013A)
- IBM / International Business Machines
- IBM Thinkpad 300
- IBM Credit Card Adaptor for Ethernet
- IBM 10/100 EtherJet PCI
- IBM Token Ring
- ICL Ethernet Cards
- ICL EtherTeam 16i/32
- Intel Ethernet Cards
- Ether Express
- Ether Express PRO/10 (PRO/10+)
- Ether Express PRO/10 PCI (EISA)
- Ether Express PRO 10/100B
- Kingston
- LinkSys
- LinkSys Etherfast 10/100 Cards.
- LinkSys Pocket Ethernet Adapter Plus (PEAEPP)
- LinkSys PCMCIA Adaptor
- Microdyne (Eagle)
- Microdyne Exos 205T
- Mylex
- Mylex LNE390A, LNE390B
- Mylex LNP101
- Mylex LNP104
- Novell Ethernet, NExxxx及其相關兼容卡。
- NE1000, NE2000
- NE2000-PCI (RealTek/Winbond/Compex)
- NE-10/100
- NE1500, NE2100
- NE/2 MCA
- NE3200
- NE3210
- NE5500
- Proteon
- Proteon P1370-EA
- Proteon P1670-EA
- Pure Data
- PDUC8028, PDI8023
- Racal-Interlan
- ES3210
- NI5010
- NI5210
- NI6510 (不是EB)
- EtherBlaster(又名NI6510EB)
- RealTek
- RealTek RTL8002/8012 (AT-Lan-Tec) Pocket adaptor
- RealTek 8009
- RealTek 8019
- RealTek 8029
- RealTek 8129/8139
- Sager
- Sager NP943
- Schneider Koch
- SK G16
- SEEQ
- SEEQ 8005
- SMC (Standard Microsystems Corp.)
- WD8003, SMC Elite
- WD8013, SMC Elite16
- SMC Elite Ultra
- SMC Elite Ultra32 EISA
- SMC EtherEZ (8416)
- SMC EtherPower PCI (8432)
- SMC EtherPower II PCI (9432)
- SMC 1211TX 10/100
- SMC 3008
- SMC 3016
- SMC-9000 / SMC 91c92/4
- SMC 91c100
- Texas Instruments
- ThunderLAN
- Thomas Conrad
- Thomas Conrad TC-5048
- VIA
- VIA 86C926 Amazon
- VIA 86C100A Rhine II (and 3043 Rhine I)
- Western Digital
- Winbond
- Winbond 89c840
- Winbond 89c904, 89c905, 89c906
- Winbond 89c940
- Xircom
- Xircom PE1, PE2, PE3-10B*
- Xircom PCMCIA Cards
- Zenith
- Z-Note
- Znyx
- Znyx ZX342 (DEC 21040 based)
- 識別未知網卡
- 識別網絡接口控制器
- 識別以太網地址
- 通過FCC ID號碼識別網卡
- 使用未知網卡的技巧
- 非以太網設備的驅動程序
- 電纜、同軸電纜、雙絞線
- 以太網細纜(thinnet)
- 雙絞線
- 以太網粗纜
- 軟件設置與網卡診斷
- 以太網卡的配置程序
- WD80x3網卡
- Digital/DEC網卡
- NE2000+或AT/LANTIC網卡
- Com網卡
- 以太網卡的診斷程序
- 技術信息
- 可編程I/O、共享內存與DMA
- 可編程I/O(如NE2000、3c509)
- 共享內存(如WD80x3、SMC-Ultra、3c503)
- 從屬(普通)的直接內存存取(Linux下沒有這種情況!)
- 總線控制的直接內存存取(如LANCE、DEC 21040)
- 涉及總線帶寬的性能
- 比特ISA網卡與16比特ISA網卡
- 32比特(VLB/EISA/PCI)以太網卡
- 編寫驅動程序
- 內核的驅動程序接口
- Probe
- Interrupt handler
- Transmit function
- Receive function
- Open function
- Close function (可選)
- Miscellaneous functions
- 3Com的技術信息
- 基于AMD PCnet/LANCE的網卡的注意事項
- 廣播與混雜模式
- Berkeley包過濾器(BPF)
- 便攜式/筆記本電腦聯網
- 使用SLIP
- PCMCIA支持
- 對接座內的ISA以太網卡。
- 袖珍/并口適配器。
- 雜項
- 向內核傳遞以太網參數
- ether命令
- reserve命令
- 把以太網驅動程序作為模塊使用
- 相關文檔
- 聲明與版權
- 結束語
1. 導言
以太網-HOWTO包括了該買什么網卡與不該買什么網卡﹔如何設置網卡,怎樣運行多個網卡,以及其它常見錯誤和問題。它包含了對目前所有能夠得到的最常見網卡的支持的細節資料。
它不包含有關軟件方面的內容,因為NET-3 Howto中包含了這些內容。還要注意這里不包括(或者至少不應當包括)那些非Linux特有的有關以太網的一般問題的解答。對于那些問題,可以參考comp.dcom.lans.ethernet的FAQ中的大量資料,與所有其它新聞組FAQ一樣通過FTP到rtfm.mit.edu獲取。
本修訂版覆蓋了Linux 2.2.17及其之前的內核發行版本。
以太網-HOWTO的作者為:
原始的ASCII版本的以太網-HOWTO的主要資料來源為:
感謝他編寫了許多Linux目前使用的以太網卡驅動程序。他也是最初的NFS服務器的作者。謝謝Donald!
Copyright (c) 1993-2000 本文的版權所有人為Paul Gortmaker。請閱讀本文檔結尾處的聲明與版權信息( copyright)以了解有關分發本文及通常的“我們不對你試圖破壞......的行為負責”之類的法律信息。
1.1. 本文檔的新版本
本文檔的新版本可以從如下主頁獲得:
Ethernet-HOWTO
希望采用FTP方式或者希望獲取非HTML格式文檔的可使用以下站點:
Sunsite HOWTO Archive
這是“官方”站點──也可以在其它各種Linux WWW/ftp鏡像站點找到本文檔。在有了新資料或新驅動程序時本文檔將進行更新。如果你閱讀的文檔已經存在6個月以上了,那么你需要檢查一下是否已經有更新過的版本。
本文檔有多種格式(postscript,dvi,ASCII,HTML,等等)。推荐用HTML格式瀏覽(通過WWW瀏覽器)或Postscript/dvi格式瀏覽。這兩種格式都包含有普通文本ASCII格式無法提供的交叉引用功能。
1.2. 以太網-HOWTO的用法
由于本指南越來越大,你可能不希望花一個下午從頭讀到尾。而令人高興的是你不必閱讀全部內容。HTML和Postscript/dvi版本都有內容列表,可以幫助你更快地找到所需的內容。
可能你是由于無法使網卡工作,而且不知道該怎么做或者如何檢查,才來閱讀本文檔的。下一節( 幫幫我──網卡沒反應!)就是針對Linux初學者并給出正確的指導。
經常有一些問題被不同的人問了一遍又一遍。可能你碰到的某個問題就是常見問題之一,而且在本文檔的FAQ部分( 常見問題)已經有了答案。每個人在發文尋求幫助之前都最好先看一下這一節。
如果你還沒有網卡,那么你可能想從決定買網卡開始。( 該為Linux買什么網卡?)
如果你已經有了一塊以太網卡,但不能確定是否可以在Linux上使用它,那么你可能想讀一下包含每一個制造廠家及其網卡的特定信息的章節。( 有關銷售商/制造廠家/型號的信息)
如果你對Linux設備驅動程序的一些技術細節感興趣,那么你可以瀏覽有此類信息的章節。( 技術信息)
1.3. 幫幫我──網卡沒反應!
好,別緊張。下面就告訴你如何解決問題,即使你此前對Linux或以太網硬件一無所知。
首先你需要弄清楚你的網卡類型,然后確定Linux是否有此類型網卡的驅動程序。主機在控制不同的網卡時使用的方法一般也不一樣,而Linux驅動程序(如果有的話)就以允許Linux使用此卡的格式包含了這樣的控制信息。如果你沒有手冊一類的東西讓你知道網卡的類型,那么你可以嘗試處理“神秘”網卡的章節(參考章節: 識別未知網卡)。
現在你知道了你的網卡類型,閱讀特定網卡章節中有關你的網卡的細節(參考章節: 有關銷售商/制造廠家/型號的信息),那里以字母順序列出了網卡制造廠家、各自的類型號以及是否有Linux驅動程序。如果在列表中被表明“不支持”,你就可以放棄了。如果從中找不到你的網卡,那么看一下你的網卡手冊是否說它與某個已知網卡類型“兼容”。例如至少有几百種網卡與原來的Novell NE2000設計兼容。
假設你已經發現了你的網卡有Linux驅動程序,現在就找到并利用它。因為Linux有你的網卡的驅動程序并不意味著它存在每一個內核中。(內核是啟動時最先載入的操作系統核心,包含各種硬件的驅動程序,以及其它等等。)可能只有很少几個預先生成的內核,和一大批較小的作為分立模塊的驅動程序,或者是許多的內核,覆蓋了大量內建驅動程序的組合,這都完全取決于是誰生成了你所使用的Linux發行版本。
現在的大多數Linux發行版本都提供大量較小的作為分立模塊的不同驅動程序。需要的模塊通常可以在啟動過程的后期載入,或者在存取特定設備時以命令的形式載入一個驅動程序。你需要在內核啟動后把該模塊加載到內核上。查閱你所用的發行版本中有關安裝和使用模塊的信息,并參考本文檔的有關模塊章節。( 把以太網驅動程序作為模塊使用)
如果你沒有找到包含你的網卡驅動程序的已生成內核,也沒有找到該驅動程序的模塊形式,那么可能是你的網卡不夠常見,而且需要你自己生成一個包含該驅動程序的內核。只要你已經安裝了Linux,生成一個定制的內核一點兒都不難。你只要對內核需要包含些什么回答是或者不是,然后讓它生成就行了。有一個Kernel-HowTo可以幫助你。
此時你還需要以某種方式啟動內建了你的驅動程序的內核,或者以模塊的形式載入驅動程序。大約人們碰到的問題有一半兒出在沒有以這種或那種方式載入驅動程序,所以你會發現網卡現在工作了。
如果它還不工作,那么你需要証實一下內核確實檢測到了網卡。要做到這一點,你需要在系統啟動以及所有模塊載入之后鍵入dmesg | more。這可以讓你查看啟動過程中內核所顯示的啟動信息。如果網卡被檢測到,你可以從中找到以eth0開頭的網卡驅動程序顯示信息,指出網卡所使用的驅動程序名稱和硬件參數(中斷設置、I/O地址等等)。(注意:在啟動時,Linux會列出所有系統中安裝的PCI卡,無論是否有驅動程序──不要把這個誤認為其后的驅動程序檢測!)
如果你沒看到這樣的驅動程序識別信息,那么驅動程序就沒有檢測到你的網卡,這就是問題所在。查看FAQ( 常見問題)尋找網卡未檢測到時該做些什么。如果你的網卡是NE2000兼容的,在FAQ中有一些有關NE2000網卡檢測的技巧。
如果網卡被檢測到了,但檢測信息報告了一些錯誤,比如資源沖突,那么驅動程序可能無法正常初始化,網卡還是不可用。這一類的最常見錯誤信息也在FAQ中列出來了,并給出了相應的解決方案。
如果檢測信息看起來沒問題,那么再檢查一下驅動程序報告的網卡資源是否與網卡的物理設置一致(網卡的物理設置或者是通過網卡上的跳線,或者是網卡制造廠家提供的軟件工具完成。)它們必須完全一致。例如,網卡的跳線或配置為IRQ 15,而驅動程序在啟動信息中報告為IRQ 10,那么就會出問題。在FAQ中討論了最常見的驅動程序錯誤地檢測各種網卡配置信息的情況。
現在你已經使你的網卡以正確的參數被檢測到了,但愿一切正常。如果還有問題,那么或者是軟件配置有錯,或者是硬件配置有錯。軟件配置錯誤就是在ifconfig和route命令中沒有設置正確的網絡地址,其處理細節可以在Network HowTo和“Network Administrator's Guide”中找到,它們可能都在你用來安裝的CD-ROM上。
硬件配置錯誤是某些資源沖突或忘記配置(即在啟動時沒檢測到驅動程序),使網卡無法正常工作。通常可以用几種不同的方法來檢查。(1) 在ifconfig試圖打開設備來使用時報告出錯信息,如“SIOCSFFLAGS: Try again”。(2) 驅動程序報告eth0出錯信息(用dmesg | more查看)或者每次試圖發送或接收數據時奇怪的不一致。(3) 鍵入cat /proc/net/dev來顯示eth0的errs、drop、fifo、frame或carrier列中的非零數字。(4) 鍵入cat /proc/interrupts顯示網卡的零中斷計數。大多數典型的硬件配置錯誤也在FAQ中進行了討論。
好吧,如果你現在還有麻煩,閱讀本文檔的FAQ,閱讀有關銷售商章節中有關你的網卡的細節,如果問題還沒解決,那么你只好求助于某個相應的新聞組了。在求助文章中請給出所有相關的細節資料,比如網卡商標、內核版本、驅動程序的啟動信息、cat /proc/net/dev的輸出、清晰的問題描述,當然還有你在試圖解決問題時嘗試采用的方法。
你可能會奇怪有那么多的人發出諸如“Can someone help me? My ethernet doesn't work.”而沒有其它內容的無用信件。新聞組的讀者一般會忽略掉這些愚蠢的信件,而詳細的有內容的問題描述則會讓“Linux專家”立即指出你的問題所在。當然在用電子郵件發送問題報告時這也同樣成立──總是提供盡可能多的信息。
1.4. 網卡應該支持的電纜類型
使用RJ-45(大的電話插頭)連接器的雙絞線從技術上來說叫做10BaseT。你可能聽到過它被稱為UTP(無屏蔽雙絞線)。
使用BNC(金屬的推進和旋轉鎖定)連接器的以太網細纜(RG-58同軸電纜)從技術上來說叫做10Base2。
只會在早期的裝置上發現的老式以太網粗纜(10mm同軸電纜)被稱為10Base5。在某些以太網卡上使用的15針D形插座(AUI連接器)是用來連接以太網粗纜和外部收發器的。
大多數以太網卡都有價格稍高$10-$20的“Combo”版本。它們同時提供雙絞線和細纜以太網收發器,可以讓你以后改變主意。
大多數裝置使用10BaseT /100BaseT,因為10Base2無法升級為100Base之類的網絡。10Base2對于因為某種原因不想購買HUB的愛好者建立室內網絡而言是足夠的。
參考 電纜、同軸電纜......以了解有關以太網線纜不同類型的情況。
2. 常見問題
這里是一些有關使用Linux進行以太網連接的常見問題。某些特定問題按照制造商進行分類。可能你想問的問題別人已經問過(而且被回答了!),所以即使沒有在這里找到你的答案,還可能在諸如 Dejanews之類的新聞檔案中找到你所要的。
2.1. 該為Linux買什么網卡?
這個問題的答案很大程度取決于你希望用網絡連接干些什么,以及會遇到多大的數據流量。
如果你只想作為一個用戶偶爾使用一下FTP或WWW,那么即使是8比特的老ISA網卡都能滿足你的需要。
如果你想建立一個服務器,并要求接收或發送網絡數據給CPU帶來的負載最小,那么你可能需要看一下使用具有總線控制能力的芯片的PCI網卡,比如DEC tulip (21xxx)芯片,或者AMD PCnet-PCI芯片。
如果你的需求在這二者之間,那么使用有穩定的驅動程序的便宜的PCI網卡或16比特的ISA網卡就可以了。
2.2. Alpha驅動程序──獲取與使用
我聽說我的網卡有一個更新的或初步的/alpha驅動程序。從哪兒得到它呢?
最新的“新”驅動程序可以在Donald的FTP站點:cesdis.gsfc.nasa.gov里面的/pub/linux/下找到。因為事情變化很頻繁,可能需要四處找一找。或者使用WWW瀏覽器去:
Don's Linux Home Page
查找你想要的驅動程序更簡單一些。(留神WWW瀏覽器會悄悄地把源碼中的TABs替換為空格,等等──如果無法確定的話,使用FTP下載,至少也得用WWW瀏覽器的FTP URL。)
如果驅動程序確實是alpha版本,或pre-alpha版本,那么請恰當地對待它。換句話說,不要抱怨,因為你無法弄清用它能做些什么。如果弄不清如何安裝,最好不要去試。同樣,如果它使你的機器宕機了,不要抱怨。相反,你應該發給我們一份材料組織很好的Bug報告,如果是一個補丁,那就更好!
注意,某些“可用”的實驗性/alpha驅動程序已經包含在標准的內核源碼樹中。在運行make config時你首先要回答的一個問題就是“Prompt for development and/or incomplete code/drivers”。在此你要回答“Y”以包括任何alpha/實驗性驅動程序。
2.3. 一台機器使用多個以太網卡
做些什么才能讓Linux運行兩塊以太網卡?
這個問題的答案取決于驅動程序是否被用做可載入的模塊或者直接編譯進了內核。大多數Linux發行版本現在都使用模塊化的驅動程序。這樣就不用發行許多內核,每種內核設置一個不同的內建驅動程序。使用一個單一的基本內核,如果特定用戶系統需要,一旦系統啟動,就可以從驅動程序模塊文件(通常存放在/lib/modules/)中載入個別的驅動程序。
把驅動程序作為模塊使用:對于PCI驅動程序,模塊通常會自動檢測該品牌類型所有安裝的網卡。但對于ISA網卡,探尋一個網卡是不安全的操作,因此你需要提供網卡的I/O地址以便模塊知道去哪里查找。這一信息存儲在文件/etc/conf.modules中。
例如,如果一個用戶有兩塊ISA NE2000網卡,一塊在0x300,一塊在0x240,它們在/etc/conf.modules文件中顯示如下:
這几行的意義:就是說如果管理員(或內核)進行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將如下所示:
在此例中,選項-o用來給每個模塊實例一個唯一的名字,因為不能用同一個名字載入兩個模塊。選項irq=也是用來指定網卡設置的硬件IRQ。(此方法也能用于可接受多個以逗號分隔的I/O值的模塊,但這樣會使模塊被不必要地載入兩次,降低了效率。)
最后一個例子,假設用戶有一塊在0x350的3c503網卡和一塊在0x280的SMC Elite16 (wd8013)網卡。則應該這樣:
對于PCI網卡,只要用alias語句把ethN接口和相應的驅動程序名聯系起來就行了,因為PCI網卡的I/O地址可以被安全地檢測到。
可用的模塊一般存放在/lib/modules/uname -r/net下,這里uname -r命令可以得到內核的版本(比如2.0.34)。你可以在這里看看哪一個驅動程序適合你的網卡。一旦你在conf.modules文件里進行了正確的設置,就可以用下面的方法檢查一下:
這里“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入口是用來告訴內核不要檢測該設備──把它替換為零就啟動了對該設備的自動檢測。
2.4. 這個以太東東不干活。為什么?
如上所述,ether=命令只對編譯進了內核的驅動程序起作用。現在大多數的發行版本都用模塊的方式使用驅動程序,所以很少再使用ether=命令了。(某些早期文檔需要更新以反映這一變化。)如果你想使用模塊化的以太網驅動程序的選項,必須修改/etc/conf.modules文件。
如果你是使用編譯的驅動程序,而且已經把ether=加進了LILO配置文件,需要重新運行lilo使更新后的配置文件生效。
2.5. NE1000/NE2000網卡(及其兼容卡)的問題
問題: 在用v2.0.x啟動時沒有檢測到PCI NE2000兼容網卡。
原因: 在v2.0.30之前的ne.c驅動程序只知道基于RealTek 8029的兼容網卡的PCI ID號。在此只后才出現了使用其它PCI ID號的PCI NE2000兼容網卡,所以驅動程序無法檢測這些網卡。
解決方案: 最簡單的方法是把Linux內核升級到v2.0.31以上版本。它可以識別五種不同的NE2000-PCI芯片的ID號,在啟動或載入模塊時自動檢測到它們。如果你升級到了2.0.34以上版本,會有一個比原先的ISA/PCI驅動程序稍小但更高效的PCI專用NE2000驅動程序。
問題: 啟動時PCI NE2000兼容網卡被報告為ne1000(8比特網卡!)或者在v2.0.x下載入ne.o模塊不起作用。
原因: 某些PCI兼容網卡不支持字節存取(因此不是百分之百兼容的NE2000)。這使它在檢測時被誤認為NE1000網卡。
解決方案: 你需要升級到v2.0.31以上版本。現在的驅動程序會檢測到這種硬件Bug。
問題: PCI NE2000網卡的性能很差,即使按照性能技巧章節所說的減小了窗口大小。
原因: 十多年前設計和出售的初始8390芯片的技術數據手冊上提到,為了得到最高的可靠性,在每次寫操作之前需要一個讀操作。驅動程序能夠輕易地做到這一點,但從v1.2內核時代起,缺省情況下取消了這一操作。有一個用戶報告說重新啟用這一“錯誤的特性”就可以改善廉價的PCI NE2000兼容網卡的性能。
解決方案: 由于只有一個用戶提出報告把它作為解決方案,不要對此寄予太大的希望。重新使用寫之前的讀操作可以簡單地編輯linux/drivers/net/下的驅動程序文件,取消包含NE_RW_BUGFIX的那一行的注釋,然后重建內核或載入相應的模塊。如果這樣確實有效,請給我發一封e-mail,描述性能上的差異和你所使用的網卡/芯片類型。(對ne2k-pci.c驅動程序也可以如法炮制。)
問題: ne2k-pci.c驅動程序對PCI NE2000網卡報告諸如timeout waiting for Tx RDC錯誤信息,無法正常工作。
原因: 你的網卡或網卡到PCI總線的連接無法處理該驅動程序使用的長字I/O優化。
解決方案: 首先,檢查BIOS/CMOS設置,看看與PCI總線相關的計時對于可靠的操作是否過于嚴格了。否則,使用ISA/PCI的ne.c驅動程序(或者刪除ne2k-pci.c中的#define USE_LONGIO),使你的網卡可用。
問題: 沒檢測到ISA的即插即用NE2000網卡(如RealTek 8019)。
原因: 初始的NE2000特性不支持即插即用,因此Linux的NE2000驅動程序也不支持即插即用。
解決方案: 使用網卡所附的DOS配置盤取消PnP,并為該網卡設置一個指定的I/O地址和IRQ。在/etc/conf.modules里增加這樣的一行options ne io="0xNNN",其中0xNNN是你為網卡設置的16進制I/O地址。(假設你使用的是模塊化驅動程序﹔否則,在啟動時使用一個ether=0,0xNNN,eth0參數)。你也可以進入BIOS/CMOS設置,把IRQ從PnP改為Legacy-ISA。如果你需要為兼容其它的操作系統而保留PnP設置,那么你可以看一下isapnptools軟件包。使用man isapnp看看它是否已經安裝在你的系統上了。如果沒有,瀏覽一下下面的連接:
ISA PNP Tools
問題: 在啟動檢測時NE*000驅動程序報告“not found (no reset ack)”。
原因: 這跟上面所說的改動有關。在証實8390處于所檢測的I/O地址之后,進行重新設置。在網卡完成重新設置后,應當通知重新設置完成。你的網卡沒有通知,所以驅動程序認為不存在NE網卡。
解決方案: 你可以在啟動時使用一個未被使用的mem_end的16進制值0xbad,告訴驅動程序你有一個壞網卡。在使用0xbad覆蓋時你必須為網卡提供一個非零的I/O地址。例如,在0x340的網卡不響應重新設置時,則使用如下方法:
LILO: linux ether="0",0x340,0,0xbad,eth0
這樣,即使你的網卡不響應重新設置,網卡檢測還能繼續下去。如果你是以模塊方式使用驅動程序,那么可以象提供I/O地址一樣提供選項bad=0xbad。
問題: NE*000網卡使機器在第一次網絡訪問時死機。
原因: 這個問題從早期的1.1.57內核到現在都出現過,而且只在有限的几種軟件配置的兼容網卡上出現。看來是需要用某些特殊的方法來初始化它們。
解決方案: 有几個人報告在熱啟動(即loadlin或Ctrl-Alt-Del)Linux之前,運行提供的DOS軟件配置程序或提供的DOS驅動程序可以使網卡工作。這表明這些卡需要以某種特殊的方式初始化,與當前的Linux驅動程序稍有區別。
問題: 在0x360的NE*000以太網卡沒有檢測到。
原因: 你的NE2000網卡在I/O空間占據了0x20個字節,使它與0x378處的并口發生沖突。其它可能的設備是0x370處的第二個軟盤控制器(如果有的話),以及0x376--0x377處的第二個IDE控制器。如果該口已被其它驅動程序注冊,內核將不再進行檢測。
解決方案: 或者把你的網卡移到0x280, 0x340, 0x320一類的地址,或者在編譯時不支持并行打印機。
問題: 每次打印時網絡都斷開(NE2000)。
原因: 與上一個問題相同,但你的內核比較老,不支持對重疊I/O區域的檢查。使用如上的解決方案,有空時獲取一個新的內核。
問題: 沒檢測到0xNNN: 00 00 C5 ... 處的NE*000以太網卡。(非法標識yy zz)
原因: 首先,你是否在地址0xNNN處有一個NE1000或NE2000網卡?如果有,報告的硬件地址是否象一個合法地址?如果是的話,那么你的NE*000兼容網卡很差勁。所有的NE*000兼容網卡都假定網卡上的SA PROM的第14和15字節為0x57。而你的網卡不是這樣──它的值為“yy zz”。
解決方案: 有兩種解決方法。最簡單的方法就是如上所述的“no reset ack”解決方案,使用一個0xbad的mem_end值。這樣在提供一個非零的I/O地址時就可以忽略標識檢查。此方法無需重新編譯內核。
第二種方法(對黑客)需要修改驅動程序,并重新編譯內核(或模塊)。在驅動程序(/usr/src/linux/drivers/net/ne.c)的42行有一個“Hall of Shame”列表。這個表是用來檢測那些差勁的兼容網卡的。例如,DFI網卡在PROM的前三個字節使用“DFI”,而不是象要求的那樣在第14和15字節使用0x57。
問題: 機器在啟動時出現“8390...”或“WD....”信息后死機。拔掉NE2000就好了。
原因: 你的NE2000兼容網卡兼容性不好。一個激活的NE2000是個無底洞,會使其它的驅動程序陷在其空間內進行自動檢測。把NE2000改到一個不常用的地址就可以從其它的自動檢測中消除這一陷阱,機器也就可以啟動了。
解決方案: 把你的NE2000地址改為0x340一類的地址。此外,你可以在和“ether=”參數一起使用“reserve=”啟動參數,保護網卡不受其它設備驅動程序檢測的影響。
問題: 機器啟動時在進行SCSI檢測時死機。
原因: 這個問題跟上面的一樣,改變以太網卡的地址,或使用reserve/ether啟動參數。
問題: 機器啟動時在進行聲卡檢測時死機。
原因: 不對,實際上是發生在靜默方式的SCSI檢測過程中,與上面的問題一樣。
問題: 啟動時檢測不到NE2000 -- 根本就沒有啟動信息。
解決方案: 因為造成檢測不到的原因很多,所以沒有“神奇的解決方案”。下面列出了可能有所幫助的一些措施。
1) 構建一個只包含需要的設備驅動程序的內核。証實你確實是從新內核啟動的。忘記運行lilo等會使你從老的內核啟動。(仔細觀察啟動時報告的構建時間/日期。)聽起來很明顯,但我們以前都犯過這個錯。通過檢查System.map文件里ne_probe一類的名稱,確定驅動程序已包含在新的內核里。
2) 仔細觀察啟動信息。看看它是否提及正在進行諸如“NE*000 probe at 0xNNN: not found (blah blah)”一類的ne2k檢測,或者就是靜悄悄地失敗了。這里的區別很大。使用dmesg|more在登錄后瀏覽啟動信息,或者在啟動完成顯示登錄提示符時使用Shift-PgUp卷回屏幕。
3) 啟動后,執行cat /proc/ioports,証實網卡要求的全部I/O空間是空的。如果網卡在0x300,那么ne2k驅動程序要求的空間為0x300-0x31f。如果其它設備的驅動程序注冊了其中的一個口,就不會對該地址進行檢測,而是靜悄悄地檢測下一個要檢測的地址。常見的情況是lp驅動程序保留了
,或者第二個IDE通道保留了0x376,這就使ne驅動程序停止檢測0x360-0x380。
4) 與上面一樣執行cat /proc/interrupts。確定沒有其它設備注冊了你為以太網卡設置的中斷。這種情況下,檢測可以進行,以太網卡驅動程序會在啟動時大聲抱怨無法得到所要求的IRQ中斷線。
5) 如果你還為驅動程序靜悄悄地失敗而苦惱,那么編輯并給檢測增加一些printk()。比如,對于ne2k,你可以在linux/drivers/net/ne.c中增加/刪除某些行(用“+”或“-”表示),如下所示:
那么它就會輸出檢查的每一個口地址信息,你可以看到你的網卡地址是否被檢測了。
6) 你還可以從Don的ftp站點(在howto中也提及了)獲取ne2k的診斷程序,看看你在啟動進入Linux后能否用它檢測你的網卡。使用“-p 0xNNN”選項告訴它在哪里尋找你的網卡。(缺省情況下只檢測0x300,與啟動時的探測不同,不會檢測其它的地址。)在找到網卡時的輸出如下:
Checking the ethercard at 0x300.
Register 0x0d (0x30d) is 00
Passed initial NE2000 probe, value 00.
8390 registers: 0a 00 00 00 63 00 00 00 01 00 30 01 00 00 00 00
SA PROM 0: 00 00 00 00 c0 c0 b0 b0 05 05 65 65 05 05 20 20
SA PROM 0x10: 00 00 07 07 0d 0d 01 01 14 14 02 02 57 57 57 57
NE2000 found at 0x300, using start page 0x40 and end page 0x80.
你的注冊值和PROM值可能會不一樣。注意,對16比特網卡,所有PROM值都增加一倍,以太網卡地址(00:00:c0:b0:05:65)出現在第一行,加倍后的0x57標識出現在PROM的結尾。
在0x300處沒有安裝網卡時的輸出如下:
Checking the ethercard at 0x300.
Register 0x0d (0x30d) is ff
Failed initial NE2000 probe, value ff.
8390 registers: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff
SA PROM 0: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff
SA PROM 0x10: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff
Invalid signature found, wordlength 2.
出現值0xff的原因是在讀取空I/O口時返回的就是該值。如果在檢測的區域內有其它硬件,你可以看到一些非0xff的值。
7) 嘗試在運行提供的DOS驅動程序或配置程序之后,從DOS啟動軟盤(通過loadlin)熱啟動進入Linux。這可能會進行一些額外的(即非標准的)“魔法”來初始化網卡。
8) 試一下Russ Nelson的ne2000.com包驅動程序,看它能否看見你的網卡──如果還不行,事情就不大妙了。例如:
所用參數為軟件中斷向量、硬件IRQ和I/O地址。你可以從任意的msdos檔案文件中的pktdrv11.zip里找到它──現在的版本大概是11以上了。
2.6. SMC Ultra/EtherEZ和WD80*3網卡的問題
問題: 你得到了如下信息:
原因: 是共享內存的問題。
解決方案: 最普遍的原因是配置的PCI機器沒有映射到ISA內存設備里。因此你讀到的是PC的RAM(全都是0xff值),而不是存放接收數據包數據的網卡上的RAM。
另一個容易解決的典型問題是板卡沖突,在此區域有緩存或“shadow ROM”,或者你的ISA總線運行速度高于8Mhz。以太網卡上的內存失效的數目也令人驚奇,所以如果你的以太網卡有診斷程序的話,運行一下。
問題: SMC EtherEZ在非共享內存(PIO)模式下不工作。
原因: 老版本的Ultra驅動程序只支持共享內存模式下的操作。
解決方案: 版本2.0以上的內核所附驅動程序就支持可編程I/O模式的操作。升級到v2.0以上版本。
問題: 老的wd8003或可跳線的wd8013總是得到錯誤的IRQ。
原因: 老的wd8003網卡或可跳線的wd8013兼容卡沒有驅動程序可以從中讀取設置的IRQ的EEPROM。如果驅動程序無法讀到IRQ,就嘗試用auto-IRQ發現它。若auto-IRQ返回0,那么驅動程序就給8比特網卡分配IRQ 5,或者為16比特網卡分配IRQ 16。
解決方案: 使auto-IRQ代碼無效,并在你的模塊配置文件(對于內建的驅動程序則通過啟動參數)告訴內核你把網卡跳成了什么IRQ。
問題: SMC Ultra網卡被檢測成了wd8013,但IRQ和共享內存地址是錯的。
原因: Ultra網卡看起來跟wd8013很相象,如果內核里沒有Ultra驅動程序,wd驅動程序就會把ultra誤認為wd8013。ultra檢測在wd之前,所以一般不會出問題。ultra在EEPROM保存的IRQ和內存地址與wd8013保存的位置不同,所以報告的值是假的。
解決方案: 只保留需要的驅動程序重新編譯內核。如果你在同一台機器上同時使用wd和ultra網卡,并使用模塊,那么首先載入ultra模塊就行了。
2.7. 3Com網卡的問題
問題: 3c503選擇了IRQ N,但其它設備也需要IRQ N。(比如CD ROM驅動程序、modem等。)可以不編譯進內核就解決這個問題嗎?
解決方案: 3c503驅動程序按照順序{5, 9/2, 3, 4}檢測空閑的IRQ線,從中找到一個未被使用的IRQ。在網卡被ifconfig操作配置時選擇中斷IRQ。
如果你使用的是模塊化的驅動程序,可以用模塊參數設置各種情況,包括中斷IRQ的值。
下面的語句選擇IRQ9、基址0x300、ignored value和if_port #1(外部收發器)。
另外,如果驅動程序被編譯進了內核,你還可以通過LILO在啟動時傳遞參數來設置同樣的值。
LILO: linux ether="9",0x300,0,1,eth0
下面的語句選擇IRQ3、檢測基址、ignored value和缺省if_port #0(外部收發器)。
LILO: linux ether="3",0,0,0,eth0
問題: 3c503: configured interrupt X invalid, will use autoIRQ.
原因: 3c503網卡只能使用中斷IRQ{5, 2/9, 3, 4}中的一個(這些是網卡所能連接的中斷線。)如果你使用一個不在其中的IRQ值,就會得到如上的提示。一般情況下,沒必要為3c503指定中斷值。3c503會在ifconfig配置時使用autoIRQ,并從IRQ{5, 2/9, 3, 4}中選擇一個。
解決方案: 使用上述的合法IRQ值,或者不指定IRQ以啟用autoIRQ。
問題: 提供的3c503驅動程序無法使用AUI(粗纜以太網)端口。怎樣才能不使用缺省的細纜以太網端口而選擇AUI端口?
解決方案: 3c503的AUI端口對于內建驅動程序可以在啟動時選擇,對于模塊化驅動程序可以在插入模塊時選擇。這一選擇會覆蓋未使用的dev-rmem_start變量的低比特位,所以啟動參數:
LILO: linux ether="0",0,0,1,eth0
可以對內建在內核的驅動程序起作用。
要在載入模塊時指定AUI端口,只需把xcvr=1附加在模塊選項包含你的I/O和IRQ值的那一行就行了。
2.8. 非特定網卡的FAQ。
2.8.1. Linux與ISA的即插即用以太網卡。
要獲得最佳效果(問題最少),推荐使用隨網卡附的程序(通常是DOS程序)取消PnP機制,并給網卡設置一個固定的I/O地址和IRQ。確定使用的I/O地址在啟動時被驅動程序檢測到,如果使用模塊,則在/etc/conf.modules中使用io=選項提供地址。也可以進入BIOS/CMOS設置,把IRQ從PnP改為Legacy-ISA(如果計算機有此選項的話)。
注意,運行基于DOS的配置程序一般并不需要安裝DOS。可以用DOS軟盤啟動,然后從提供的軟盤上運行它們就可以了。同樣可以自由地下載OpenDOS和FreeDOS。
如果需要使用PnP以與其它操作系統兼容,就得每次啟動時都使用Linux的isapnptools包配置網卡。還需要確定為網卡選擇的I/O地址被驅動程序檢測到,或用io=選項提供I/O地址。
有些系統在BIOS/CMOS設置菜單中有“enable PnP OS”(或類似的名稱)選項,几乎在所有情況下或網卡無法正常工作甚