暫存內容

golang 心得分享

docker 心得分享

API daemon 的運作概要

sysd 開發生存手冊

  • 如何 build
  • 註1: 執行 ./sysd/sysd ,然後打開 "http://127.0.0.1:8080/ifconfig" 就可以看到輸出的結果. 

    註2: 目前主版本在 linux/osx/windows 上都可以 pass build, 歡迎大家下載測試

  • 如何新增模組
  • 假設模組名稱為 xyz

    目標指令集

    實際遇到過的問題

    History: 

    2014-10-02 於 H4 下課後,Mat 和 Carl Su, yan 聊天提出構想, 由 Carl Su 建議命名為 sysd.

    2014-10-03 於 github.com 作 init commit.

    版本號碼我先初步編上去了, 主要變更如下: 

    0.0.1 => pass build 

    0.0.3 => 可執行的概念驗證 

    0.1.0 => 新增模組的架構 

    0.2.0 => kd, mat 兩分支成果整合 

    0.3.0 => 新增 embed web UI 

    0.4.0 => 取得著作授權合作

    0.5.0 => 新增套件發佈流程

    專案構想起源 , 2014-10-03

    ( todo: 取精要內容進 "what is sysd" 的介紹內容 )

    補充一下, 

    這個是昨天下課後聊到的專案,"sysd" 的命名由 Carl.Su 建議

    目標是提供一個 api daemon for linux, 可以讓應用程式,透過 Restful API 的方式,來取得系統面的資訊跟操作. 

    具體一點,就是我們遇到應用程式要取用 ip 資訊時,通常都是透過像是 system() 的函式操作 ifconfig 的方式來取得. (ex: http://stackoverflow.com/questions/6147193/output-from-subprocess-popen ) ,所以不管是 php/python/c/javascript... 都會有相同的困擾  =>  1. 必須要有 ifconfig (相依性)  2. 要 "parsing" ifconfig 的輸出訊息 ( F**K!! )

    但細看 ifconfig / route /.. 的實作,其實就只是一些 ioctl 呼叫 kernel API , 跟 cli 的 cmdline 操作的搭配而已. 所以我所想的就是: 

    如  果今天把一系列類似 output = os.system("ifconfig eth0") 都換成通用的 API  =>   rest_api.get( "/sysd/ifconfig/eth0" ) ,並回傳 json/xml   容易處理的格式,那會帶來什麼樣的改變呢!?

    上述的這個想法,就是 sysd 這個專案的源始動機. 

    實作面上,預計比照 docker 的架構,只是將對象從 vm 的操作換成 Linux 系統資訊 ( ex: uname, arp, route, /sys/* )

    有興趣的人,可以先 checkout docker 的 source code, 建議可先看 /api/server.go 的 createRouter() 跟 /api/client.go 的 CmdInfo() 開頭.  

    另外提供之前的讀碼筆記作參考,  http://www.hackingthursday.org/2014-03-13#toc4

    目前什麼成果都還沒有,所以我想前期 3~4 週, 可能會像 3~5 人的興趣小組讀書會 ( linux + api + go )  , 等到開始有可 demo 的 prototype 時,再更公開 promote 給大家一起參與~

    any question? welcome feedback

    Linux /proc, /sys 研究心得

    ( todo: 取精要內容進 "Developer Guide" 的架構介紹內容 )

    跟大家分享一下最近的 survey 心得.

    1.  我發現 /proc/ 跟 /sys/ 下的資料,主要有幾種大類別 A => 像 /proc/cpuinfo , 左欄 Key  + 右欄  value B => 像 /proc/net/route, 第一行是 key columns, 第二行之後是 values C  => 像 /proc/loadavg , 一行資料,以空白分隔 D => 像 /proc/softirqs , 屬於 table  式的 若針對上述 4 種類別寫出通用的函式,parse 成 2維陣列,應該能快速支援不少資料         

    2.  另外 我發現  /sys/ 目錄有一些規則, 只有 /sys/devices/ 目錄有龐大的樹狀結構。剩下的 /sys/*/  其他目錄,大都只有 1~2  層的結構. 所以我猜測, /sys/*/ 的其他目錄,應該是屬於分類class性質的,而  /sys/devices/ 底下,則是真正的  object tree. 

    3. 承上, 我發現每個 object node 都有 "uevent" 的檔案,所以似乎可以用 ` find /sys/devices/ -type f -name ’uevent’` 來列舉所有的 device object.

    4. 承上,我注意到有些目錄會有 subsystem 或 driver 的 symbolic link.  我認為用這個連結關係來回溯分析,應該可以分析並繪出  device object tree 跟 driver / subsystem 的關連圖.

    具體一點來說,大概就可以產出像是  http://i.stack.imgur.com/LMa7A.pnghttp://www.dannytsang.co.uk/wp-content/uploads/2010/02/Device-Manager.png 的成果圖表. ( HTML UI? )

    5. 以 cpufreq-info 為例 

    一 開始找的 /sys/devices/system/cpu/cpu0/cpufreq/* 並沒有 uevent, 所以不是 device  object. 是上一層  => /sys/devices/system/cpu/cpu0/ 有 "subsystem" 的 link 到  /sys/bus/cpu/ => /sys/bus/cpu/ 有 devices/ 跟 drivers/ 目錄,分別列出 device  object 跟  driver 的項目. 不過此例因為 cpu 是 kernel built-in 的功能,所以沒有 drivers/*  的內容. 

    6. /sys/ 下的資料,比較多是 device based 的資料集比較多,所以這部份要一個一個去查每個 subsystem 的特性,才會轉譯整合成 API. 

    BTW, 不知道有沒有人知道那裡可以查到 driver 相關的 kernel API 資訊??