身為一個熱愛使用各種開放原碼韌體的開發者,我一直很關注各種可以應用第三方韌體的網通硬體產品。若要說起非官方韌體,最早的開放原碼社群起源之一就是 Linksys 的 WRT54G 系列產品。若你也曾尋找類似的產品,你會知道 Linksys WRT54G 一直都是最多開放原碼韌體支援的平台,而且可以採購特定版號 (v2 到 v4) 間的產品,因為這幾款早期的產品,尚未受到後來產品縮減成本的壓力,記憶體與快閃記憶體等硬體資源較多,容易安裝功能強大但佔用較多記憶體的第三方韌體版本。

雖說這款產品已經在市場上流通相當久,其中原廠的早期硬體版本早以斷貨。但是在拍賣網站或中國市場依然可以找到大量的早期硬體版本,甚至是裸版,價格有點渾亂,從接近原廠售價到幾乎是 BOM 成本的價格都有,數量不限。若稍微仔細查看,會發現產品上面的序號欄位是空白的,甚至沒有原廠品牌。原來這是傳說中仿冒原廠電路板與外觀設計的山寨版路由器。

令人聯想的是,為甚麽一般的 SOHO 家用等級無線路由器產品,技術門檻顯然比手機低許多,但卻沒有演化出同山寨手機一樣的複雜多樣性市場,反而更多還持續行品牌仿冒、產品複製的山寨老路。

筆者想主要的因素恐怕是毛利率與網通單調產品的特性。網通產品同手機不同的是,消費者不因為不同的外觀,或功能性潮流更換設備,許多網通設備都是安裝之後,在硬體故障前都不會進行異動或升級,除非需要有納入新技術的需求,如轉換至 IPv6 或 802.11n 等,才會考量因相容性而進行產品升級。

即便廠商在有限的變化中極力追求產品差異化,設計不同的外型,或特殊的韌體功能,但是相對太多多樣性的產品,也會造成製造、庫存等運營成本提高,利潤跟銷售量不見得會因此提昇。最終,能夠影響銷售量的,還是端看行銷資源的投入多寡。

於是這些中國山寨網通設備製造廠商,除了為其他自有品牌商代工外,最有穩定的利潤莫過於重複製造一些具備固定市場的特定模組產品。這些設備的固定族群來自進階使用者與系統整合商。以 WRT54G 而言,網路上有許多開放原碼的韌體系統,包含了 OpenWRT, DD-WRT, HyberWRT (已停止維護) 等,都支援此硬體平台。因此進階使用者或小規模系統整合商,甚至是無線網路分享社群,都有機會客製化自己的功能,並可以調整一些在原廠韌體中不予開放的選項,適用於不同的需求與應用。
Continue reading

前陣子翻查了 ASUS 的新版 (1.6) 軟體套件,發現華碩電腦為 P1000H, P1000HD, P904, P904HD 等新款機型找了幾個搭售的商業軟體。分別是 Ai Wizard (Dr E), Dr. Eye (譯點通), EeeStock, EzPeer, StarOffice, IQChinese Let’s Learn Chinese, Xcome XLex (擎願科技, 雙語字典通) 與 yostore 等。不過目前除了 IQChinese, XLex, yostore 有 P701 的更新檔,其他的軟體都只有含硬碟的機型上才有內建或可下載安裝檔。

老實說,身為一個使用 Debian GNU/Linux 作為桌面系統多年的使用者,我頗興奮看到這些商業軟體開始出現在 Linux 平台上,特別是除了 EEEPC 以外的眾多 Subnotebook,如Acer Aspire One, HP 2133 Mini-Note PC, Dell Inspiron Mini 9, OLPC XO-1, One A110, Skytone Alpha-400, CloudBook, Classmate PC, LG X110, MSI Wind PC, Lenovo IdeaPad SVIA OpenBook 等都搭售 Linux 出貨。剎那間,已經足夠撐起一個生態環境,讓軟體產業開始投資發展 Linux 桌面系統的軟體產品,而不僅有龐大的企業、伺服器用商用軟體。

試著安裝了比較感興趣的 Dr Eye、Eee Stock 與 EzPeer,發現這些軟體都加上了系統檢查功能,要嘛檢查核心版本、要嘛檢查 DMI 系統編號、或者根本去檢查記憶體內容,總之就是限制一般使用者將軟體移到其他安裝 Linux 的桌面系統上使用。每次你執行程式時,系統便會跳出以下視窗「抱歉,此軟體僅供Asus EeePC使用」,真是可惜。

雖說像 Dr. Eye 這樣的軟體,在 Linux 有 GPL 授權的 StarDict 的自由軟體可使用,但是眾多使用者都已經熟悉了 Dr. Eye 的使用介面與習慣,即使其他替代軟體的操作介面都非常類似,但許多使用者大概因為品牌因素使用 Dr. Eye 吧。但目前 Dr. Eye 在 Linux 的版本字庫非常貧乏,不知道什麼時候才有專業版出現?

除了常見的字典軟體,像先前介紹過的 Ezpeer 就沒有開源的替代軟體可使用,勢必要有商業法人取得音樂授權後,才能合法的線上聆聽音樂。在較新版的 Ezpeer V1.3.05 中,執行的權利也被關閉了。只有在 EeePC 上才能執行使用。

另外一個我個人認為非常實用的軟體是聲達資訊EeeStock 看盤軟體。日常的時候,我通常使用 Invest Stock 來看接近即時大盤與個股報價,也用 qtstalkerSMTM 來看盤後交易資訊與技術線圖。特別是 qtstalker 的技術線圖功能,類型多到眼花撩亂,且你還可自己寫報價與技術指標的模組,彈性非常大。而 Invest Stock 藏在 Gnome Panel 上,最適合隨時觀察一下大體走勢。兩個軟體得資訊來源都是 Yahoo, 使用時只要特別注意一下 Yahoo! Finance 的股市名稱,如 華碩為 2357.TW, 台股大盤指數為 ^TWII。Invest Stock 目前可於 gnome-applets 中取得,至於 qtstalker 由於缺乏 Sponsors 的原因,新版可於 Marco van Zwetselaar網站下載

但若你已經習慣玩台股,且在 Windows 上使用證卷商所提供的軟體,肯定已經習慣台股看盤軟體所提供的介面,選單上整合好了即時個股行情、類股、整合報價、上市、上櫃大盤、即時資訊、國際資訊等。操作起來實在非常便利。

最後,另我感興趣的軟體則是 StarOffice,StarOffice 目前下載版一套要價 USD 69.96,與 OpenOffice 的主要差異在於多了些私有版權的字型、圖庫、樣板、Adabas D 資料庫、巨集轉換等。相較起來,對使用者而言提供了更便利且合法的文書處理工具。

據聞 Google 軟體集 也免費提供 StarOffice 供下載,不過我實際逛了一下,發現其實目前沒有提供 Linux 版本的 StarOffice 免費下載。EeePC 使用者算是賺到一套相對好使的文書處理工具。不過 OO.o 對我而言已經足夠,便未額外安裝測試為 ASUS EeePC 客製化的 StarOffice.

看來 ASUS 恐怕礙於需防守於各家廠商所追進市場的新產品,必須與軟體商取得獨佔權,以便(暫時)保有領先地位。希望在今年接下來幾個月,市場陸續上市 Netbook 後,能夠看到更多商業軟體移植到 Linux 平台阿。

若你照著前幾篇文章,不小心真的把 WL-700gE 刷成 OpenWrt。一時後悔想換回來的話,這裡是一些技巧與方法。不過既然刷成功了,能夠享用更多的「自由」,何必後悔
😉

首先,機器上的 Reset 鈕是沒有用的。請不要浪費時間照的手冊試圖 “Reset” 你的機器。凡是透過 tftp 上傳軔體到 CFE 上,你就已經蓋掉官方軔體。既然都已經覆蓋了,就沒有 Reset 的可能性。

要復原軔體最簡單的作法莫過於直接使用 ASUS 所提供的 Firmware Restoration Tool 來重裝所有的軔體。

但是 Firmware Restoration Tool 只能在 Windows 上使用,若你像我一樣只使用 Linux,以下是復原的程序。

WL-700gE 的軔體分成兩個部份,一部分是給 flash 所使用的核心與基本的開機設定工具,一部分則是存在 IDE 硬碟的應用軟體與檔案系統。你在官方網站所下載的軔體都會包含這兩部份。

首先,你該做的是先 flash 部份的軔體從下載的 NAS 軔體檔案中抽出。你需要 nasunpack (uasunpack.exe) 或社群所開發的 AsusTrxExtract (AsusTrxExtract_1.0.0.1.zip),這些工具可以讓你將軔體解出。其中 AsusTrxExtract 是使用 C# 所開發,作者尚提供了原始碼,你可以於網路上搜尋下載。而 nasunacpk 則內含於 ASUS 所提供下載的 GPL 檔案中。

nasunacpk 使用方式很簡單,除了用 nasunpack 解開外,你尚必須去除檔案中的標頭,最後取出的檔案才是我們所需的原始檔

$ nasunpack --sections WL700gE_1.0.7.8.nas
section headers ---
00: type = 0x15 (BRCM_NAS_SECTION_TYPE_TAG  ), length =      126 bytes
01: type = 0x12 (BRCM_NAS_SECTION_TYPE_FLASH), length =  1691648 bytes
02: type = 0x13 (BRCM_NAS_SECTION_TYPE_DISK ), length = 16560128 bytes
$ nasunpack --extract=0,tag WL700gE_1.0.7.8.nas
dumping section 0 into tag...
$ cat tag
BroadNAS System Software
Version: 2.2.1
unknown
Build date: 三  7月 25 15:30:01 CST 2007
Build by: [email protected]
$ nasunpack --extract=1,flash WL700gE_1.0.7.8.nas
dumping section 1 into flash...
$ dd if=flash of=piggy.gz bs=1 skip=28
1691620+0 records in
1691620+0 records out
1691620 bytes (1.7 MB) copied, 8.40643 seconds, 201 kB/s
$ file piggy.gz
piggy.gz: gzip compressed data, was "piggy", from Unix, last modified: Wed Jun 27 21:42:29 2007, max compression
$ nasunpack --extract=2,disk WL700gE_1.0.7.8.nas
dumping section 2 into disk...
$ dd if=disk of=crom bs=1 skip=28
16560100+0 records in
16560100+0 records out
16560100 bytes (17 MB) copied, 81.0496 seconds, 204 kB/s
$ file crom
crom: Linux Compressed ROM File System data, little endian size 65536 CRC 0x911b22f7, edition -1278167390, 138541296 blocks, 1226466058 files

其中 crom 是 WL-700gE 會安裝於 disk 上得應用軟體,若你想研究內含的軟體,可以用 mount -o loop 將檔案掛載起來查看。而 piggy.gz 就是我們所需的 Linux kernel 核心檔案,接下來可以利用重新開機並按下 “Ez Button” 的方式,透過 CFE 重新燒錄舊版軔體。細節請參考 Wl-700gE Reflash HowTo

燒錄好原本的核心後,另外一個麻煩的是要重建原本存在 IDE 硬碟的應用軟體。若你沒有手賤的去亂刪除 /dev/mtdblock/2 的資料,核心應該在重新開機後會載入存於 /dev/mtdblock/2 (/dev/mtdblock/2 只是另外一個 MTD block) 的基本工具,其中包含了復原與重新格式化硬碟的機制。

第二個階段是比較妙的,由於 WL-700gE 在接受第二階段的 disk image 上傳時,會作檢驗,系統必須接受某種 UDP 的認證協定後,才會接受新的 disk image. 因此你沒辦法單純的用 tftp 上傳,這時可以用 nasload (一樣內含於 ASUS 所提供下載的 GPL 檔案中) 使用檔案進行上傳。

用法如下

$ nasload /U /P /a /1 /f WL700gE_1.0.7.8.nas

如此就可以將 WL-700gE 完全復原到出廠的狀態了!

在安裝過 OpenWrt 到 WL-700gE 上後,你得作個抉擇。是要持續使用 OpenWrt,或者選用其他的自由軟體套件系統,如 Debian GNU/Linux。若要繼續使用 OpenWrt,你可以將裝好的 OpenWrt Image 再倒入硬碟中,之後就可以以 ipkg 的機制安裝軟體。

也可以選擇安裝其他的套件系統,如已經被移植數千種軟體的 Debian 系統。且 Debian 是少數支援 mipsel 的套件系統之一。

安裝方式很簡單,你可以利用 cdebootstrap 造一個給 mipsel 使用的基礎系統 (base system),操作方式如下

# cdebootstrap -v --foreign --arch=mipsel lenny debian-distro http://ftp.tw.debian.org/debian
P: Retrieving Release
P: Retrieving Release.gpg
P: Validating Release
I: Good signature from "Debian Archive Automatic Signing Key (4.0/etch) <[email protected]>"
P: Parsing Release
P: Validating Packages.gz
P: Parsing Packages
P: Validating gcc-4.3-base
P: Validating libgcc1
...
...
...
P: Writing hosts
P: Writing resolv.conf
W: Creation of /dev/console failed
I: Second stage installer is available as /sbin/cdebootstrap-foreign or /sbin/init

上述指令,會為你建立一個 lenny 版本的 Debian 系統。若想擺入核心或其他套件的話,可加入額外參數如 –include=linux-image-2.6-sb1a-bcm91480b

你可以將上述 debian-distro 目錄壓縮後,丟到 WL-700gE 上再解到 IDE 硬碟的分割區中。然後透過修改 flash 中的 OpenWrt 之 preinit 等指令,預先載入該分割區,並利用 pivot_root 或 chroot 來更換系統目錄。待正確切換入系統後,再以 root 執行 /sbin/cdebootstrap-foreign 即可完成所有安裝程序。

開機的流程將會是 CFE -> OpenWrt -> Debian. 不過若使用 pivot_root 或 chroot 都會使系統使用 OpenWrt 的核心系統。

若想於 Debian 中使用不同的核心,不妨使用 kexec ,mipsel 平台的版本也已經被移植好。當然,你也得修改 OpenWrt 軔體中的 /sbin/init,讓系統自動搜尋你想使用的核心,並透過 kexec 線上重新載入新的核心系統。目前這個技術尚未有標準的設定檔作法或範例,戲法巧妙不同,就看你如何應用了。

更換 WL-700gE 軔體的方法相當容易,不過還是花了些時間測試。

剛取得機器的時候,透過出廠內建的 Bootloader CFE,在開機時按下 ezsetup 鈕,即可讓 CFE 進入 ‘Rescue mode‘ 接受 TFTP 上傳新的軔體,並自動燒入 nvram 中。

只要正確設定上傳方的 IP 與使用 TFTP Client,就可輕易的將軔體換成其他版本,細節可參考 OpenWrt Wiki 上的 HowTo。燒錄過程相當迅速,稍微計算一下,Flash 寫入 1.6M 的軔體,大約只需要 16 秒。

製作給 ASUS WL-700gE 的 OpenWrt 軔體也相當容易,由於開發者已經寫好 WL-700gE 的 Profile,你可以在 make menuconfig 時,直接選用 Broadcom BCM947xx/953xx [2.4],Profile 選 WL-700gE 即可。OpenWrt Buildroot 會為你建一個基本的軔體出來。

之所以選擇 2.4 核心的原因,是 WL-700gE 的無線網路驅動程式 broadcom-wl 目前只能在 2.4 上跑。而另外一組開放原碼的 b43 目前暫時只有 STA 模式,由於 mac80211 與 hostapd 的支援問題,Access Point mode 還無法使用。

困難的地方在於一開始測試時,並沒有外接 Console。於是時常碰到燒入後無法開機,或者開機後可使用,卻在一段時間或重開機後就無法連接的問題。

瞎子摸象了一段時間後,認命的參考 Adding a Serial Console to an Asus WL-700gE 一文,把機器拆解,拔掉內建的變壓器,並接上 Serial Console。拔除時,發現變壓器外裝只是用紙片隔離,感覺實在有點簡陋。

上圖腳位由上而下順序是 VCC(?), TX, RX, GND,電壓是 3.3V,終端機設定為 115200 bps 8N1。如此,就可以讀到所有的 Console Messages, 包含 CFE  等開機訊息

CFE version 1.0.37 for BCM947XX (32bit,SP,LE
Build Date: 四 12月 29 20:36:58 CST 2005 ([email protected]
Copyright (C) 2000,2001,2002,2003 Broadcom Corporation.

Initializing Arena
Initializing Devices.
et0: Broadcom BCM47xx 10/100 Mbps Ethernet Controller 3.90.23.0
rndis0: Broadcom USB RNDIS Network Adapter (P-t-P)
CPU type 0x29006: 264MHz
Total memory: 67108864 KBytes

Total memory used by CFE:  0x80800000 - 0x8089BA00 (637440)
Initialized Data:          0x80831B70 - 0x80834250 (9952)
BSS Area:                  0x80834250 - 0x80835A00 (6064)
Local Heap:                0x80835A00 - 0x80899A00 (409600)
Stack Area:                0x80899A00 - 0x8089BA00 (8192)
Text (code) segment:       0x80800000 - 0x80831B70 (203632)
Boot area (physical):      0x0089C000 - 0x008DC000
Relocation Factor:         I:00000000 - D:00000000

Device eth0:  hwaddr 00-17-31-A4-22-59, ipaddr 192.168.1.1, mask 255.255.255.0
 gateway not set, nameserver not set
Null Rescue Flag.
Null Rescue Flag.
10 seconds to Rescue mode...
Null Rescue Flag.

於是,終於讀到幾個小問題。這些問題是 OpenWrt 並未處理或提醒的

第一個編譯出來的 openwrt-brcm-2.4-squashfs.trx 必須小於 1802240 bytes。由於 WL-700gE 的 Flash 只有 2M,加上留給 CFE, configs 的空間。若超過大小,CFE 就會拒絕接受,下次重新開機會自動進到 Rescue mode

另外一個問題在於,squashfs 格式軔體,預設會試著找出 Flash 中的空餘空間,並利用 mini_fo 格式化為 jffs2、載入給系統使用。這在 Flash 夠大的機器上相當好用,因為你可以保持原本的軔體檔案,所有的設定修改都會被另存到額外的空間。

但是由於 WL-700gE 的 Flash 太小, 所以 mini_fo 根本沒有足夠的空間無法正確初始。以至於系統因此停滯/當機。系統會出現如下的錯誤訊息

mini_fo: build_sto_structure: failed to create storage dir [1].
mini_fo: get_neg_sto_dentry: ERROR building sto structure.

解法是關掉 firstboot / preinit / mount_root 中初始化 mini_fo/jffs2 的相關指令。

另外一個問題是 IDE 硬碟的初始化問題,由於 WL-700gE 的硬碟必須透過 GPIO 驅動,因此你必須先載入 diag.o 模組後,才能載入 IDE 相關模組與掛載檔案系統。這些也必須透過調整模組載入的優先值來修正問題。

最後是由於 Flash 根本太小,所以你得把主程式裝進硬碟中,並在 preinit 中作檔案系統掛載,並利用 pivot_root 或 chroot 來切換系統目錄。

當你都解決以上問題後,就終於可以開始使用 OpenWrt 了。:D

話說知名製作人阿怪 (aguai)兄前陣子拿了一台 ASUS WL-700gE,說是閒置著所以打算刷成其他版本的軔體,借給我一段時間研究。謝阿怪恩准玩弄他的寶貝。

事先調查在 OpenWrt Wiki 及阿怪的機器上調查了硬體規格,WL-700gE 的 SoC 速度是 BCM3302 v0.6 at 266 MHz, 2M flash 以及 64MB DDR-SDRAM。除了內建 IDE controller 與硬碟外,還有三個 USB 2.0 接頭 (VIA Vectro VT6212)。若想玩硬體修改,板子尚留有一個 Mini PCI 腳位,只要再想辦法焊接接頭即可。不愧是當動物園養寵物的好物。

剛拿到的時候,自然先從它的官方軔體研究起。阿怪機器的出廠值是 1.0.4.6,內建的 udhcpc 0.9.8 有點老舊,以至於與某些 DHCP Server 有些相容的問題。(像是我家的小 ISP,就一直無法取得 IP。)

於是就換到 ASUS 官方下載頁面的最新版軔體,1.0.7.8。udhcpc 還是基於 0.9.8,不過原始碼中倒是加了 patch (by Arthur, Chan-I, Joey, JYWeng ?) 來修正相容的問題,於是總算可以連上網路沒問題。

ASUS 的官方軔體中,我比較感興趣的是它所提供的網路攝影機與 P2P 下載功能,以及較少人使用的 DAAPDLNA Digital Media Server 功能。

網路攝影機的部份,ASUS 只載入了兩個驅動程式,分別是 ov51x v1.65-1.10-mark 與 pwc 8.11,若要測試相機功能,必須找到相容的硬體才行。我的 Webcam 是 UVC 介面,無法在 WL-700gE 上使用。

至於 P2P,WL-700gE 內建了 ctorrent (ctorrent-1.3.4.700gE.3.3, ctorrnet 已停止維護,新版可於 dholmes 的網站下載)。據我所知,ctorrent 1.3.4 尚未支援 Super-seeding, DHT, Peer exchangeEncryption特色,這些缺乏的功能將會嚴重影響上、下傳效能。

ASUS 倒是為 ctorrent 補強些功能,最明顯的是加了檔名的多國語言處理 (雖然只是用 /shares/bin/iconv 來轉),因此就算下載內含不同編碼方式的檔案,儲存後也不會變成亂碼,WL-700gE 仍然可以正確儲存讓使用者存取使用。

不過 ASUS 並未釋出修改過後的 ctorrent 原始碼,而只提供了二進位檔案。由於 ctorrnet 是 GPLv2 授權,說起來是 ASUS 違反了 GPL 授權。除了可以下載 BitTorrent 外,ASUS 還擺了 giFT 0.11.8.1,giFT 是支援數種不同的 Peer to Peer 檔案分享協定的軟體,包含了 FastTrack, OpenFTGnutella 等數種不同的協定。giFT 這麼好用的東西也是採用 GPLv2 授權,ASUS 當然也沒有提供原始碼。

DAAP 的功能,則是用以將硬碟中的音樂檔案分享給 iTunes,在 WL-700gE 是採用 mt-daapd 0.2.4 (現稱為 Firefly Media Server), ASUS 並未釋出相容是 GPLv2 授權的原始碼。至於 Digital Media Server 則是採用 Intel® Digital Home Device Code Wizard (原 Intel® Authoring Tools for UPnP Technologies) 的 SDK,採 Intel 私有授權。

雖說上述幾個 GPL 授權軟體,ASUS 並未釋出原始碼。但是 ASUS 其實已經在網頁上提供了 GPL 相關授權的壓縮檔,可以讓使用者自行下載。相較於行為更某些糟糕的廠商,ASUS 已經相當有誠意的放出了大部分的程式碼,包含用以編譯系統的原始碼(Build system and Makefile),甚至連私有軟體都放出函式庫或執行檔,包含了網頁管理介面所使用的函式庫。因此使用者有機會可以自行重新編譯與官方相同的軔體。就誠意來講,應該大大鼓勵。

之所以說有機會可以自行編譯,是因為 ASUS 送出的檔案似乎曾經受過某些工程師的無意修改,因此不少 Makefile 都必須再稍加調整後才能正確編譯。我稍微修改了一版 1.0.7.8 可完全編譯的版本。尚需找個地方擺原始碼才行。

不過非常可惜的是,ASUS 刻意保留了部份加強過的 GPL 軟體原始碼,雖說應該是商業上的考量,但是還是違反了授權。不管你是自有品牌、或 OEM/ODM 硬體廠,若使用 GPL 授權之相關軟體, 建議出貨前應該參考GPL 軟體授權適法訣竅檢查一遍為妥。

另外一個值得一提的是,這兩版軔體預設都開啟了 utelnetd,於是你可以直接連入一探究竟。若你對官方軔體的內容感興趣,相關軔體版本都可於官方下載。此外,這是 1.0.4.6 的 (disk) 軔體檔案列表,1.0.7.8 的列表於

另外,網路上也有人提到 ASUS 無意中於 www.asus.ru 釋出的 2.0.0.7 版本。功能似乎類似,但是網頁管理介面倒是用 Java Script 加強了不少,外觀看起來先進多了啊。

(本文是事後才整理,由於記憶不佳及缺乏測試,某些資訊可能有誤)