Thursday, January 31, 2008

Important Patch for FreeWLAN Addons

特別感謝

感謝阿德、Freddy提供發生問題的FON進行研究,才會有這個解決方法的誕生!相關留言可在FreeWLAN的介紹網頁找到。

以下是參加本次測試的陣容,先來一張大合照 XD 有種FON艦隊出航的感覺


Fig 1: Put All FONs Together! (Click to enlarge)


名詞定義

QRM Mode
假設(1)透過實體網路線上網,(2)連線至(1)的Private WiFi Signal上網,FreeWLAN開發者稱(2)的運作模式為QRM Mode,以下統一使用此稱呼。


發生的問題

主要的問題,就是安裝此Addons之後,又做了某些設定,造成FON無法正常開機。雖然透過Ethernet仍可以ping 169.254.255.1且得到回應,但無法連上FON的SSH、網頁管理介面,無線網路的兩Signals也都無法正常運作,再加上Reset鍵無法成功恢復至出廠設定值,此時FON就變成一塊具有優雅線條的白磚Orz。

收到發生問題的FON之後,使用Serial Console Cable查看FreeWLAN位在/etc/config的設定檔,發現故障的FON都使用了QRM Mode。實際觀察後,發現卡住的位置屬於開機程序的一部分。以下圖為例,此時它在搜尋另一台AP的Wireless Signal,並嘗試取得IP位址。


Fig 2: In QRM Mode: Connecting to AP (Click to enlarge)


重製問題

在進一步探討問題發生的原因之前,通常會先嘗試在其它正常的FON重製問題,並記錄、分析操作的步驟,這樣才能對症下藥。經過反覆的測試後,得到了以下一定會發生問題的步驟:
  • 恢復出廠設定值並裝好FreeWLAN

  • 設定FON為QRM Mode

  • 想辦法讓這台FON無法連線至另一台AP:
    輸入另一個AP錯誤的連線資訊,如密碼、ESSID
    關閉另一台AP,也有一樣的效果

  • Submit後重開FON

  • You got a bricked FON!

調製解藥

深入測試這些情況後,發現只有使用QRM Mode時,才會有卡住的現象使用網路線連線,即使無法成功連線,更甚至於沒接網路線,也不會有卡住的現象。個人認為,這應該是使用WiFi連線特有的現象,看起來就像是底層硬體沒就位,但又嘗試使用此裝置,存取該裝置的程式就會卡住。實際原因可能是硬體本身限制,或是Device Driver有問題。此問題與DHCP有無使用並無直接關聯,即使手動設定IP位址,仍無法解決問題;與無線網路加密與否也無關,只要使用任何的加密連線模式,就會遇到目前提及的現象;未使用加密連線,雖然會出現另一種現象,但最後的結果是一樣的XD,錯誤訊息請見下圖。


Fig 3: Linux Memory Dump (Click to enlarge)


開機過程中,FON內的Linux會依序執行每個該執行的指令檔或程式,只要開機過程中有程式未結束或在背景執行,就會造成在它後面的程式無法執行。實際上,啟動QRM Mode或網路連線相關的設定,比SSH、Reset Button、網頁管理介面要來得早,此時負責相關服務的程式還沒有啟動,這些功能自然無法使用。


注射解藥

實驗過各種組合後,發現解決的方法意外簡單,目前並未發現Side effect,所以請放心使用。至於FON原廠與FreeWLAN開發人員並未進行類似的調整,讓FON變得更強壯,個人認為可能是因為Linux的傳統[1]吧,這樣才能保持Linux系統開機Script的一致性。

執行以下操作之後,可提前網頁管理介面和Reset Button程式啟動的時間。即使連線、設定發生問題,仍可藉由Reset Button恢復出廠設定值,或透過Ethernet進入管理介面修改設定值。至於為什麼不順便提前啟動SSH Server(dropbear),個人有考慮過實用性的問題[2],若有實際需求,也歡迎自行測試!以下是操作步驟:
  • 若您的FON尚未註冊,建議您先完成註冊程序,再來安裝FreeWLAN

  • 完成FreeWLAN所需的安裝程序

  • 安裝完成後,進入網頁管理介面的Advanced->Diagnostics

  • 請自行連接以下二行成同一行,複製並貼至Command並按下Submit。連接完成後,此行開頭是mv,結尾是*,分號後面有無額外空白並不影響操作。務必確認已完整貼上,切勿斷行
    mv /etc/init.d/S65watchdog /etc/init.d/S01watchdog;
    ls /etc/init.d/S0*h*
  • Submit後,若畫面上方出現以下訊息,表示設定已完成!
    /etc/init.d/S01watchdog


使用解藥

調整過內部開機程序後,若又遇到FON發生問題時,有兩種方法可以解決問題。

直接恢復成出廠設定值
請將FON開機至少三分鐘以上,並壓住Reset Button約10~65秒,低於10秒或高於65秒皆無效。至於為什麼剛好是這個時間,請等候未來的Reset Button介紹XD。放開後,稍等一下WLAN燈就會熄滅,此時已經在重開機了,當WLAN燈再度亮起時,約等數分鐘後就可以正常使用了。

進入管理介面修改設定值
  • 設定電腦的IP位址為169.254.255.2,Subnet mask設為255.255.0.0。為確保操作成功,此設定IP的步驟勿省略

  • 把FON接上網路線,另一端可以連接Switch/Hub,直接接電腦更保險。網路線是否為跳線並不影響,FON可以自動偵測

  • 開啟FON,待WLAN燈亮起後,約15~30秒再進行下一步驟

  • 接上網路線並確認Ethernet燈亮起,此時使用瀏覽器嘗試開啟管理介面首頁

    http://169.254.255.1/

    某些情況下[3],首頁會變成一堆網頁原始碼,此時請改開啟以下網頁,之後再進入其它相關的設定頁面

    http://169.254.255.1/cgi-bin/webif/diag.sh

  • 透過網頁介面更改您的設定。如果變更設定後按下Submit,超過30秒仍未恢復成正常的網頁,實際上設定值已經存好了,但因內部開機程序卡住,無法立即套用設定值,造成網頁卡住,只要手動重開機後就會套用新設定值了

  • 如需在此恢復FON的出廠值,進入網頁管理介面的Advanced->Diagnostics,並貼上以下指令並按下Submit,完成後請重新啟動FON,即能恢復至出廠值
    rm -fr /jffs/*

使用限制

使用此Patch之後,以下是想得到有可能讓此Patch失效的情形
  • 硬體故障。這個連Serial Console Cable都沒輒,只能送修原廠。通常在此情況下,即使連續開機10分鐘以上,WLAN燈也不會亮起

  • 自行刷其它Firmware如DD-WRT。此動作會讓FON的設定值消失,故此Patch也會一起遺失。而且這個方法只保證能在原廠Firmware和FreeWLAN上運作

  • 裝完FreeWLAN卻忘記使用此Script。所謂的防呆不防蠢 XD

  • 手動砍除FON內部重要檔案。正常情況不會發生這樣的問題,若發生時會連開機程序都無法進入,故本Patch並無幫助,您需要的是Serial Console Cable.


適用未來FreeWLAN更新版本

若遇到FreeWLAN自動更新,通常此Patch還是能正常運作的,這兩個Script被更改的機會遠小於其它的Script。如果心裡覺得毛毛的,可以恢復成出廠值安裝FreeWLAN後,再重新套用Patch,察看是否能得到和先前版本相同的執行結果。


備註區

[1] 以下內容取自於Ubuntu Linux 7.10版的/etc/rcS.d/README
The following sequence points are defined at this time:

* After the S40 scripts have executed, all local file systems are mounted and networking is available. All device drivers have been initialized.

* After the S60 scripts have executed, the system clock has been set, NFS filesystems have been mounted (unless the system depends on the automounter,
which is started later) and the filesystems have been cleaned.
也就是說,若大家都按照上述的原則指定Script的啟動時機,只要到了特定階段,某些東西一定已經就位,所以通常Script開機啟動的順序是固定的,不會違背這些原則。

[2] 個人的考量是這樣子的:
  • 若需恢復至出廠值,在開機三分鐘之後,Reset Button直接壓個10秒應該會比進dropbear敲指令來得快 XD

  • 若需調整設定,直接接線進入網頁管理介面,通常會比進dropbear直接修改設定檔來得方便、快速

  • dropbear的啟動Script明顯比其它Script複雜,雖然未發現哪些Code可能會造成開機障礙,或是確定無法在需要時提供服務,仍不確定是否適合這樣修改。更改此Script的開機順序,相較起來風險會比其它大。此Script被FreeWLAN修改的機會較大,如果更改啟動順序,到時候有可能會鬧雙胞,或是無法正常更新FreeWLAN

  • 最小修改的原則。既可以達到目的,同時又只需修改最少的東西,能儘量減少修改FreeWLAN的東西是最好的


[3] 某些情況下,FON內部的/etc/resolv.conf檔案並未產生出來,此時進入網頁管理介面時,首頁的Script會讀取此檔案,但因無法找到該檔案,造成網頁產生不正確,所以顯示在瀏覽器的頁面就會是網頁的原始碼

6 comments:

Ryan1 said...

你好~~我剛剛想試著刷FreeWlan一直沒成功
先講一下我的步驟:
首先拔掉網路線 reset到0.7.1 r1
連上MyPlace 進入192.168.10.1 管理頁面
更改Public SSID : FON_ADDON
更改connect mode為static IP
DNS server:88.198.165.155
然後IP,subnet,gatway 我是輸入在windows comment line下打ipconfig所得到的
(是不是在這邊的問題...??)
連上網重開機等20分鐘都沒反應
連上管理頁面依然是..0.7.1 r1
謝謝....

(T)ttrick said...

XD 你不是用PPPoE連線嗎
那這個方法不適合你哦
因為官方Firmware無法在使用PPPoE的情況下
手動指定DNS Server

你可以使用離線安裝的方式
詳情可以參考這個網頁
找一下裡面吧
個人現階段建議裝0.9.2
再慢慢手動升到0.9.3a
不要直接裝0.9.4(目前最新版)
因為這版就算上了Patch
個人還是有碰到某些設定值存不起來
這樣要試東西會很麻煩 XD

Ryan1 said...

你好喔~~我又來問問題了
我照你上面說的 我用off-line install的方式將我手邊的兩台fon都安裝0.9.2了

那請問我剛怎麼用serial console來手動升級成0.9.3a呢??
該下哪些指令呢??

謝謝你喔~~ ^^
抱歉喔~~我網路方面的知識滿有限的 XD
正在努力學習中 ^^

Ryan1 said...

再問一下喔~~
我用PPPoE的連線方式 是不是不能玩WLAN mode阿!?
我剛剛有試一下 情況如下
我AP1插網路線 AP2沒插網路線
AP2用WLAN mode填入AP1 的SSID及WPA
然後下面還要填入static IP setting
之後兩台都重開機 我可以抓到兩台的SSID

然後連上AP2的SSID到管理頁面看
status那邊有顯示抓到AP1的訊號
但沒辦法連上網路

換成連上AP1的SSID
結果管理頁面跟網路都連不上

AP2關機 AP1重開機
這樣AP1就正常了 又可以上網了

所以PPPoE是不是也不能玩WLAN mode?
抱歉抱歉~我的問題都滿蠢的= =

(T)ttrick said...

其實升不升級至0.9.3a是奇模子的問題XD
其實它只是修正些小問題而已
並不影響主要的功能

既然您會Linux 那我就不做太多整理了 XD
當時我是整理成以下指令 並分別讓FON執行
每次升級至下一個版本皆會自動重開機一次
這樣比較保險
檔案為了自己方便起見 都放在我的Server上
且裡面的Script有的有小部分修改
如果有需要原始檔案的話
可以來這裡

以下每個Stage皆為4行指令
有被換行的話就自己接吧 XD
# Install FreeWLAN 0.9.3 Update
wget -O /tmp/addons-0.9.3_update.tar.gz http://sed.homelinux.org/fon/addons-0.9.3_update.tar.gz
wget -O /tmp/update-offline.sh http://sed.homelinux.org/fon/update-offline.sh
chmod +x /tmp/update-offline.sh
/tmp/update-offline.sh 0.9.3

此時會重新啟動

# Install FreeWLAN 0.9.3a Update
wget -O /tmp/addons-0.9.3a_update.tar.gz http://sed.homelinux.org/fon/addons-0.9.3a_update.tar.gz
wget -O /tmp/update-offline.sh http://sed.homelinux.org/fon/update-offline.sh
chmod +x /tmp/update-offline.sh
/tmp/update-offline.sh 0.9.3a

到這裡就完成了!

(T)ttrick said...

應該不會吧 不過我沒試過就是了
您是使用0.9.2~0.9.3a之間的版本嗎??
最新版的0.9.4或許會有些怪問題XD

你可以看看AP2有沒有抓到IP 還有DNS那些的設定
再traceroute一下 應該就可以找到出問題的地方
建議可以使用DHCP自動設定
基本上分配到的IP應該要和網卡連至AP1相同
AP1應該沒開Bridge吧?!

建議務必把AP1和AP2 DHCP分配的網段分開
可能可以避免一些怪問題
例如一個用192.168.10.0/24
另一個用192.168.11.0/24

另外使用完AP2再切換至AP1
最好手動Check一下IP是否有被換成另一個AP分配的IP
有時候不會自動更新

不會啦 ^^"
您的問題都是比較少碰到的問題
我比較怕的是重複問到爛的問題 XD