[分享] 使用 NdisWrapper 來載入無線網路卡

常言道:『飲水思源』,在 Open Source 的世界裡,我們常常需要別人的幫助,但是在您有所心得的時候請記得分享給大家,『幫助人是快樂的喔』。歡迎您在使用 debian 的過程中的任何心得分享給大家。

[分享] 使用 NdisWrapper 來載入無線網路卡

文章Tetralet » 週一 9月 06, 2004 11:52 am

前言:

 雖然說 Linux 日漸風行,
 但還是有很多的硬體廠商就是不願完全支援 Linux,
 所以還是有可能會買到無法支援 Linux 的硬體的。

 之前在物色無線網路卡時,
 發現蠻多廠商所採用的是 Realtek RTL8180L 的晶片,
 在 Realtek 的網站上稍稍查了一下,
 Realtek 有提供這個網路晶片的驅動模組;
 加上之前就一直以為 Realtek 對於 Linux User 極為友善,
 所以就沒有詳加考慮就買下去了...
 結果踩到大地雷 - Realtek 只有放出它的 Binary 的驅動模組,
 在我的電腦上雖然編譯成功了但卻無法驅動...

 但,還好,在 Google 的協助之下,我發現了有個名為 NdisWrapper 的程式-
 它可以將 Win32 版的 Binary 驅動程式模擬成一個 Linux 的驅動模組,
 簡直是不可思議!


下載 NdisWrapper:

 NdisWrapper 的官方網站提供了它的 deb 檔案的下載,位址為:
代碼: 選擇全部
deb http://rigtorp.se/debian/ unstable/
deb-src http://rigtorp.se/debian/ unstable/

 請將其加到 /etc/apt/sources.list 後,
 用 apt-get update 指令來更新 apt 的資料庫。


NdisWrapper 的安裝方法:(使用 apt 工具)

代碼: 選擇全部
# 先使用 apt 指令來下載必須的套件。
 # 註:若您所使用的網路卡晶片為 Realtek RTL8180L,不妨同時下載 ndiswrapper-rtl8180 這個套件。
 # 註:ndiswrapper-rtl8180 所使用的是 ftp://ftp1.realtek.com.tw/cn/wlan/rtl8180l/winxp-8180(169).zip,
# Realtek 的官方 Driver for MS Windows XP。
apt-get install ndiswrapper ndiswrapper-source diswrapper-rtl8180

# 由於等一下也要編譯 Kernel Module,所以也要安裝 kernel-package 及 debhelper 這兩個套件。
apt-get install kernel-package debhelper

# 對了,別忘了把 Kernel Headers 裝起來呀!其中的 Kernel 版本記得要隨著您的系統而改變。
# 而 2.4.x 的使用者可能就要安裝整個 Kernel Source 了。
apt-get install kernel-headers-2.6.8-1 kernel-headers-2.6.8-1-686
apt-get install kernel-source-2.4.26

# NdisWrapper 的官方所提供的 ndiswrapper-source 套件會將 ndiswrapper-source.tar.gz 放在 /usr/src 裡。
# 先將它解壓縮...
cd /usr/src
tar xvzf ndiswrapper-source.tar.gz

# 如果是 Kernel 2.6.x,則進入 Kernel-Headers 目錄,並進行編譯。
# 如果是 Kernel 2.4.x,則進入 Kernel-Source 目錄,並進行編譯。
cd kernel-headers-2.6.8-1

# 如果要清除之前所產生的 make-kpkg 模組,記得要下達 make-kpkg clean。
# 但可能有需要再重新安裝一次 Kernel Header。
# make-kpkg clean
# apt-get install --reinstall kernel-headers-2.6.8-1 kernel-headers-2.6.8-1-686
make-kpkg modules_image --append-to-version=-1-686

# 編譯完成之後,會在 /usr/src 目錄裡出現一個 ndiswrapper-modules-2.6.5_0.8-1+10.00.Custom_i386.deb
# 將它安裝起來就大功告成了。
dpkg -i /usr/src/ndiswrapper-modules-2.6.5_0.8-1+10.00.Custom_i386.deb

# 再下達以下指令來更新 Kernel 的模組組態設定
depmod -a


NdisWrapper 的安裝方法:(自行編譯)

 在編譯 ndiswrapper-source 套件時,
 如果是 Kernel 2.4.x 的使用者可能要替而下載整個 Kernel Source 才能使用 make-kpkg 指令來進行編譯,
 感覺上未免過於勞師動眾!

 所以我們也可以採用以下方式來自行編譯 Kernel 模組:

代碼: 選擇全部
# wget http://ovh.dl.sourceforge.net/sourceforge/ndiswrapper/ndiswrapper-0.9.tar.gz
--21:07:56--  http://ovh.dl.sourceforge.net/sourceforge/ndiswrapper/ndiswrapper-0.9.tar.gz
  => `ndiswrapper-0.9.tar.gz'
Resolving ovh.dl.sourceforge.net... 213.186.33.91
Connecting to ovh.dl.sourceforge.net[213.186.33.91]:80... connected.
HTTP request sent, awaiting response... 200 OK
Length: 86,114 [application/x-tar]

    100%[============================================================>] 86,114  28.57K/s

21:07:59 (28.54 KB/s) - `ndiswrapper-0.9.tar.gz' saved [86114/86114]

# tar xvzf ndiswrapper-0.9.tar.gz
    ndiswrapper-0.9/
    ndiswrapper-0.9/AUTHORS
    ndiswrapper-0.9/ChangeLog
    ndiswrapper-0.9/INSTALL
    ndiswrapper-0.9/Makefile
    ndiswrapper-0.9/README
    ndiswrapper-0.9/ndiswrapper.spec.in
    ndiswrapper-0.9/version
    ndiswrapper-0.9/ndiswrapper.8
    ndiswrapper-0.9/utils/
    ndiswrapper-0.9/utils/Makefile
    ndiswrapper-0.9/utils/ndiswrapper
    ndiswrapper-0.9/utils/loadndisdriver.c
    ndiswrapper-0.9/utils/wlan_radio_averatec_5110hx.c
    ndiswrapper-0.9/driver/
    ndiswrapper-0.9/driver/Makefile
    ndiswrapper-0.9/driver/coffpe.h
    ndiswrapper-0.9/driver/ndiswrapper.h
    ndiswrapper-0.9/driver/loader.c
    ndiswrapper-0.9/driver/loader.h
    ndiswrapper-0.9/driver/ndis.c
    ndiswrapper-0.9/driver/ndis.h
    ndiswrapper-0.9/driver/hal.c
    ndiswrapper-0.9/driver/ntoskernel.c
    ndiswrapper-0.9/driver/ntoskernel.h
    ndiswrapper-0.9/driver/iw_ndis.c
    ndiswrapper-0.9/driver/iw_ndis.h
    ndiswrapper-0.9/driver/wrapper.c
    ndiswrapper-0.9/driver/wrapper.h
    ndiswrapper-0.9/driver/proc.c
    ndiswrapper-0.9/driver/misc_funcs.c
    ndiswrapper-0.9/driver/divdi3.c
    ndiswrapper-0.9/driver/longlong.h
    ndiswrapper-0.9/debian/
    ndiswrapper-0.9/debian/Makefile
    ndiswrapper-0.9/debian/compat
    ndiswrapper-0.9/debian/README.Debian
    ndiswrapper-0.9/debian/control.modules
    ndiswrapper-0.9/debian/control.utils
    ndiswrapper-0.9/debian/copyright
    ndiswrapper-0.9/debian/dirs.utils
    ndiswrapper-0.9/debian/docs
    ndiswrapper-0.9/debian/ndiswrapper-utils.install
    ndiswrapper-0.9/debian/ndiswrapper.install
    ndiswrapper-0.9/debian/ndiswrapper.substvars
    ndiswrapper-0.9/debian/postinst.modules
    ndiswrapper-0.9/debian/rules

# cd ndiswrapper-0.9


# make install
    make -C driver install
    make[1]: Entering directory `/tmp/ndiswrapper-0.9/driver'
    make -C /lib/modules/2.6.5-1-686/build SUBDIRS=/tmp/ndiswrapper-0.9/driver DRV_VERSION="0.9" modules
    make[2]: Entering directory `/usr/src/kernel-headers-2.6.5-1-686'
    *** Warning: Overriding SUBDIRS on the command line can cause
    ***          inconsistencies
      CC [M]  /tmp/ndiswrapper-0.9/driver/wrapper.o
      CC [M]  /tmp/ndiswrapper-0.9/driver/iw_ndis.o
      CC [M]  /tmp/ndiswrapper-0.9/driver/loader.o
      CC [M]  /tmp/ndiswrapper-0.9/driver/ntoskernel.o
      CC [M]  /tmp/ndiswrapper-0.9/driver/ndis.o
      CC [M]  /tmp/ndiswrapper-0.9/driver/misc_funcs.o
      CC [M]  /tmp/ndiswrapper-0.9/driver/proc.o
      CC [M]  /tmp/ndiswrapper-0.9/driver/divdi3.o
      CC [M]  /tmp/ndiswrapper-0.9/driver/hal.o
      LD [M]  /tmp/ndiswrapper-0.9/driver/ndiswrapper.o
      Building modules, stage 2.
      MODPOST
      CC      /tmp/ndiswrapper-0.9/driver/ndiswrapper.mod.o
      LD [M]  /tmp/ndiswrapper-0.9/driver/ndiswrapper.ko
    make[2]: Leaving directory `/usr/src/kernel-headers-2.6.5-1-686'
    mkdir -p /lib/modules/2.6.5-1-686/misc
    install -m 0644 ndiswrapper.ko /lib/modules/2.6.5-1-686/misc
    /sbin/depmod -a
    make[1]: Leaving directory `/tmp/ndiswrapper-0.9/driver'
    make -C utils install
    make[1]: Entering directory `/tmp/ndiswrapper-0.9/utils'
    cc -Wall -g   -c -o wlan_radio_averatec_5110hx.o wlan_radio_averatec_5110hx.c
    gcc -o wlan_radio_averatec_5110hx wlan_radio_averatec_5110hx.o
    cc -Wall -g   -c -o loadndisdriver.o loadndisdriver.c
    gcc -o loadndisdriver loadndisdriver.o
    install -m 755 loadndisdriver /sbin
    install -m 755 ndiswrapper /usr/sbin
    install -m 755 wlan_radio_averatec_5110hx /usr/sbin
    make[1]: Leaving directory `/tmp/ndiswrapper-0.9/utils'



NdisWrapper 的使用方式:

 在 ndiswrapper 套件中則提供了 ndiswrapper 這個程式來管理所載入的 Win32 驅動程式:

代碼: 選擇全部
-i inffile
 藉由 inf 檔案來安裝 Win32 驅動程式。

-e driver
 移除 Win32 驅動程式。

-l
 顯示已安裝的 Win32 驅動程式列表。

-m
 將 modprobe 設定寫入設定檔中。


 如果您有安裝 ndiswrapper-rtl8180 套件,
 使用 ndiswrapper -l 就可以看到已安裝了 net8180 這個 Win32 驅動程式:

代碼: 選擇全部
# ndiswrapper -l
Installed ndis drivers:
net8180


 否則,請用以下指令來下載並安裝 net8180 這個 Win32 驅動程式:

代碼: 選擇全部
// 建立一個名為 rtl8180l 之目錄
# mkdir rtl8180l
# cd rtl8180l/

// 下載 Win32 版的驅動程式
# wget 'ftp://ftp1.realtek.com.tw/cn/wlan/rtl8180l/winxp-8180(169).zip'
--16:47:19--  ftp://ftp1.realtek.com.tw/cn/wlan/rtl8180l/winxp-8180(169).zip
  => `winxp-8180(169).zip'
Resolving ftp1.realtek.com.tw... 152.104.125.40

Connecting to ftp1.realtek.com.tw[152.104.125.40]:21... connected.
Logging in as anonymous ... Logged in!
==> SYST ... done.    ==> PWD ... done.
==> TYPE I ... done.  ==> CWD /cn/wlan/rtl8180l ... done.
==> PORT ... done.    ==> RETR winxp-8180(169).zip ... done.
Length: 108,647 (unauthoritative)

        100%[==============================================>] 108,647      101.15K/s

16:47:21 (100.91 KB/s) - `winxp-8180(169).zip' saved [108647]

// 將其解壓縮
# unzip winxp-8180\(169\).zip
Archive:  winxp-8180(169).zip
          inflating: Release.txt
          inflating: rtl8180.sys
          inflating: Net8180.cat
          inflating: NET8180.INF

// 進行安裝
# ndiswrapper -i NET8180.INF
Installing net8180

// 檢視是否正確安裝了
# ndiswrapper -l
Installed ndis drivers:
net8180



載入 ndiswrapper:

 在 Win32 版的驅動程式安裝完成後,
 使用以下方法來載入 ndiswrapper 模組:
代碼: 選擇全部
# modprobe ndiswrapper


 若沒有任何錯誤訊息,
 則使用以下指令來檢視 Linux 是否能正確地驅動您的無線網路卡:
代碼: 選擇全部
# ifconfig -a
wlan0     Link encap:Ethernet  HWaddr 00:09:44:C2:15:F0
          BROADCAST MULTICAST  MTU:1500  Metric:1
          RX packets:0 errors:0 dropped:0 overruns:0 frame:0
          TX packets:0 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:1000
          RX bytes:0 (0.0 b)  TX bytes:0 (0.0 b)
          Interrupt:11 Memory:20800000-208000ff


 一般而言,無網網路卡的裝置多以 wlan# 來命名。
 但有很多應用程式只能偵測到 eth%d 的裝置,
 對於 wlan%d 的支援度並不是很好,如:pppoeconf 等等。
 如果您希望在載入 ndiswrapper 時所使用的裝置名稱是 eth%d 的話,
 可以替而用以下指令來載入 ndiswrapper:
代碼: 選擇全部
# modprobe ndiswrapper if_name=eth%d


讓 Linux 開機時即自動載入 ndiswrapper:

 如果一切都沒有問題,
 就把它寫入 /etc/modules 或是 /etc/modules-2.6 吧:
代碼: 選擇全部
# echo 'ndiswrapper if_name=eth%d' >> /etc/modules

 這樣子 Linux 在開機時就可以抓到無線網路卡了。


後記:

 將 Win32 版的 Binary 驅動程式模擬成一個 Linux 的驅動模組?
 真訝於 Linuxer 山不轉路轉的跳躍式思考模式。
 在 Linux 裡實在有太多不可思議的技術、創意及巧思,
 在此我們又欣賞到了一段極炫目華麗的不凡演出。

 Linux 真的是讓人處處充滿驚奇呀!



順便慶祝一下個人的灌水第 1900 篇。
快突破 2000 篇大關囉∼∼,嘻∼∼
時間並不能治療我心中的疼痛
南方的春天說什麼也溫暖不了我冰冷的血

誦唱大復活咒文,今天的 Tetralet 又在唧唧喳喳了 重生!
Tetralet
俺是博士
俺是博士
 
文章: 3078
註冊時間: 週四 11月 28, 2002 3:02 pm

回到 share

誰在線上

正在瀏覽這個版面的使用者:沒有註冊會員 和 1 位訪客

cron