linux網路卡驅動程式的編譯與安裝(轉)

ba發表於2007-08-16
linux網路卡驅動程式的編譯與安裝(轉)[@more@]一般來說,目前新版的 Linux 預設可以支援的網路卡晶片組數量已經很完備了,很多網路卡晶片都已經被支援,
例如RLT 8139 晶片 ( RealTek 8139 ) 的網路卡所以使用者可以很輕易的設定好他們的網路卡。
不過,如果萬一不幸核心沒有支援該網路卡的話,那麼可以透過重新編譯核心或者編譯網路卡驅動模組 ( Modules ),
並且載入該模組,今天就是這麼巧,碰到一個D-Link 的DFE-530TX,沒法,只有手動安裝網路卡驅動程式了.
可以用命令# dmesg | grep eth
來檢視系統啟動資訊,顯示出 eth0 或者 eth1 的資訊,如果eth1沒找到正確的資訊,那就表示 Linux 無法找到該硬體,
eth0是8139的,已經顯示正常,例如:
[root@kindgeorge root]# dmesg | grep eth
eth0: RealTek RTL8139 Fast Ethernet at 0xf0160000, 00:0a:a6:30:0d:0e, IRQ 11
eth0: Identified 8139 chip type ''RTL-8139C''
eth0: Setting 10mbps full-duplex based on auto-negotiated partner ability 4061.

一. 檢視自己系統的核心版本.
[root@kindgeorge root]# uname -r
2.4.18-3 
我這裡是redhat7.3的,核心2.4.18-3
一般來說,這個核心驅動程式的模組會放在 /lib/modules/2.4.18-3/kernel/drivers/net
二.確定系統是否已經安裝下面包
1.由於編譯需要用到核心的原始碼包和編譯程式gcc.所以如果沒有的話,要先裝.
檢視:
[root@kindgeorge root]# rpm -qa|grep kernel
kernel-2.4.18-3
kernel-source-2.4.18-3
[root@kindgeorge root]# rpm -qa|grep gcc (gcc是編譯用)
gcc-2.96-110
gcc-g77-2.96-110
gcc-c++-2.96-110
一般裝了核心源包的話,都會在出現/usr/src/linux-2.4,同路徑下會有linux-2.4.18-3的檔案實際目錄.
2.如果沒有的話,就用原來安裝盤上的檔案安裝,會去下載個相同核心源包安裝吧
rpm -ivh kernel-source-2.4.18-3.i386.rpm
......
三. 取得驅動程式和編譯
1. 可以重廠家提供的光碟提供,把光碟上的linux目錄下的dlkfet-4.24.tar.gz 複製過來用.
2. 從網上下載網路卡驅動程式,一般廠家的網站都提供下載程式的.
例如: 上有下載.
[root@kindgeorge root]# cp dlkfet-4.24.tar.gz /usr/src
[root@kindgeorge root]# cd /usr/src/
[root@kindgeorge src]# tar -zxvf dlkfet-4.24.tar.gz
dlkfet-4.24/
dlkfet-4.24/rhine_main.c
dlkfet-4.24/Makefile
dlkfet-4.24/vmns_drv.h
dlkfet-4.24/rhine.h
dlkfet-4.24/.depend.mak
dlkfet-4.24/rhine_vmns.c
dlkfet-4.24/rhine_proc.h
dlkfet-4.24/rhine_proc.c
dlkfet-4.24/rhine_vmns.h
dlkfet-4.24/kcompat.h
dlkfet-4.24/rhine_cfg.h
dlkfet-4.24/.depend
dlkfet-4.24/rhine_wol.c
dlkfet-4.24/rhine_wol.h
dlkfet-4.24/linux.txt
3.請留意一開始是沒有.o檔案的. 我們編譯前可以看看目錄的linux.txt,是一個包含介紹安裝說明.在進入目錄後,執行make進行編譯.
[root@kindgeorge src]# cd dlkfet-4.24
[root@kindgeorge dlkfet-4.24]# make
[root@kindgeorge dlkfet-4.24]# ll (編譯後檢視一下)
total 320
-rw-r--r-- 1 root root 7473 Jan 15 2003 kcompat.h
-rw-r--r-- 1 root root 11491 Jan 20 2003 linux.txt
-rw-r--r-- 1 root root 5219 Dec 10 2002 Makefile
-rw-r--r-- 1 root root 1818 Jan 16 2003 rhine_cfg.h
-rw-r--r-- 1 root root 48715 May 24 18:31 rhinefet.o
-rw-r--r-- 1 root root 42044 Jan 15 2003 rhine.h
-rw-r--r-- 1 root root 78996 Jan 16 2003 rhine_main.c
-rw-r--r-- 1 root root 32760 May 24 18:31 rhine_main.o
-rw-r--r-- 1 root root 14980 Jan 15 2003 rhine_proc.c
-rw-r--r-- 1 root root 1672 Jan 15 2003 rhine_proc.h
-rw-r--r-- 1 root root 12336 May 24 18:31 rhine_proc.o
-rw-r--r-- 1 root root 9172 Jan 15 2003 rhine_vmns.c
-rw-r--r-- 1 root root 1106 Jan 15 2003 rhine_vmns.h
-rw-r--r-- 1 root root 3792 May 24 18:31 rhine_vmns.o
-rw-r--r-- 1 root root 7536 Jan 15 2003 rhine_wol.c
-rw-r--r-- 1 root root 1529 Jan 15 2003 rhine_wol.h
-rw-r--r-- 1 root root 3488 May 24 18:31 rhine_wol.o
-rw-r--r-- 1 root root 6824 Jan 15 2003 vmns_drv.h

4.經過編譯後,會編譯出一個rhinefet.o 檔案,這個就是驅動模組,我們把它複製到相應地方:
[root@kindgeorge dlkfet-4.24]#cp rhinefet.o /lib/modules/2.4.18-3/kernel/drivers/net
[root@kindgeorge dlkfet-4.24]# depmod -a
5.測試
(1)可以用命令modprobe rhinefet 或 insmod rhinefet.o 載入.如果沒出錯資訊說明ok.
(2) 用命令lsmod 可以看看是否已經載入了.
[root@kindgeorge dlkfet-4.24]# lsmod
Module Size Used by Not tainted
rhinefet 38752 1
8139too 16448 1
mii 2408 0 [8139too]
這樣,看到rhinefet模組已經載入了,基本上,這樣就證明已經編譯成功.

6. 讓它開機時載入
[root@kindgeorge dlkfet-4.24]# vi /etc/modules.conf
在後面加上一行: alias eth1 rhinefet
7. 配置一下網路
[root@kindgeorge dlkfet-4.24]# vi /etc/sysconfig/network-scripts/ifcfg-eth1

DEVICE=eth1
BOOTPROTO=static
IPADDR=192.168.4.202
NETMASK=255.255.255.0
NETWORK=192.168.4.0
GATEWAY=192.168.4.250
BROADCAST=192.168.4.255
ONBOOT=yes
8.啟動網路卡,然後用ifconfig檢視,
ifup eth1
[root@kindgeorge dlkfet-4.24]# ifconfig
eth0 Link encap:Ethernet HWaddr 00:0A:E6:30:0D:0E
inet addr:211.239.218.153 Bcast:211.239.218.255 Mask:255.255.255.0
UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1
RX packets:3780479 errors:0 dropped:0 overruns:0 frame:0
TX packets:3833860 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:100
RX bytes:1118112324 (1066.3 Mb) TX bytes:1111887387 (1060.3 Mb)
Interrupt:11

eth1 Link encap:Ethernet HWaddr 00:0F:3D:82:EC:1D
inet addr:192.168.4.202 Bcast:192.168.4.255 Mask:255.255.255.0
UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1
RX packets:749312 errors:0 dropped:0 overruns:0 frame:0
TX packets:976174 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:100
RX bytes:43695059 (41.6 Mb) TX bytes:1472142037 (1403.9 Mb)
Interrupt:5 Base address:0xe000

9.重新啟動機器,可以自動載入和使用了.大功告成.

五. 按照安裝說明的方法自動編譯安裝.
在 "三.3" 中我們用make 編譯,然後進行手動的複製. 實際上在linux.txt中的安裝說明提到用make install .
那我們來看看這種方法系統都做了什麼吧.
[root@firewall1 dlkfet-4.24]# make install
gcc -Wall -DLINUX -D__KERNEL__ -DMODULE -DEXPORT_SYMTAB -D__NO_VERSION__ -O2 -pipe -I/lib/modules/2.4.18-3/build/include -I. -Wstrict-prototypes -fomit-frame-pointer -DMODVERSIONS -include /lib/modules/2.4.18-3/build/include/linux/modversions.h -DVMNS -c -o rhine_main.o rhine_main.c
gcc -Wall -DLINUX -D__KERNEL__ -DMODULE -DEXPORT_SYMTAB -D__NO_VERSION__ -O2 -pipe -I/lib/modules/2.4.18-3/build/include -I. -Wstrict-prototypes -fomit-frame-pointer -DMODVERSIONS -include /lib/modules/2.4.18-3/build/include/linux/modversions.h -DVMNS -c -o rhine_proc.o rhine_proc.c
gcc -Wall -DLINUX -D__KERNEL__ -DMODULE -DEXPORT_SYMTAB -D__NO_VERSION__ -O2 -pipe -I/lib/modules/2.4.18-3/build/include -I. -Wstrict-prototypes -fomit-frame-pointer -DMODVERSIONS -include /lib/modules/2.4.18-3/build/include/linux/modversions.h -DVMNS -c -o rhine_wol.o rhine_wol.c
gcc -Wall -DLINUX -D__KERNEL__ -DMODULE -DEXPORT_SYMTAB -D__NO_VERSION__ -O2 -pipe -I/lib/modules/2.4.18-3/build/include -I. -Wstrict-prototypes -fomit-frame-pointer -DMODVERSIONS -include /lib/modules/2.4.18-3/build/include/linux/modversions.h -DVMNS -c -o rhine_vmns.o rhine_vmns.c


**************************************************
Build options:
VERSION 2.4.18-3
SMP Disabled
VMNS Enabled
***************************************************
mkdir -p /lib/modules/2.4.18-3/kernel/drivers/net
install -m 644 -o root rhinefet.o /lib/modules/2.4.18-3/kernel/drivers/net
***** Move official driver via-rhine.o to via-rhine.o.backup
mv /lib/modules/2.4.18-3/kernel/drivers/net/via-rhine.o /lib/modules/2.4.18-3/kernel/drivers/net/via-rhine.o.backup

/sbin/depmod -a || true

按照上面的結果顯示是這樣的一個過程:
(1)系統把.c等檔案編譯成相應的.o檔案.
(2)然後顯示系統是否支援SMP和VMNS,然後把相應的.o模組檔案複製到系統應該的地方.
(3)並且把相同晶片的程式過時的via-rhine.o改為備份檔案.讓系統用新的rhinefet.o
(4)最後執行/sbin/depmod -a 更新模組庫配置. 看來這個也是個智慧的安裝方法.
六. 用其他方法驅動.
由於市面上很多的各種各樣的板卡,有名牌有雜牌,多不勝數.當我們拿到一塊卡,但一下子沒找到它本身提供的源程式,不能編譯,怎麼辦呢?
所以當你有一塊網路卡不能用,在找linux的driver之前一定搞清楚這個網路卡用的什麼晶片,跟誰相容,比如3c509,ne2000,etherexpress等等.
這樣的型號一般都在網路卡上最大的一快晶片上印著.如果晶片型號相同,那麼它們其中一些是可以通用的.我們可以嘗試一下系統上已經安裝了的驅動是否可行了. 進入驅動目錄/lib/modules/(核心版本)/kernel/drivers/net 即可發現已經有很多模組了, 用命令insmod 相應晶片模組名字 , 如果不成功會報錯,如果正確則不顯示錯誤資訊,然後再進行上面的"三.5-9"步驟進行測試.如果不行,再老老實實的找源程式吧.

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/10617731/viewspace-961101/,如需轉載,請註明出處,否則將追究法律責任。

相關文章