發表文章

SDN Switch OS ... 這是啥?

圖片
這篇文章的起因是 ... 有個長官要求我們去 "study SDN Switch OS",因為覺得如果以計劃的力量去開發這個「作業系統」可能資源不夠,所以集中資源直接向已經有的公司買個一套,然後在計劃內直接移植。 但什麼是 SDN Switch OS?先說結論, 根本沒有這東西!! SDN Switch OS這個名字的由來是 Pica8 這家公司這家公司推出的,他們宣稱他們公司有 PicOS 。我們直接看看他們網頁是怎麼說的: Our hardware-agnostic, Debian-based , and OpenFlow-supporting switching operating system—PicOS™—is loaded onto commoditized, or "white box" bare-metal switches purchased from our ODM (original design manufacturer) partners. 首先,根據作業系統的定義,他們的作業系統就是 Linux,其他的功能不應該屬於作業系統層級。而且根本就是 Debian。第二,什麼是 OpenFlow supporting switching?說穿了 就是把 openvswitch 移植上去 。這樣說起來,請問你要跟這些公司買啥東西啊? 當然這些公司不是沒有他們優化(正確來說比較是平台移植的問題)的厲害之處。他們做的事情以下圖所示:  左邊的圖示單純把 Openvswitch 移植到平台上,如果之前 Blog 所示範的,我已經成功的將 Openvswitch 移植到 pandaboard 上面(另外一位同事也移植到了 raspberry pi 上面)。這樣的效能當然好不到哪裡去,但是可以用。右邊的圖是這些廠商所著重的部份,就是把 openvswitch 的 kernel module 整合 現有的硬體網路晶片 ,來提升網路傳輸的效能。所以他們會做一層 HAL。問題是現有的晶片根本不支援 OpenFlow ... 所以反而在功能層面會有所缺乏。相反地,左邊的解決方案是純軟體的,所以功能層面齊全的更多。如果要實際細分的話,大概在 Action 和 Set Field 這兩樣功能現有晶片支...

如何下載 TED 的字幕

TED是一個演講計劃,也可以用做練習英聽的題目,問題是和增進英文比較起來,我對演講內容比較有興趣,所以我還是寧可看中文字幕。以往我都是透過 http://tedtalksubtitledownload.appspot.com/ 來下載字幕,問題是 TED 的網頁改版了!!所以上面這個網頁沒辦法用,因此本人就決定自己來打造一個 TED 的字幕下載工具(順便當作 Python 的程式練習)。 import urllib def parseTime ( str ) : time = str . split ( "data-time='" ) [ 1 ] . split ( "'" ) [ 0 ] return time def parseSub ( str ) : subtitle = str . split ( ">" ) [ 1 ] . split ( "<" ) [ 0 ] return subtitle def time2Str ( time ) : minisecond = time % 1000 second = ( time / 1000 ) % 60 minute = ( ( time / 1000 ) / 60 ) % 60 hour = ( ( ( time / 1000 ) / 60 ) / 60 ) % 60 miniSecStr = str ( minisecond ) secStr = str ( second ) minStr = str ( minute ) hrStr = str ( hour ) # SRT time format: 00:02:52,184 --> 00:02:53,617 if len ( miniSecStr ) < 3 : for i in range ( 0 , ( 3 - len ( ...

靈修分享:充滿誘惑的提案

耶穌說:「 你們必曉得真理,真理必叫你們得以自由。 」(約8:32)。這節聖經基督徒大概都很熟悉,問題是基督徒大概常常不覺得很自由。為什麼?因為當基督徒讀到登山寶訓的時候,常常會覺得這明明是新約,怎麼比舊約還要律法,要求這麼嚴格,除了外在的行為,還會鑑察自己的內心,而偏偏耶穌又說:「 你們若愛我,就必遵守我的命令。 」(約14:15),這樣壓力好大唷。這在人是不能,但靠著上帝的恩典,凡事都能(太19:26)。感謝上帝!不過今天的分享不是在這裡,而是在主日聽賴長老講道的時候,突然浮起的另外一個問題... 如果,上帝願意給你一個機會,使你一切手所做的盡都順利,而且你完全不用聽從祂的吩咐(也就是可以胡作非為:p),你覺得這個提案怎麼樣? 乍聽之下很棒吧!雖然大部分的基督徒應該會直接大笑說:「怎麼可能?」,可能還會引經據典的來說這根本是天方夜譚,所以根本就不需要考慮這個問題。但或多或少,內心也會有點心動吧。然而,這個提案並非空穴來風,而是曾經出現在聖經當中的... 出33:1 耶和華吩咐摩西說:「我曾起誓應許亞伯拉罕、以撒、雅各說:『要將迦南地賜給你的後裔。現在你和你從埃及地所領出來的百姓,要從這裡往那地去。 出33:2 我要差遣使者在你前面,攆出迦南人、亞摩利人、赫人、比利洗人、希未人、耶布斯人, 出33:3 領你到那流奶與蜜之地。 我自己不同你們上去;因為你們是硬著頸項的百姓,恐怕我在路上把你們滅絕。 」 出33:14 耶和華說:「我必親自和你同去,使你得安息。」 出33:15 摩西說:「你若不親自和我同去,就不要把我們從這裡領上去。 出33:16 人在何事上得以知道我和你的百姓在你眼前蒙恩呢?豈不是因你與我們同去、使我和你的百姓與地上的萬民有分別嗎? 」 出33:17 耶和華對摩西說:「你這所求的我也要行;因為你在我眼前蒙了恩,並且我按你的名認識你。」 在這個故事裡,上帝對摩西說,我派遣使者在你們面前,幫你們驅除一切的敵人,只是我不與你們同在,免得我因著怒氣而滅了你們。這真是一個誘人的提案,一來可以不花一兵一卒就可以佔領迦南地;二來也隱含著,你們可以胡作非為,而且我不會因此而懲罰你們。這提案有多大的吸引力呢?從之後的故事來看,約書亞爭戰了老半天,過約旦河、取耶利哥城、敗走艾城又取回來、打敗五王聯軍,到老年的時候,仍然還有許多未得之地(書13...

Linux UK Communication: Netlink

上一篇文章所介紹使用的 Linux User/Kernel 溝通方式:Character Device,是一個很標準的範例程式,過去在公司的案子開發上也大多採用這種方法(另一種方法是 ioctl )。這個方式最大的好處是簡單,而且移植性高,因為從很早以前的 Linux Kernel 就已經支援了(2.4,你問 2.2?抱歉,我沒那麼老 ... )缺點呢?Kernel Module 只能夠被動的等待 User Space 的程式呼叫,無法主動進行溝通。 Linux Kernel 最近發展的方向,在 UK 這一塊盡可能改採 Netlink 的方式來進行通訊。這是一個很簡單的思維: 既然所有網路的封包都會到 Kernel 去進行處理,那我為什麼不直接把網路封包拿來當作給 Kernel 的訊息呢?而 Kernel 要和 User Space 的程式溝通時,只要製作一個網路封包往 socket 丟不就好了嗎? 於是 Netlink 就誕生了。先說缺點,因為算是比較新的技術,所以 API 的介面改的很快,因此程式似乎也要常常變動。下面是由同一位同事 taco 所撰寫的範例。(其實我本來想自己寫的,但 ... 懶啊) Kernel: # include < linux/types.h > # include < linux/kernel.h > # include < linux/netlink.h > # include < net/sock.h > # include < linux/sched.h > # include < linux/module.h > # include < linux/init.h > MODULE_AUTHOR ( " tacolin " ) ; MODULE_DESCRIPTION ( " NETLINK KERNEL TEST MODULE " ) ; MODULE_LICENSE ( " GPL " ) ; # define NETLINK_TEST 17 # define MAX_PAYLOAD 512 static struct sock *...

Linux UK Communication: Character Device

這是同事 Taco 撰寫的範例,在經過作者同意後厚顏無恥的列在 Blog 上。畢竟人家都寫好了啊,要我自己在寫一份有點懶。為了紀念原作者(明明就還活著,說啥紀念),所以沒有任何地方更動(應該是懶惰吧) 這個範例和我平常的習慣不同,一般來說我只會寫一個範例檔,不喜歡拆成兩個,而且愈簡單愈好。 但這同事和我的習慣不同,也很好,因為可以很簡單的看出兩個檔案的分工,特別是 taco_1.c,可以直接拿來建立各樣的 kernel module 範例,這個習慣值得我學習。 taco_1.c # include < linux/types.h > # include < linux/kernel.h > # include < linux/module.h > # include < linux/init.h > MODULE_AUTHOR ( " tacolin " ) ; MODULE_DESCRIPTION ( " CHARACTOR DEVICEL TEST MODULE 2 " ) ; MODULE_LICENSE ( " GPL " ) ; extern int register_device ( int major , int minor ) ; extern int unregister_device ( int major , int minor ) ; static int __init kernel_module_init ( void ) { printk ( " [KERNEL-PART] %s \n " , __func__ ) ; if ( 0 > register_device ( 125 , 0 ) ) { printk ( " [KERNEL-PART-ERROR] register device failed \n " ) ; return - 1 ; } return 0 ; } static void __exit kernel_module_exit ( vo...

IPC: Unix Domain Socket

要讓系統中的兩個 process 彼此溝通該如何處理?過去常見的守法有 pipeline、shared memory 等,不過其實我一個都沒有用過。我比較喜歡的作法是 socket programming,在兩個 process 間建立 network socket,因為這樣的概念最簡單(我一向很懶)。 問題是,使用 network socket 會造成效率上的浪費,儘管兩個 process 都在同一台機器(localhost)上,但是還是會到 kernel 的 TCP/IP Stack 裏面逛個一圈,這在執行上勢必會有效能的浪費。既然都已經在本機了,那又何必經過網路層的處理呢?今天要介紹的 IPC 技術就是一個解決這問題的方案: Unix Domain Socket。從下面的範例上來看,寫法和 network socket 幾乎一模一樣。所以就不多做介紹了,直接看程式吧。 # include < stdio.h > // for printf() and fprintf() # include < sys/socket.h > // for socket(), bind(), and connect() # include < sys/un.h > // for struct sockaddr_un # include < stdlib.h > // for atoi() and exit() # include < string.h > // for memset() # include < unistd.h > // for close() # include < sys/time.h > // for struct timeval {} # include < fcntl.h > // for fcntl() # include < sys/epoll.h > int main ( int argc , char * argv [ ] ) { struct sockaddr...