追蹤最新 Linux Kernel 開發狀況
前陣子在 Tossug 的 IRC Channel 上討論除了訂閱 LKML 來了解 Linux Kernel 的各種開發進度外,是否還有其他更有效率的方法 ?
對,你可能是用了超新型電腦設備的資深使用者,或者是某某公司的 Linux kernel 維護/開發者,需要了解相關硬體驅動程式的開發支援狀態,或是 API 的改變。
當然,訂閱 LKML 可以確保你不會錯過任何一條新消息。但每日高達兩三百封電子郵件,許多信件中還包含 patches,光下載就花掉不少時間,更何況需要消化這些湧入的訊息。
比較容易的方式是透過 USENET 或 RSS Feeds 訂閱 LKML,如此只需要下載標題,再選擇標題閱讀即可。若不想透過電子郵件軟體閱讀訊息,網路上有相當多提供郵遞論壇轉網頁的網站可使用,如 Google Groups 、The Mail Archive、Napple、LKML.org 等,你尚可配合其內建或 Google 等網路搜尋引擎來查找你想要搜尋的關鍵字,還算相當方便。
許多網站都還提供 RSS 的訂閱機制,你可以直接在 RSS Reader 訂閱後,看到感興趣的標題在點入閱讀。不過大部份的網站都只讓你訂閱最新的標題,如此還是會收到相當多訊息,不甚方便。
但 LKML.org 提供了一個追星族 (groupie) 功能,我個人認為相當實用,這功能讓你可以訂閱特定開發者的發言!於是,你可以追蹤一些重要人士的發言,如 Linus Torvalds, Andrew Morton 等,以免錯過重要的決策資訊。
但是我要推薦的是 Gmane,一樣是將 LKML 轉換儲存,Gmane 提供了更多樣的介面,包含了
- Loom 網頁瀏覽介面
- Blog 網頁瀏覽介面
- NNTP/USENET
- RSS 訂閱機制
- 搜尋功能
其中 RSS 訂閱機制,提供了高達四種訂閱方式!你可以
我個人習慣只訂閱郵件標題與內容摘錄,如此就可以只跟著感興趣的題目,而不會分心在其他的議題上。Gmane 除了訂閱方式多元以外,它的瀏覽介面與搜尋也相當神速與方便,特別是所謂的 Loom 瀏覽介面,配合鍵盤指令使用,比在本地端讀取還方便多了!同時也非常方便用來監視其他相關的郵遞論壇。
除了追郵遞論壇的討論細節外,你也必須知道大方向的發展狀態。首先要推薦是 LWN,它提供最具深度與時效的報導,且一個月也才五元到十元美金,請以訂閱作為支持這個網站的行動吧。若你是為商業公司服務,請記得告訴你老闆可以使用團體帳號訂閱。若你不想花錢在這上面,上面的新聞只要過了時效就可以免費瀏覽了。
另外 KernelTrap 的熱門話題與新聞也應該要時常閱讀。並也可以透過 Kernel Newbies 的核心變動懶人包,來了解新版核心的變動資訊。
Resotre ASUS WL-700gE
若你照著前幾篇文章,不小心真的把 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: root@localhost.localdomain $ 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 完全復原到出廠的狀態了!
ASUS WL-700gE Running Debian
在安裝過 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) <ftpmaster@debian.org>" 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 線上重新載入新的核心系統。目前這個技術尚未有標準的設定檔作法或範例,戲法巧妙不同,就看你如何應用了。
ASUS WL-700gE with OpenWrt
更換 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 (root@localhost.localdomain 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 了。![]()
Software sucks
大約任何一個軟體開發者都可能碰到詭異的 undocument API 、噁爛的架構,或者碰到設計有問題的硬體,大約都會情不自盡的爆粗口。偶爾,你甚至會被其他莫名其妙的開發者惹火,例如未充分溝通就擅改程式碼包成套件的情境。
前些時候,quodlibet 的 Debian 套件維護者 Sebastian Dröge 因為誤解了 quodlibet 所使用 GStreamer 中的一個 API 相容問題,於是直接擅改程式碼中的一段,以便可以於新版的 GStreamer 中使用。但是這樣的行為卻未事前於 quodlibet 開發者 Joe Wreschnig 溝通,而那其實算是 GStreamer 的問題,並非 quodlibet 的錯誤。
於是,Joe Wreschnig 惱怒之下,身為一個上游開發者,就在 quodlibet 中也改了一段因應 GStreamer API 更改的措施。而且順便戳了 Sebastian Dröge 一下,要他去死一死吧。於是身為一個 Debian Developer,自然的解決方式當然是發一個 Bug Report。而且解決的討論很自然就往 DFSG 與 Debian Policy 發展。所幸,最後 Tristan Seligmann 另外改了程式碼,並做了一份新的壓縮檔,算是解決了這個幼稚問題。
有趣的是 Joey Hess 在討論中,順便彙整了過去 Debian 修改紀錄中,曾經出現的粗口表,非常好笑,只能說 Software 真是 Sucks。XD
另外一個好玩的研究是 Vidar Holen 研究了 Linux 核心中有多少詛咒粗口,Linux kernel swear counts。我們可以拿程式碼中的髒話平均數量當作判斷品質的一個參考值嗎? ![]()
‘Remove Attachments’ Evolution plugin 0.0.2
It’s nice to see that people still like to use the small piece of software which been wrote for 20 months without updated. Thanks for feedback from
-
Uwe, g021030 (at) gmx.net
-
Keith Refson, K.Refson (at) rl.ac.uk
And the others how left the messages on the blog, especially patch from Hank Hampel and encouragement from Dick Dunbar. ![]()
The new release is now handling in-line attachment as well, and it’s autotoolized and debianized.
You can download the tarball and deb file for Debian sid from
evolution-remove-attachments_0.0.2.tar.gz
evolution-remove-attachments_0.0.2_i386.deb
evolution-remove-attachments_0.0.2.dsc
evolution-remove-attachments_0.0.2_i386.changes
They are tested on Debian Sid with Evolution 2.22.
