2013年1月9日 星期三

wireshark 擷取 USB 訊號

最近發現 wireshark 新增 USB 擷取的功能,只要是 Linux kernel 2.6.21 以上的版本皆可透過 usbmon 模組擷取 USB 裝置上的資料流,搭配 wireshark 本身強大的 filter 功能對於 USB 應用的開發與除錯帶來相當大的便利性。

使用 wireshark 擷取 USB 訊號實需先載入 usbmon 模組,於 terminal 執行指令:
$ sudo modprobe usbmon

根據官方 wiki 說法,若系統沒有掛載 debugfs 需執行以下指令(小弟於 ubuntu 12.10 測試結果是不需要的)。
$ sudo mount -t debugfs / /sys/kernel/debug
執行 wireshark 之前先確認 USB 裝置已接上電腦,可以透過 lsusb 確認想擷取的 usb ,lsusb 會顯示出 usb 裝置目前屬於哪個 USB Bus 與 Device 代號以及USB ID裝置,例如我們想觀察 Alcor Micro Corp. Flash Driver 這一個 USB 隨身碟裝置, lsusb 顯示該裝置目前位於 USB Bus 002 上代號為 Device 007 其 ID 為 058f:6387。

接著開啟 wireshark ,由於 usbmon 的加持每個 USB bus 皆顯示為一個獨立的 USB 裝置,假設想要擷取 Bus 2 的裝置即可選擇 Bus 2。

接著點選 Expression 設定 filter expression。

點選 Expression 按鈕會跳出 Filter Express 視窗,可以在 Field Name 欄位中尋找 USB 相關的項目並設定,例如想監測 USB ID 為 058f:6387 的裝置,先選擇 "usb.idVendor" 欄位接著選擇判斷條件 "==" 以及條件值 "0x058f",設定完之後按下確定。

回到 wireshark 主視窗中剛才設定的 filter 條件自動填入 filter 輸入欄位中,若條件格式語法正確其底色為綠色,反之語法錯誤則為紅色。


當然如果要設定較複雜的條件也沒問題,可將多個判斷是以 && 或是 || 進行組合。設定完 filter 條件後記得按下 Apply。

接著點選 Start 開始對 USB 裝置進行監測,即可體驗 wireshark 強大的 USB 封包擷取功能囉!

使用完之後可卸載 usbmon 模組。
$ sudo modprobe -r usbmon


參考資料 - http://wiki.wireshark.org/CaptureSetup/USB

2013年1月6日 星期日

Android裝置上執行Linux桌面環境

Android 系統擁有豐富的 app 提供行動應用便利的服務,而 Linux desktop environment 則擁有眾多桌面應用程式,無論是 Android 或是 Linux desktop environment 這兩者都是基於 Linux 核心發展出來的操作環境, 因此在同一硬體裝置上同時執行 Android 以及 Linux desktop environment 技術上是可行的方案,例如 Ubuntu 積極推出的 Ubuntu for Android 展示了 Android 與 Ubuntu 桌面環境的整合應用。

然而 Linux 的發行版本眾多每個使用者偏好不盡相同,假若要將自己喜愛的 Linux 環境也執行在 Android 裝置上該如何進行呢?以下提供一項解決方案(以 ARM -Based Android 裝置為例):
  1. 下載 ARM Linux 桌面發行版本的映像檔。
  2. 於 Android 上掛載 Linux 映像檔。 
  3. chroot 至 Linux 環境。
  4. 於 Linux 環境裝執行 vnc server。
  5. 使用 Android 的 vnc client 連線至 vnc server。
如此一來即可在單一裝置上同時執行 Android 與 Linux desktop environment。