本文整理 Linux 系統下配置多張乙太網卡的常見問題與解決方案,依驅動程式載入方式(模組化 vs 核心內建)分類說明,並提供實際設定範例。
最新驅動程式可從 Donald Becker 的 FTP 站點 cesdis.gsfc.nasa.gov/pub/linux/ 下載,或透過其個人網頁查找。建議使用 FTP 下載以避免瀏覽器將原始碼中的 Tab 字元轉換為空格。
若驅動程式確為 alpha 或 pre-alpha 版本,請理性對待:不可預期其行為完美,若導致系統當機也不應抱怨,而應提交完整的 Bug 回報。部分實驗性驅動程式已納入標準核心原始碼樹,執行 make config 時選擇「Prompt for development and/or incomplete code/drivers」並回答 Y 即可包含。
設定方式取決於驅動程式是以模組載入或編譯進核心。現代發行版多採模組化,系統啟動後從 /lib/modules/ 載入所需驅動程式。
PCI 驅動程式通常自動偵測同品牌所有網卡;ISA 網卡因偵測不安全,需在 /etc/conf.modules 手動指定 I/O 位址。
假設分別位於 0x300 與 0x240:
alias eth0 ne alias eth1 ne options ne io=0x240,0x300
載入時會使用 io=0x240,0x300 參數。注意 0x 前綴不可省略,順序決定實體網卡對應 eth0 或 eth1。大多數 ISA 模組支援多個逗號分隔的 I/O 值,但舊驅動(如 3c501.o)每次僅能處理一張卡,需載入兩次。
alias eth0 3c501 alias eth1 3c501 options eth0 -o 3c501-0 io=0x280 irq=5 options eth1 -o 3c501-1 io=0x300 irq=7
-o 為每個模組實例指定唯一名稱,irq= 指定硬體 IRQ。
alias eth0 wd alias eth1 3c503 options wd io=0x280 options 3c503 io=0x350
僅需用 alias 將 ethN 介面與驅動程式名稱關聯,PCI 總線可安全自動偵測 I/O 位址。
模組通常位於 /lib/modules/`uname -r`/net。設定完成後可執行:
modprobe ethN dmesg | tail
核心內建驅動程式預設僅自動偵測第一張網卡。2.1.x 以後核心將啟動偵測分為安全(PCI/EISA)與不安全(ISA),安全偵測可自動找到所有裝置,含 ISA 卡的多網卡系統仍需額外處理。
最簡單方法是透過 LILO 傳遞啟動參數:ether=0,0,eth1 即可啟動第二張卡偵測。若要指定 0x300 為 eth0、0x280 為 eth1:
LILO: linux ether=5,0x300,eth0 ether=15,0x280,eth1
ether= 參數語法詳見相關文件,可寫入 LILO 設定 append 選項固定參數。另一種不建議的方法是編輯 Space.c 將 0xffe0 替換為 0 以強制自動偵測。
若作為兩網路間路由器,需啟用 IP 轉發並重編核心。
ether= 僅對核心內建驅動有效,現代發行版多用模組化驅動,故較少使用。模組化驅動的選項需修改 /etc/conf.modules。若使用核心內建驅動且已修改 LILO 設定,須重新執行 lilo 生效。
原因: v2.0.30 前的 ne.c 僅知 RealTek 8029 晶片 PCI ID,新晶片 ID 無法識別。
解決: 升級核心至 v2.0.31 以上,可識別五種 NE2000-PCI 晶片 ID;v2.0.34 更有專用 PCI 驅動 ne2k-pci.c。
原因: 部分 PCI 卡不支援位元組存取,非 100% 相容。
解決: 升級至 v2.0.31 以上,驅動程式會偵測此硬體錯誤。
原因: 早期 8390 晶片手冊建議每次寫入前先讀取以提高可靠性,核心 v1.2 起預設關閉此行為。有用戶回報重新啟用可改善廉價卡效能。
解決: 編輯 linux/drivers/net/ 下驅動程式,取消 NE_RW_BUGFIX 註解並重建核心或模組。僅單一用戶回報,效果不保證。
原因: 網卡或 PCI 總線連接無法處理長字 I/O 最佳化。
解決: 檢查 BIOS/CMOS PCI 計時設定,或改用 ISA/PCI 通用 ne.c 驅動,或刪除 ne2k-pci.c 中 #define USE_LONGIO。
原因: NE2000 原始規格不支援 PnP,Linux 驅動亦同。
解決: 使用廠商 DOS 設定軟體關閉 PnP,指定 I/O 位址與 IRQ,在 /etc/conf.modules 加入 options ne io=0xNNN(模組化)或啟動參數(核心內建)。