話說前陣子搬家後,因為跨了原本 Cable Modem 的服務區域,因此換了一家新的小地區第四台業者,為了省麻煩也一併跟同一家業者申請了纜線寬頻網路 (Cable Modem)。

申請 Cable Modem 是因為只需要養養動物,可以滿足基本上網的需求而已。一般工作或開發還是利用公司申裝的 Hinet 固定制 ADSL,試過存取幾個國外的服務,像是 git.kernel.org 還是得靠中華電信的網路才拉的下來。所以你若需要時常存取國外的資料,還是不建議使用相對小眾的 Cable Modem ISP.

申裝後,供裝人員倒是很快的取來了一台 Motorola SB5100 (Motorola SURFboard® Cable Modem SB5101),剛裝好測速或連線都頗正常。但過了幾個小時候,Cable Modem 變開始不時斷線,有時還會離線好幾小時,但偶爾又會正常。

很不幸的,第一次報修,工程人員來的時候,設備與網路是正常的。他且非常認真的確認大樓的電信箱的配線,並連到 SB5100 的 Configuration Manager (http://192.168.100.1) 確認了幾次訊號強度。最後安了一個 High-pass filter,然後一臉嚴肅的說 「如果這樣還不行,那事情就大條了」。 :-/

不過這樣一點用都沒有。所幸 SB5100 是 DOCSIS-compliant cable modem,且開了 SNMP。於是只好自己找了台機器裝了 CactiDOCSIS Stats 來紀錄 Cable Modem 狀態。果然觀察一陣子後,發現訊號數據其差無比。

根據 Cable modem signal levels 一文,

  • Downstream SNR 應該大於 30, 若低於 30 則代表有問題
  • Downstream Power 應該介於 -15 to 15 dB, 最佳是 -8 to 8 dB
  • Upstream SNR 應該高於 29
  • Upstream Power, 應該低於 55dB. 越低越好

於是很快的再報修一次,讓工程人員讀了一下數據,且用儀器測了一番,決議大概是新裝潢的暗管中的線材受損,造成訊號不佳。於是另外拉了一條新的線直接接到數據機上,接下來使用一個月都沒有任何問題了。

若你的 Cable Modem 並未提供網頁介面供查看數據,但你知道他也提供 SNMP,且不想安裝 Cacti,不妨使用 DocsDiag 來取出相關數據。若你對 SB5100 的硬體感興趣,SB5100 的主晶片是 Broadcom BCM3348,板子上有 JTagSerial Port 可使用。

Since the Slashdot (The website for nerds) lunched a new AJAX-style comment filtering system, it’s much easier to read the high-score-interesting-and-Insightful comments for stories.

If you look closer, you will find an arrow in the comments list of a story. The arrow is keyboard shortcuts indication just like gmail, which help you read the messages by using the keyboard.

But the keybindings are different with Gmail or other forum discussion system. You can learn the keybindings in Slashdot’s FAQ.

/* keys
prev comment: A, H
next comment: D, L
prev thread: W, J
next thread: S, K
prev comm chrono: Q
next comm chrono: E
next unread comm: F
reply to current comment: R
parent of current comment: P
history (modlog) of current comment: M
hide history: X
skip to end (last): V
skip to top (first): T
get more comments: G
lower top threshold: [
raise top threshold: ]
lower bottom threshold: ,
raise bottom threshold: .
toggle d2 widget: /
*/

前幾篇文章提到硬體廠商在做產品出貨前,可以檢閱 GPL 軟體授權適法訣竅 中的 Tips,確保自己沒有違反授權。但授權適法訣竅中的綱要非常精簡,若你在出貨時才驚覺 GPL 的授權問題,想從訣竅中找到保全的方法,大概也已經來不及趕在出貨前重新檢查所有的細節。

比較好的作法,就是在日常產品開發中,就將 GPL 相關授權問題納入公司執行規章中,如此便可避免相關的法律問題。

若你的公司才剛開始注意到 GPL 相關事宜,不妨參考 Software Freedom Law CenterGPL 遵守實務。這份文件中廣泛的說明一些容易造成授權問題的公司體制,例如允許大神級的工程師 (Build Guru) 製作最後的出貨版本,而非定義一個出貨程序。文件中也說明了違反授權的類型、收到律師函的因應措施以及其他的類似授權所產生的問題。值得參考。

若你照著前幾篇文章,不小心真的把 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