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

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

一、 抓不到網卡?

首先檢查硬體偵測是否成功: ifconfig -a 除了看到 虛擬的 lo 網卡跟 eth0、 eth1 之類的有線網卡之外, 有沒有看到 wlan0 之類的無線網卡裝置? 如果有, 請直接跳到下一節。

如果沒有, 請下: dmesg | less 然後 (按 / ) 搜尋 aborted loading 例如在我的 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!

如果找不到類似的訊息, 那就只好哭吧... Linux 已支援幾乎所有無線網卡, 你手上居然中獎這樣絕少的例外, 建議把它供起來當標本, 另外買一個 usb 無線網卡吧。 付錢之前記得先上網查一下。 至於那些沒錢有毅力的讀者則可以再努力一下: 先用 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 了 :-)