汪敏
(江蘇科技大學(xué) 計算機科學(xué)與工程學(xué)院,江蘇 鎮(zhèn)江 212003)
基于netlink的linux服務(wù)器集群統(tǒng)一外設(shè)事件監(jiān)聽機制
汪敏
(江蘇科技大學(xué) 計算機科學(xué)與工程學(xué)院,江蘇 鎮(zhèn)江 212003)
針對大型分布式服務(wù)器集群系統(tǒng)中缺乏對于外設(shè)事件統(tǒng)一的監(jiān)聽機制,設(shè)計了一種對于未經(jīng)允許的可拔插事件、未經(jīng)允許的外部存儲設(shè)備分區(qū)事件等外設(shè)事件的統(tǒng)一監(jiān)聽機制,首先在被監(jiān)控服務(wù)器端啟動過程中加載外設(shè)事件接收模塊和服務(wù)進程,然后由外設(shè)事件處理進程監(jiān)聽netlink多播組,最終由外設(shè)事件處理進程將外設(shè)事件通過網(wǎng)絡(luò)發(fā)送給服務(wù)器端監(jiān)控進程。通過本監(jiān)聽機制的設(shè)計,提高了服務(wù)器集群系統(tǒng)的整體安全性。
計算機網(wǎng)絡(luò);服務(wù)器集群;netlink;事件監(jiān)聽
在linux服務(wù)器集群中,通常存在多臺服務(wù)器終端,而在大型的服務(wù)器架構(gòu)中,許多服務(wù)器終端是分布在不同的地理位置的,在服務(wù)器運行過程中,對于像未經(jīng)允許的可拔插設(shè)備訪問事件、未經(jīng)允許的外部存儲設(shè)備分區(qū)掛載事件等外設(shè)異步事件缺乏有效而又實時的監(jiān)聽方法。文中設(shè)計了一種基于netlink通訊的服務(wù)器集群統(tǒng)一外設(shè)事件監(jiān)聽方法,提高了服務(wù)器集群的安全性。
目前,現(xiàn)有技術(shù)中還不存在一種在linux服務(wù)器集群內(nèi)部統(tǒng)一的外設(shè)事件監(jiān)聽方法。而且,對于單個的服務(wù)器內(nèi)部的外設(shè)事件監(jiān)聽而言,主要依靠用戶空間的設(shè)備文件系統(tǒng)守護進程udevd[1-5]來搜集外設(shè)事件來動態(tài)的改變設(shè)備文件系統(tǒng)目錄/dev下的設(shè)備節(jié)點信息,不存在其他的、單獨的外設(shè)事件用戶空間接收程序,而設(shè)備文件系統(tǒng)守護進程udevd可定制性較差,難以實現(xiàn)通過改變現(xiàn)有的udevd守護進程來統(tǒng)一的監(jiān)聽服務(wù)器集群內(nèi)部的所有的外設(shè)事件的方法。
實現(xiàn)對于內(nèi)核空間消息的監(jiān)聽以及內(nèi)核空間與用戶空間的信息傳遞有很多種方法,但是相比較于增加系統(tǒng)調(diào)用[6-10]去實現(xiàn)外設(shè)事件監(jiān)聽接口,采用netlink去實現(xiàn)通訊接口,有很多優(yōu)點,比如說不需要增加內(nèi)核代碼,不需要重復(fù)編譯內(nèi)核,只需要在啟動系統(tǒng)的時候動態(tài)加載的相應(yīng)的內(nèi)核模塊,而且netlink協(xié)議本身實現(xiàn)了事件的異步通知,所以能夠保證內(nèi)核事件接收的實時性。
一種基于netlink的linux服務(wù)器集群統(tǒng)一外設(shè)事件監(jiān)聽方法,包括以下步驟:
1)被監(jiān)控服務(wù)器端在系統(tǒng)啟動過程中加載外設(shè)事件內(nèi)核接收模塊,同時開啟監(jiān)控進程遠(yuǎn)程服務(wù)進程,等待多個監(jiān)控服務(wù)器端監(jiān)控進程發(fā)來登錄請求;
2)監(jiān)控服務(wù)器端的監(jiān)控進程向被監(jiān)控服務(wù)器端的遠(yuǎn)程服務(wù)進程發(fā)送登錄請求;
3)被監(jiān)控服務(wù)器端遠(yuǎn)程服務(wù)進程接收登錄請求并利用fork()系統(tǒng)調(diào)用函數(shù)創(chuàng)建子進程,用于驗證登陸帳戶信息,并由父進程繼續(xù)監(jiān)控端口,查看是否有新的登錄請求;
4)被監(jiān)控服務(wù)器端服務(wù)進程接收到登錄請求后,創(chuàng)建子進程,子進程開啟外設(shè)事件處理進程,利用外設(shè)事件處理進程監(jiān)聽相關(guān)的netlink多播組,其中子進程與外設(shè)事件處理進程通過共享內(nèi)存實現(xiàn)全雙工通訊;
5)外設(shè)事件內(nèi)核接收模塊通過內(nèi)核線程統(tǒng)一接收相關(guān)外設(shè)事件,并按照外設(shè)事件先后順序以及優(yōu)先級發(fā)送給相關(guān)的netlink多播組;
6)外設(shè)事件處理進程將外設(shè)事件通過子進程發(fā)送給父進程進而通過網(wǎng)絡(luò)發(fā)送給監(jiān)控服務(wù)器端監(jiān)控進程。
圖1顯示了系統(tǒng)的總體架構(gòu)以及相關(guān)的工作流程。
圖1 系統(tǒng)架構(gòu)圖
在圖1中,監(jiān)控進程遠(yuǎn)程服務(wù)模塊有兩個子進程,用以處理登錄請求,并且這兩個子進程分別關(guān)注不同的外設(shè)事件處理程序。圖1中兩個不同的外設(shè)事件處理程序,用以監(jiān)聽相同的netlink多播組,能夠?qū)崿F(xiàn)對于相同的外設(shè)事件有多個不同外設(shè)事件處理程序去處理的實用功能。
內(nèi)核空間的外設(shè)事件內(nèi)核接收模塊用于解決最為關(guān)鍵的外設(shè)事件的統(tǒng)一接收問題,如圖2所示,文中的外設(shè)事件內(nèi)核接收模塊主要提供兩部分功能:一是實現(xiàn)hw_event_send(int priority,struct mxc_hw_event new_event)函數(shù)對于驅(qū)動外設(shè)事件按照發(fā)生順序以及優(yōu)先級向內(nèi)核線程傳遞的功能;二是實現(xiàn)kernel_thread(hw_event_thread,NULL,CLONE_KERNEL)內(nèi)核線程對于外設(shè)事件的接收以及按照它的發(fā)生順序向用戶空間廣播的過程。
圖2 被監(jiān)控端服務(wù)器架構(gòu)
對于第一部分功能,文中主要是通過EXPORT_SYMBOL(hw_event_send)將hw_event_send()函數(shù)導(dǎo)出符號,可以在各個外設(shè)的驅(qū)動中使用該函數(shù),將外設(shè)事件按照它的優(yōu)先級和發(fā)生順序發(fā)送給內(nèi)核線程。設(shè)備驅(qū)動在使用該函數(shù)的時候分了兩種情況,如圖3設(shè)備驅(qū)動1在使用該函數(shù)傳遞外設(shè)事件的時候處于中斷上下文,而設(shè)備驅(qū)動2和設(shè)備驅(qū)動3在使用該函數(shù)傳遞外設(shè)事件的時候處在非中斷上下文中,通過對于in_interrupt()的返回值判斷,能夠知道當(dāng)前使用該函數(shù)的驅(qū)動是否處在中斷上下文中;通過對于中斷上下文的判斷,如果事件是在中斷上下文中觸發(fā)的,則先直接通過函數(shù)netlink_broadcast去廣播;如果廣播失敗的話,就掛入內(nèi)核線程處理隊列,使用wake_up()函數(shù)喚醒內(nèi)核線程。
圖3顯示了上述過程在Ubuntu Server端中的關(guān)鍵執(zhí)行代碼。
圖3 關(guān)鍵代碼
在函數(shù)hw_event_send(int priority,struct mxc_hw_event new_event)中包含兩個參數(shù):一個是外設(shè)事件的優(yōu)先級,另外一個是外設(shè)事件形式參數(shù)的定義。在hw_event_send()函數(shù)中包含著兩層判斷,一層是上面已經(jīng)提到的關(guān)于中斷上下文的判斷,一層則是對于外設(shè)事件優(yōu)先級的判斷。如果是高優(yōu)先級的外設(shè)事件,同樣的,需要首先通過函數(shù)netlink_broadcast去廣播到用戶空間。對于普通優(yōu)先級并且是非中斷上下文觸發(fā)的外設(shè)事件,則是由內(nèi)核線程
kernel_thread(hw_event_thread,NULL,CLONE_KERNEL)負(fù)責(zé)接收的,當(dāng)在外設(shè)事件發(fā)送函數(shù)hw_event_send()中有外設(shè)事件需要傳遞給內(nèi)核線程的時候,總是會調(diào)用wake_up()喚醒函數(shù),去喚醒等待隊列,這主要是由于在內(nèi)核線程等待外設(shè)事件的時候,總是會 wait_event_interruptible()改變當(dāng)前的內(nèi)核線程運行狀態(tài)為可中斷睡眠狀態(tài)。
如圖2所示,文中將多播組設(shè)置成#define HW_EVENT_ GROUP 2,在內(nèi)核模塊中通過NETLINK_CB(skb).dst_group =HW_EVENT_GROUP初始化多播組為2,這樣在用戶空間就可以設(shè)置多個外設(shè)事件處理進程來監(jiān)聽該多播組,就可以實現(xiàn)多個監(jiān)控服務(wù)器端去監(jiān)聽特定的內(nèi)核事件的功能[11-16]。
如圖4顯示了當(dāng)沒有拔插事件在被監(jiān)控服務(wù)器端發(fā)生的時候,登錄的三號服務(wù)器沒有異常的事件發(fā)生,和圖4對比的是當(dāng)有拔插事件發(fā)生的時候,圖5顯示了當(dāng)前有西部數(shù)據(jù)的存儲設(shè)備插入了被監(jiān)控服務(wù)器端。同時顯示了插入的存儲設(shè)備具體信息。
圖4 無拔插事件的被監(jiān)控服務(wù)器端
圖5 有拔插事件的被監(jiān)控端服務(wù)器
文中的目的在于解決大型服務(wù)器集群中出現(xiàn)的未經(jīng)授權(quán)外設(shè)事件接入所引起的安全問題,進而提出了的一種基于netlink的linux服務(wù)器集群統(tǒng)一外設(shè)事件監(jiān)聽方法,用以實現(xiàn)對于linux集群內(nèi)部重要的外設(shè)事件的監(jiān)聽,具有多終端同時監(jiān)聽、統(tǒng)一和實時接收服務(wù)器內(nèi)部外設(shè)事件且編程方法簡單易實現(xiàn)等優(yōu)點。
[1]李坤麗,張大方,關(guān)洪濤,等.虛擬路由器管控平面的設(shè)計與實現(xiàn)[J].計算機工程,2014(5):94-98,102.
[2]宋婉貞,田洪濤.基于Profibus實現(xiàn)netLINK網(wǎng)關(guān)與PLC的通訊[J].電子工業(yè)專用設(shè)備,2012,41(2):50-53.
[3]尹家生,周健,辜麗川,等.基于Linux的高速網(wǎng)絡(luò)流量采集與分析模型研究[J].計算機工程與應(yīng)用,2006,42(10):151-154.
[4]李惠娟,王汝傳,任勛益,等.基于Netfilter的數(shù)據(jù)包捕獲技術(shù)研究[J].計算機科學(xué),2007,34(6):81-83.
[5]章曉明,杜春燕,陸建德,等.IPsec VPN中Netlink消息通信機制的研究和設(shè)計 [J].計算機工程與應(yīng)用,2006,42(34): 139-141.
[6]李惠娟,王汝傳,任勛益,等.基于Netfilter的數(shù)據(jù)包捕獲技術(shù)研究[J].計算機科學(xué),2007,34(6):81-83.
[7]杜飛,劉心松,邱元杰,等.netlink套接字在系統(tǒng)通信中的應(yīng)用研究[J].微計算機信息,2006,22(9):95-97,233.
[8]鄭子輝,楊東升,尹震宇,等.數(shù)控現(xiàn)場總線NCSF監(jiān)測分析系統(tǒng)的設(shè)計與實現(xiàn)[J].組合機床與自動化加工技術(shù),2011(5):46-50,55.
[9]董昱,馬鑫.基于netlink機制內(nèi)核空間與用戶空間通信的分析[J].測控技術(shù),2007,26(9):57-58,60.
[10]周莉,柯健,顧小晶,等.Netlink套接字在Linux系統(tǒng)通信中的應(yīng)用研究[J].計算機與現(xiàn)代化,2007(3):109-111.
[11]陳浩.Linux下用戶態(tài)和內(nèi)核態(tài)內(nèi)存共享的實現(xiàn)[J].電腦編程技巧與維護,2011(4):25-27.
[12]劉斌,朱程榮.Linux內(nèi)核與用戶空間通信機制研究[J].電腦知識與技術(shù),2012,8(16):3816-3817,3849.
[13]劉文峰,李程遠(yuǎn),李善平,等.嵌入式Linux操作系統(tǒng)的研究[J].浙江大學(xué)學(xué)報(工學(xué)版),2004,38(4):447-452.
[14]周莉,黃憲,陸建德,等.Linux 2.6內(nèi)核IPSec支持機構(gòu)的研究與分析[J].計算機技術(shù)與發(fā)展,2007,17(5):191-194,198.
[15]郭全生,舒繼武,毛希平,等.基于LVS系統(tǒng)的負(fù)載動態(tài)平衡設(shè)計與實現(xiàn)[J].計算機研究與發(fā)展,2004,41(6):923-929.
[16]林闖,李寅,萬劍雄.計算機網(wǎng)絡(luò)服務(wù)質(zhì)量優(yōu)化方法研究綜述[J].計算機學(xué)報,2011(1):1-14.
Unified monitoring mechanism of peripheral events based on netlink of Linux server clusters
WANG Min
(College of Computer Science and Engineering,Jiangsu Science and Technology University,Zhenjiang 212003,China)
The large-scale distributed server clusters system are lack of the unified monitoring mechanism of peripheral events .The unpermitted external storage partition and plug events are included in the mechanism.Firstly,peripheral events process and the service process are started by the monitoring server in its starting progress.And then the handling process of peripheral events monitor the netlink communication.At the end,peripheral events handling process send the peripheral events to the monitoring process through the network.The safety of whole large-scale distributed linux server clusters are promoted after the design of this mechanism.
computer network;server cluster;netlink;event monitor
TN91
A
1674-6236(2016)23-0076-03
2015-11-30稿件編號:201511297
汪 敏(1990—),男,江蘇揚州人,碩士。研究方向:信息安全。