2014年9月6日 星期六

赤手空拳也要用 wpa_supplicant 接通無線網路

兩手空空就可以 wifi 連線... 就是比較帥氣 多數版本的 linux 都有圖形介面可以設定 wifi 連線, 就連輕巧的 antix 也有 wicd 可用。 但是萬一困在某些「沒有中文、 沒有圖形介面」的陽春版 linux 環境底下, 該如何設定無線網路連線呢? 拿出一部已經找不到驅動程式的淘汰 windows 筆記電腦或是一顆找不到驅動程式的 usb 無線網卡、 插上你的 finnix 救援隨身碟, 跟貴哥一起從檢查 firmware 到設定 wpa_supplicant 整個流程做一遍, 以後你將不再害怕無線網路設定。 好吧, 嚴格來說不算完全赤手空拳, 但是已經足夠讓旁人敬佩了。

一、 有抓到網卡嗎?

[2017/5/28 補充這節] 首先檢查 OS 有沒有偵測到硬體: dmesg | grep -i wifi 如果有印出任何內容, 請直接跳到下一節。 如果是空白, 有幾個可能性。

第一, 如果是外接的 usb 網卡, 有可能因為 usb 電力不足而讓電腦看不見。 試著卸載並拔掉非立即需要的 usb 裝置, 再重新插入網卡看看。

第二, 有可能是升級核心時, 漏裝了 linux-image-extra 套件 -- wifi 驅動程式都在這個套件裡。 用 uname -r 查出 kernel 版本, 再用 dpkg -l | grep ' linux' | grep 版本 查看跟 linux 核心相關的套件。 例如我的 lubuntu 16.04 的核心版本是 4.8.0-41-generic, 那麼除了 linux-image-4.8.0-41-generic 套件之外, 應該還需要安裝 linux-image-extra-4.8.0-41-generic 套件, 才會有 wifi 驅動程式 (在 /lib/modules/4.8.0-36-generic/kernel/drivers/net/wireless/ 底下)。

二、 能啟用網卡嗎?

如果 dmesg | grep -i wifi 有印出一些訊息, 但是 /sbin/ifconfig -a 卻看不見 (名為 wlan0 或 wlp3s0 之類的) wifi 裝置, 請用 ifconfig wlp3s0 up 之類的指令啟用它。 如果啟用成功, 請直接跳到下一節。

dmesg | less 然後 (按 / ) 搜尋 wifi 例如在我的 x220i 筆電上, 看到附近的訊息如下:

[    6.999329] Intel(R) Wireless WiFi driver for Linux, in-tree:
[    6.999332] Copyright(c) 2003-2013 Intel Corporation
[    6.999463] iwlwifi 0000:03:00.0: irq 43 for MSI/MSI-X
[    7.042618] microcode: CPU0 sig=0x206a7, pf=0x10, revision=0x15
[    7.246183] iwlwifi 0000:03:00.0: firmware: agent aborted loading iwlwifi-1000-5.ucode (not found?)
[    7.246781] platform microcode: firmware: agent aborted loading intel-ucode/06-2a-07 (not found?)
[    7.246880] microcode: Microcode Update Driver: v2.00 <tigran@aivazian.fsnet.co.uk>, Peter Oruba
[    7.247238] iwlwifi 0000:03:00.0: firmware: agent aborted loading iwlwifi-1000-4.ucode (not found?)
[    7.248035] iwlwifi 0000:03:00.0: firmware: agent aborted loading iwlwifi-1000-3.ucode (not found?)
[    7.250482] iwlwifi 0000:03:00.0: firmware: agent aborted loading iwlwifi-1000-2.ucode (not found?)
[    7.251890] iwlwifi 0000:03:00.0: firmware: agent aborted loading iwlwifi-1000-1.ucode (not found?)
[    7.251960] iwlwifi 0000:03:00.0: no suitable firmware found!

通常筆電內建網卡比較容易抓不到。 如果上述指令找不到 wifi 相關的訊息, 用筆電型號加上 「linux wifi」 搜尋也無法解決問題, 那就只好哭吧... 這時, 最簡單的解決方式就是買一張外接的 「usb 網卡」 (請搜尋)。 隨便一個沒聽過牌子的便宜型號, 在 linux 底下幾乎也都是隨插即用。 付錢之前記得先上網查一下。 至於那些沒錢有毅力的讀者則可以再努力一下: 先用 lsusb 跟 lspci 指令 查看你的網卡型號, 再用網卡型號 google 或直接到 這一頁 查看該用哪一個適當的模組, 最後再研究詳細的文件: Wireless network configuration

總之, 大多數人應該跟我一樣會找到 "aborted loading"。 這就表示 linux 其實已偵測到硬體 (上面第一段標示處)、 載入正確的無線網卡模組 (上面第二段標示處; 以我而言是 iwlwifi)。 只是有些 wifi 的硬體特別刁鑽, 另外還需要用到廠商所提供、 不自由的專屬韌體。 Linux 通常把這些專屬韌體放在 /lib/firmware 底下。 但是某些嚴格遵守自由宗旨的版本或是精簡的版本預設不安裝, 所以它的 /lib/firmware 是空的 -- 例如 finnix。 這時可以找其他任何一部 linux 電腦 (或掛載本電腦上面另一個完整版本的 linux 的分割), 檢視它的 /lib/firmware 目錄, 把相關的韌體 copy 過來。 可能有好幾個版本的韌體都可以驅動這個硬體; 你只需要其中一個。 以這裡為例, iwlwifi 模組最優先想要載入的是 iwlwifi-1000-5.ucode (上面第三段標示處), 所以你只需要把這一個檔案從別部電腦 (或從別的分割) copy 到 /lib/firmware 就可以了; 後面的檔案可忽略。

然後移除無線網卡模組 (你的網卡模組名稱可能與我的不同)、 重新載入一次:

rmmod iwlwifi
modprobe iwlwifi

這時再下 ifconfig -a 重新檢查一次, 應該就會看到 wlan0 了。

三、 萬用的 wpa_supplicant 幫你連上無線分享器

在圖形介面下, 可以用 wicd 設定有線/無線網路。 但是貴哥要看到命令列才有安全感。 所以我找到了 wpa_supplicant , 可以跟 WPA、 (幾分鐘就被破解的) WEP 或是沒有加密的無線基地臺連線。

  1. 安裝套件: apt-get install wpasupplicant
  2. 把這個設定檔 wpa_supplicant.conf 存成 /etc/wpa_supplicant/wpa_supplicant.conf 並且 chmod 600 /etc/wpa_supplicant/wpa_supplicant.conf 關閉對外權限以策安全!
  3. 編輯上述設定檔,輸入正確的 ssid 及密碼。 更完整的範例檔請見 這裡注意! 很多店家用電話號碼當做密碼。 這有可能被分享器直接當成十六進位數字。 在某些情況下如果無法連線, 請試著把引號拿掉。 詳見 手冊 談 quote 的部分。
  4. 先用 route -n 確認一下網卡還沒連線。
  5. 拿密碼向無線基地臺認證: wpa_supplicant -B -i wlan0 -D nl80211 -c /etc/wpa_supplicant/wpa_supplicant.conf 這裡的 -i 後面要打網卡名稱 -- 就是先前 ifconfig -a 看到的。 至於 -D 後面則要打網卡驅動程式名稱 -- 這跟前面看到的無關, 而是要選 wpa_supplicant 所提供的驅動程式之一。 有哪些驅動程式可選? 下 wpa_supplicant -h 找到 drivers 那一小段, 逐一試試看吧。 詳見 這個問答
  6. 向無線基地臺要網址等等: dhclient wlan0
  7. 重下一次 route -n 應該就看到連線成功了。

四、 管理很多個基地臺連線資訊

如果遇到設定比較複雜的無線基地臺, 請參考 這一頁

如果同時有好幾個無線基地臺可以連, wpa_supplicant 會如何挑選? 找不到官方文件, 手冊 只簡單地說: 會根據設定檔內各個基地臺出現的順序、 網路安全性、 訊號強度來自動挑選。

另外, 提醒一下 2014 年 7 月所發現的 「Android 廣播你曾經連過的 wifi 連線」 這個隱私問題, 底層有問題的程式碼其實就是 wpa_supplicant。 未來的版本應該會修正。

採用 finnix 開機光碟的讀者, 可以直接跳到結論。 下一節是給硬碟版本的 linux 用戶。

五、 開機時自動連上無線網路; 等超久? 丟到背景去執行

測試成功之後, 接下來要把它寫入設定檔, 以便開機時自動連線。 wpa_supplicant 的文件好像不太齊全。 我在 debian 官方文件 找不到 「如何把命令列的 -D 選項寫進設定檔」; 只搜尋到 1 2 等等範例, 看來是用 wpa-driver 來設定。 請在 /etc/network/interfaces 裡面補上這段:

auto wlan0
iface wlan0 inet dhcp
 wpa-driver nl80211 # 這裡當然要改成你自己試出來的 driver
 wpa-conf /etc/wpa_supplicant/wpa_supplicant.conf

從此以後一開機, 無線網路就會自動連線。 每當更改過設定檔 (例如新增/修改基地臺的 ssid 與密碼) 之後, 也可以用 ifdown wlan0ifup wlan0 重新啟動 wifi 連線。

但是如上設定完成之後, 當你離開熟知的基地臺範圍, 開機時為了要等 wifi 連線, 會卡很久。 伺服器也許有必要等網路通了再啟動其他服務; 至於筆電, 不如把 wifi 連線丟到背景去執行。 所以我的做法是: 第一, 先註解掉 auto wlan0 那一句, 也就是叫系統在開機時別自動連 wifi。 第二, 在 /etc/rc.local 裡面加一句: (date ; ifup wlan0) > /root/wifi.log 2>&1 把 wifi 連線的動作丟到背景執行, 錯誤訊息記錄在 /root/wifi.log 裡面。

六、 結論

請把貴哥這一帖跟不到 30MB 的 /lib/firware 都 copy 到你的 finnix 隨身碟上。 雖然用 finnix 無法讀中文, 但至少讀指令跟設定檔沒問題。 下次遇到 「因為找不到/無法安裝驅動程式而無法上網」 的舊電腦加無線網卡, 就可以很帥氣地表演文字模式徙手上網了 :-) 還可以進一步建議把 開機管理員 grub 超輕薄的 finnix 救援光碟 裝到他的電腦裡面去。 但約會場合請小心服用, 以免 ... Computer Dating, Linux Style ...你的初戀就 GG 了 :-)

1 則留言:

  1. 您好:我們是日本WIFI機租賃公司
    接收超強DOCOMO訊號
    暢遊日本走到哪聊到哪
    4GLTE+最新WIMAX2
    歡迎來電洽詢(03)3830101
    網路訂購介面:http://a27598706.pixnet.net/blog

    回覆刪除