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