NDISwrapper:在 Linux 用 Windows 無線網路卡驅動程式

作者:徐秉義(Albert Hsu)

Linux kernel 強處與優勢在於「驅動種類繁多的硬體」「支援歷史悠久 Unix-Based 軟體以及新一代開發的 Linux 應用程式」,面對琳瑯滿目的各類硬體,Linux 的支援程度可謂不遺餘力,但是很多的桌上型硬體,可能因為銷量不大或基於成本考量,並沒有出給 Linux 驅動程式,但一定有給 Windows 的驅動程式,此時 Linux 只好使用一些「特別」方式,來想辦法使用這些只有 Windows 驅動程式的硬體。

有鑑於此 Linux 針對只有 Windows 驅動程式的無線網路卡硬體想出了一個辦法,就是使用 NDISwrapper 這個軟體載入 Windows 驅動程式,照樣能在 Linux 上面驅動這些只有 Windows 驅動程式的無線網路卡。

下表說明在 Linux 下驅動無線網路卡的可行方案,有 Linux 內建的話就用內建驅動程式,沒有內建的話看看有沒有原始程式碼來編譯驅動程式,不然就是使用 NDISwrapper 載入 Windows 驅動程式也行。

 

Linux 無線網路卡
驅動程式提供情況
Linux 無線網路卡驅動流程與方法
有內建 Linux 驅動程式使用 modprobe 或 insmod 指令
載入此硬體對應的驅動程式模組
無內建 Linux 驅動程式
廠商有提供驅動程式原始碼
由原始碼編譯(通常用 gcc)驅動程式
無內建 Linux 驅動程式
廠商僅提供 Windows 驅動程式
使用 NDISwrapper 載入 Windows 驅動程式

筆者使用 ASUS(華碩)型號 WL-169gE(USB 介面)無線網路卡來介紹,此款就是屬於無內建 Linux 驅動程式僅提供 Windows 驅動程式的那一種,所以採用 NDISwrapper 載入 Windows 驅動程式方案(也就是本文介紹的重點)。

NDISwrapper 軟體下載

至 http://ndiswrapper.sourceforge.net/ 點選左邊【Download】下載軟體原始碼,筆者下載到的版本為「ndiswrapper-1.51.tar.gz」。

磁碟狀態

編譯與安裝 NDISwrapper

拿到 NDISwrapper 原始程式碼後,接著就是「解開」「進入目錄」「編譯」與「安裝」的流程如下:

使用指令「tar -zxvf ndiswrapper-1.51.tar.gz」解開包裹

使用指令「cd ndiswrapper-1.51」進入目錄

使用指令「make」編譯程式

磁碟狀態

使用指令「make install」安裝程式,主要安裝了 ndiswrapper 程式與核心模組 ndiswrapper.ko 檔案。

溫馨提示:編譯期間若遇到『Kernel tree not found』錯誤的話(如下圖)應該是缺少 kernel 開發相關套件造成的錯誤。

磁碟狀態

遇到上述情況,在 RHEL5 只要把 kernel-devel 套件安裝起來即可(如下圖 yum 設定正常的情況下)指令「yum install kernel-devel」(請注意是相對應的 kernel 版本)

磁碟狀態

溫馨提示:編譯期間 gcc 套件也請記得安裝上去,不然會發生『gcc: command not found』錯誤,使用指令「yum install gcc」安裝 gcc 及相關套件即可。

磁碟狀態

Linux USB 相關指令:lsusb

拿到 USB 無線網路卡後,插上去之後正常的話 Linux 會自動抓到這個 USB 設備,使用指令「lsusb」會看到這個 USB 設備已經被 Linux 知道有這個硬體,但還不確定是否正常驅動,如果在這裡都沒被『發現新硬體』的話,就要先解決這邊的問題(有可能是 USB 故障或是 USB 在 BIOS 設定畫面就已被停用等等)。

溫馨提示:lsusb 搭配 -v 選項能看到更詳細的資訊。

磁碟狀態

在 google 找了有關這個設備 WL-169gE 與 Linux 相關的文章後,找到了這篇刊在 NDISwrapper 網站的文章 http://ndiswrapper.sourceforge.net/joomla/index.php?/component/option,com_openwiki/Itemid,33/id,list_a/ 第 55 項就是驅動此設備經驗之談。

溫馨提示:吸取他人過往經驗是節省自己時間的好方法。

磁碟狀態

至華碩下載 Windows 驅動程式

依照他人的經驗之談,這款無線網路卡若使用驅動程式光碟片上面的 driver 是不會作動的(CD drivers do not work)必須至華碩原廠下載驅動程式,筆者至「http://support.asus.com.tw/download/download.aspx?SLanguage=zh-tw」找了給 Windows XP 使用的驅動程式,檔案名稱為 Driver_5236670.zip 的壓縮檔案。

磁碟狀態

安裝 Windows 驅動程式

依照網站說明,先不將無線網路卡插上去,就先安裝 Windows 驅動程式。

遇到 zip 檔案使用「unzip Driver_5236670.zip」指令將他解開,會看到一個 Driver/ 目錄以及一堆檔案,其中「bcmrndis.inf」是用來安裝驅動程式的 inf 檔案。

磁碟狀態

使用指令「ndiswrapper -i Driver/bcmrndis.inf」來安裝驅動程式(看似安裝正常)。

磁碟狀態

使用指令「ndiswrapper -l」來列出安裝後驅動程式,請注意:出現『無效的驅動程式』訊息,應該是尚未將相關檔案拷貝過去所造成的問題。

磁碟狀態

依照網站指示來拷貝相關檔案(使用小寫字母)

指令「cp Driver/RNDISMPK.sys /etc/ndiswrapper/bcmrndis/rndismpk.sys」(注意大小寫)

指令「cp Driver/usb8023k.sys /etc/ndiswrapper/bcmrndis/usb8023k.sys」

接下來「ndiswrapper -l」就會是 driver installed 的正常訊息。

磁碟狀態

處理 udev 相關設定

在 Linux Kernel 2.6 以後,對於裝置檔案(device)的處理方式已有所不同:早期 2.4 版本以前的 Kernel 裝置檔案是『靜態的』,新一代(2.6 以後)的裝置改採用『動態方式管理』(dynamic device management)而相關設定則是寫在 /etc/udev/ 目錄下。

下圖為指令「man udev」暨 udev 的說明文件,udev 促使裝置檔案(位於 /dev/ 目錄下)、網路介面能動態產生,也就是有需要才出現。

磁碟狀態

依照網站說明的指示,建立檔案「/etc/udev/rules.d/99-custom.rules」內容「BUS=="usb", SYSFS{idProduct}=="1717", SYSFS{idVendor}==”0B05", RUN+="/bin/sh -c 'echo 1 > /sys/$devpath/device/bConfigurationValue'"」並且重新啟動 udev daemon(udevd),筆者重新啟動 udev daemon 是使用「ps 搭配管線與 grep、kill 或 killall、udevd」這一類的指令。

磁碟狀態

這 udev 處理好了以後,「理論上」只要將無線網路卡插上去,稍待 Linux 抓到這張卡後 udev 執行 echo 1 > /sys/$devpath/device/bConfigurationValue 那行指令,將 bConfigurationValue 數值設定成 1 ,接著使用 ip、ifconfig 或 iwconfig 就會看到 wlan0 這個網路介面。

磁碟狀態

故障排除與常見問題

底下針對驅動無線網路卡所遇到的常見問題,作較詳細的說明:

載入 ndiswrapper 核心模組

筆者自己有發生過因 ndiswrapper 模組沒有載入,導致 wlan0 介面出不來的情況。理論上 Linux 會自動偵測並載入 ndiswrapper 這個模組(如果有用到相關功能的話),但有時候卻不見得會自動偵測並載入,就只好手動載入啦!使用指令「modprobe ndiswrapper」就載入了,可使用 lsmod 來觀察已經載入的核心模組。

溫馨提示:若設定「/etc/modprobe.conf」使之開機自動載入會更方便。

磁碟狀態

假使遇到 udev 運作不正常

筆者先前曾經遇到的狀況是:設定好 udev 相關檔案後,卻還是不見 wlan0 無線網路卡的蹤影;猜測可能的原因:要不就是 udev 沒有設定好,不然就是 udev 因不同版本的 Linux 而出現的 bug;後來使用的解決方式是:模仿「/etc/udev/rules.d/99-custom.rules」檔案內 echo 1 的那一行需求,手動地將 /sys/ 目錄下檔案名稱為 bConfigurationValue 數值設定成 1 來驅動 wlan0 無線網路卡。

使用指令「find /sys/ -iname bConfigurationValue」來找出 /sys/ 目錄下檔案名稱為 bConfigurationValue

使用指令

「echo 1 > /sys/devices/pci0000:00/0000:00:04.2/usb1/1-1/bConfigurationValue」

「echo 1 > /sys/devices/pci0000:00/0000:00:04.2/usb1/bConfigurationValue」

將數值設定成 1 來驅動 wlan0 無線網路卡

磁碟狀態

使用 Linux 內建驅動程式範例

以下是使用 Linux 內建驅動程式的一個範例,遇到這款晶片是驅動失敗的情況;但是讀者若是手邊有廠牌型號的無線網路卡,不妨拿來試試看。

此款 USB 無線網路卡所使用的晶片,按照網站上的說明,應是 Broadcom - BCM4320SKFBG 筆者在 Linux 核心模組內找到了一個名為 bcm43xx.ko 檔案,有點像是她的驅動程式,測試結果是手動載入驅動程式也是紋風不動(無法驅動)網路上搜尋了相關文件,看來只有 NDISwrapper 搭配 Windows 驅動程式才有辦法解決這個問題。

下圖是相關指令操作,使用內建 bcm43xx.ko 檔案無法驅動此 USB 無線網路卡。

lsmod 用來列出已經載入的核心模組。

find(搜尋)核心模組所放置的目錄,通常位於 /lib/modules/「核心版本」下。

modprobe bcm43xx 自動偵測相依性載入 bcm43xx 核心模組,之後在 lsmod 應該就可以看到。

iwconfig 用來設定(或觀察)無線網路設備,下圖訊息意味著還沒驅動成功這個無線網路卡。

磁碟狀態

iwconfig 指令簡介

iwconfig 是 Linux 上設定無線網路一個相當重要的指令,她的選項相當多也有一定的複雜度,使用指令「iwconfig -h」或「man iwconfig」可見到說明文件,筆者在這裡只是簡易示範 iwconfig 設定無線網路 essid 功能,使用指令「iwconfig wlan0 essid guest」將 wlan0 介面的 essid 設定成『guest』

溫馨提示:無線網路的設定在 Linux 已經有圖形化介面,也可以設定像是 WEP/WPA 加密通訊方式(WPA 需要加裝其他應用程式),只是還沒有像 Windows 介面(或是網卡硬體廠商提供的介面)那麼地人性化。

磁碟狀態

網路觀察指令

筆者在設定無線網路卡 wlan0 的 essid 後,使用「dhclient wlan0」指令來動態取得 IP 位址來連線,並使用指令「ifconfig」來觀察所取得的 IP、遮罩、廣播位址。

磁碟狀態

磁碟狀態

 

Valid XHTML 1.0! Valid CSS! Get Firefox

Creative Commons License
This site is licensed under a Creative Commons Attribution 2.5 Taiwan License.