2010年5月1日

Ubuntu上安裝Marvell Gigabit LAN Driver

這篇算是補充,既然都寫了新版patch,舊聞也順便寫寫。

P5Q-E是張C/P值頗高的主機板,內建Dual Gigabit LAN,廠牌型號是Marvell 88E8056/88E8001,在Linux上支援備援線路於斷線時自動切換(Linux上看起來不支援頻寬合併,如有支援的消息請告知)。
這邊順便的告訴大家,現在買主機板時,幾乎都內建Gigabit LAN了,其中許多都是Dual NIC,當主機板支援Dual NIC時,哪個LAN要當主要的LAN要注意,可以仔細看說明書或者上網查主機板的規格,Dual NIC通常是一個PCI-E配一個PCI的,只有PCI-E的才能發揮Gigabit LAN的全部效能。
以P5Q-E來說,它內建的chip型號為88E8056/88E8001,會有2個型號,原因就在於它的Dual NIC,一個型號是PCI-E(88E8056),另一個則是PCI(88E8001)。
因為如此,在Linux當中兩個LAN Port的Driver並不同,分別是PCI-E(88E8056)的skge、PCI(88E8001)的sky2。
其中因為sky2是實驗性的Driver,因此穩定性是公認的糟糕,而我個人使用上,發現skge的穩定性也不怎麼好,高流量時也會出現watchdog timeout。
解決方案很簡單,使用Marvell原廠提供的sk98lin Driver即可,sk98lin Driver可同時支援88E8056和88E8001,安裝後可以直接取代skge和sky2。

而sk98lin安裝很討厭,要進行些步驟才能安裝成功,下面列出我的安裝步驟,如果有要安裝的看到本篇可以節省些時間,以下安裝是在Ubuntu上進行,相信Debian差別不大,其他則不確定。

1. 安裝或確認sk98lin安裝所需的套件
確定有安裝下列套件:
.Linux Kernel對應的linux headers
.Linux Kernel對應的linux source
.kernel-package
.libncurses5-dev

以Ubuntu 10.04版本來說,目前的Kernel版本為2.6.32-21-server(執行uname -a可查看),就需要安裝:
.linux-headers-2.6.32-21
.linux-source-2.6.32
.kernel-package
.libncurses5-dev

2. 下載sk98lin Driver

3. 設置或確認sk98lin安裝時所需的連結或目錄
.確認linux kernel source有解壓縮
Ubuntu/Debian的linux source套件只會下載linux kernel的壓縮到到/usr/src,不會自動解壓縮,所以先執行下面指令解壓縮:
# cd /usr/src
# tar jxvf linux-source-2.6.32.tar.bz2

.確認目前系統的kernel config已放入linux source目錄
sk98lin安裝編譯時,會要求要有kernel的config檔案,請到/boot/查找目前系統用的kernel(可用uname -a查詢)的config檔案。
例如:
# uname -a
Linux file 2.6.32-21-server #32-Ubuntu SMP Fri Apr 16 09:17:34 UTC 2010 x86_64 GNU/Linux

則config檔案是/boot/config-2.6.32-21-server

接著把這個檔案複製到linux kernel source的目錄中,如下:
# cd /usr/src/linux-source-2.6.32
# cp /boot/config-2.6.32-21-server ./.config


.確認目前系統的kernel module目錄下是否有kernel source的連結
sk98lin安裝編譯時,會要求要有kernel module的目錄下要有linux kernel source的連結,如下建立:
# cd /lib/modules/2.6.32-21-server
# ln -s /usr/src/linux-source-2.6.32 source


/lib/modules/的目錄,一樣參考目前系統的kernel版本。

.確認有定義IGNORE_HEADER_MISMATCH這個環境變數
因為sk98lin安裝編譯時,會查詢目前的linux headers和目前系統的kernel是否符合,不符合不動作,但Ubuntu上headers和kernel通常版本不完全符合,因此要加上這個環境變數,如下。
(bash)
# export IGNORE_HEADER_MISMATCH=1
(tcsh)
# setenv IGNORE_HEADER_MISMATCH 1

4. 解開壓縮檔
# cd /tmp
# tar jxvf install_v10.84.3.3.tar.gz
# cd DriverInstall


5. 修改install.sh
#!/bin/sh改為#!/bin/bash,如下:
# vi /tmp/DriverInstall/install.sh
#!/bin/sh

to
#!/bin/bash


6. 執行sk98lin安裝程式
# ./install.sh

Q1:
1) installation 3) generate makefile
2) generate patch 4) exit

A1:
1

Q2:
Do you want proceed? (y/N)
A2:
y

Q3:
1) Do nothing
2) Deactivate diver
3) Remove driver

A3:
1

即會自動編譯sk98lin模組。

7. 載入sk98lin module
順利編譯成功後,可載入sk98lin module,執行如下:
# modprobe sk98lin

8. 修改blacklist.conf,強制不使用skge、sky2
編輯/etc/modprobe.d/blacklist.conf,檔案最上面加入
/etc/modprobe.d/blacklist.conf
blacklist sky2
blacklist skge
.....


9. 重新開機
# reboot

即可完成