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會讀取此檔案,但因無法找到該檔案,造成網頁產生不正確,所以顯示在瀏覽器的頁面就會是網頁的原始碼

Wednesday, January 30, 2008

Reset FON by Serial Console Cable

前言

如果完全無法進入FON的管理介面,且無法透過Reset Button重置您的FON,只要Firmware並沒有損毀、非硬體故障,就可以使用以下的方法來恢復FON至出廠預設值。在這之前,您需要一條FON的Serial Console Cable才能進行以下操作。

Note: 若您曾經刷過Firmware如DD-WRT,或是其它非官方版本之Firmware,可能不適用此文章的方法!而更新成FreeWLAN並不是刷Firmware,僅更換FON內部檔案,並未真正覆蓋原始的Firmware,可以使用此方法恢復至出廠預設值。


重置開始

重置的方法很簡單,請先連接至FON的Serial Console,並依實際情況嘗試以下兩種方法:

情境1
您使用FreeWLAN,因為設定錯誤讓FON無法正常運作,或者是使用官方Firmware,但因為意外更改或刪除某些重要檔案,造成FON無法正常開機。
或是使用Console時,看到了以下訊息(這表示JFFS出現了問題)
mini_fo_lookup: ERROR, meta data corruption detected.
mini_fo_d_delete: negative dentry passed.
mini_fo_d_release: no private data.

若為此種情況,請注意下圖的紅色標記訊息,出現後按下Enter鍵即可登入Console。


Fig 1: Login Serial Console (Click to enlarge)


登入後執行以下指令
rm -fr /jffs/*
reboot
接著會出現以下訊息
The system is going down NOW !!
Sending SIGTERM to all processes.
Please stand by while rebooting the system.
Restarting system.
等到重開機完成後,就會出現原廠的預設值了!


情境2
基於某些理由,刪除重要的系統執行檔,如busybox,或更進一步的刪除了/bin, /sbin等資料夾,使得情境1的方法無法使用、無法登入Console。若使用之前的方法,但FON的Hostname卻是寫(none),同樣也適用這個方法。

若遇到這樣的情況,請在以下紅色標記訊息出現時,立刻按下Enter鍵取得Console。剛開始操作時可能會有點停頓,這是正常現象,稍後會自動改善。此時您會發現Hostname寫的是(none)而不是OpenWrt,這表示您目前操作的系統,是直接來自於原廠Firmware的內容,而不是套用過JFFS後的結果,也就是您之前任何的刪除動作將會暫時視而不見。在此情況下,您可以執行出廠時就有的指令,且不會因為您之前修改檔案系統而有所不同。但如果JFFS正常,或是接下來的開機指令可以正常執行,雖然Hostname仍寫的是(none),您的檔案系統就會呈現之前修改過的樣子,此時可以嘗試執行情境1的指令,或許也能解決問題。


Fig 2: Login Another Part of Serial Console (Click to enlarge)


執行以下指令
rm -fr /rom/jffs/*
rm -fr /jffs/*
完成後,拔除電源重開機就可恢復至出廠預設值!

Make a Serial Console Cable for La Fonera

前言

這次要介紹的主角是Serial Console Cable。它最主要的用途,就是透過Serial Port來操作FON的Console,並能在FON一開機時取得內部訊息,對於想要完全惡搞的人來說,是一把強力的螺絲起子。大約是一年前,也就是去年FON剛到手時,聽說可以使用手機傳輸線,製作適合FON使用的Serial Console Cable,於是嘗試使用手邊的Nokia 3315傳輸線製作。記得當時花了不少時間,得到的結果卻是時有時無的開機訊息,或者是一堆亂碼,而且因為TX一直無法發揮作用,自然無法送出任何的按鍵,再加上當時FON已經無法正常運作,並未親眼看過成功運作的畫面長什麼樣子,所以無法確定是FON、傳輸線、軟體還是設定的問題。前一陣子看到RexTsai網友成功使用USB手機傳輸線製作Serial Console Cable,內心再度燃起一線生機!從文中看起來似乎真的是蠻簡單的,無需自行製作額外的電路。它使用的是USB介面,明顯比RS-232誘人許多,再加上觀眾要求,使得再度嘗試製作Serial Console Cable。


製作過程

1. CA-42傳輸線在網拍有N打的選擇,非常好找。以下非廣告!僅分享實際購買心得。這次購買的是道X科技的傳輸線,通常可以在「注目商品」區找到。以前和他買過Nokia 3310, 3100, Sony Ericsson T230傳輸線,再加上價位中等(整體而言約80-200元),且使用上大多沒遇到問題,自然會傾向於曾經買過的賣家。實際到手之後,確定使用的是PL-2303晶片,在XP安裝下相當容易。在晶片原廠的FAQ中,特別說明Vista的Driver並未釋出給一般使用者,而傳輸線光碟內也未找到Vista的Driver或相關的安裝方法,若您使用Vista,購買前務必確認是否適用

2. 到貨後,內容物有一USB傳輸線和光碟,光碟內容為Driver、手機圖鈴和Java遊戲。在尚未安裝Driver之前,千萬不要將傳輸線接上電腦


Fig 1: Cable With Its Driver CD (Click to enlarge)



Fig 2: CA-42 Connector (Click to enlarge)


3. 在惡搞傳輸線之前,應先確認傳輸線本身是否運作正常,所以先來處理Driver的問題。個人認為光碟其實可以不用理它,裡面附的XP Driver蠻舊的,而且光碟內整理的相當亂,很可能會不小心安裝多餘的程式。您可以到這裡下載最新的Driver,個人確定這是可以正常運作的。下圖是光碟上和網站下載Driver的版本與日期。


Fig 3: Version And Date Between Driver In CD And The Website (Click to enlarge)


4. 在安裝Driver之前,先確認是否曾經安裝過舊版PL-2303的Driver,若有的話務必先移除舊版,再重開機安裝新版。重開機的動作勿省略


Fig 4: Old Driver Should Be Removed First (Click to enlarge)


5. 安裝剛才下載的Driver,這部分沒什麼特別的選項,裝完就對了。安裝完成後記得一定要重開機,不要馬上就接上傳輸線

6. 接上手機傳輸線,此時會出現「找到新硬體」,結束後請至「裝置管理員」裡面,展開「連接埠(COM 和 LPT)」,並確認是否有下圖的裝置,裝置正常運作就可以看得到。請注意COM Port的號碼不一定會和您的相同,這是正常現象。


Fig 5: PL-2303 In Device Manager (Click to enlarge)


7. 雖然有Pinouts之類的網站,可以知道我們需要的RX, TX和GND是哪些針腳,實際上會發現傳輸線連接手機的那端,是由一個超大橡膠保護起來的,也許是個人不太會拆吧XD,並無法很簡單的得知哪條線是接在相對應的Pin上面,所以最省時間的方法,就是直接把連接手機的那頭剪掉吧XDXD。剪開後可以看到裡面包覆了三條線,而這三條線又分別對應到USB端,基本上您不需拆開USB端,直接參考下圖即可。從這裡開始統一使用下圖每條線的數字編號來稱呼,因為USB端的RX, TX容易與FON端的RX, TX混淆。藍色稱為(1),綠色稱為(3),白色稱為(4)。


Fig 6: USB Front Side Of Cable (Click to enlarge)


8. 由於拆開了傳輸線的USB端,造成USB端無法防止線路拉扯,後來接上FON之後,訊息時有時無,最後完全收不到訊息,此時才發現USB端的線早已斷裂,那個線實在是有夠細的,要拆USB端的務必小心!後來自己換了杜邦線之後,就變成了下面的樣子,雖然焊得比較醜,至少比原來的超細線可靠許多。若需要更換另外兩條短線,可參考另一張USB端背面的接線。(8)是連接正背面的接點,而(9)需三個接點連接在一起。


Fig 7: Replace The Broken Cable With My Own Cable (Click to enlarge)



Fig 8: USB Back Side Of Cable (Click to enlarge)


9. 由於線的另一端已有杜邦接頭,並不需要額外製作接頭。若您還找得到的話,可以使用光碟機音源線製作,或者使用任何1*4的接頭製作,這樣就可以直接接在FON上面。

10. 準備PuTTY等可以使用COM Port的程式。開啟後選擇Serial模式並輸入您的COM Port,Speed使用預設值9600即可。每條線請依下圖編號連接至FON端。您可以先連接(1)和(3)至FON,(4)務必等通電後再接上,否則會無法正常開機!尚未接好線前,出現亂碼是正常的,待(1)和(3)正確連接後,亂碼就會消失。(1)和(3)連接完成後,通電約10秒內應該可以看得到開機訊息。只要遇到需要重新通電的情況,(4)皆需暫時拔除,待通電後再接上,但Reset鍵或reboot指令則不在此限。若仍無法正常顯示開機訊息,可以試著對調(3)和(4)。


Fig 9: Connectors On The FON (Click to enlarge)


11. 當您看到以下FON的開機畫面,就可以準備把FON玩到翻過來了XD


Fig 10: Boot Message From FON Serial Console (Click to enlarge)


12. 最後來一張有點模糊的大合照


Fig 11: Put All Things Together! (Click to enlarge)