存儲子系統剖析——從存儲子系統角度看FCoE模塊



        note:在之前的一篇FCoE模塊設計和實現的文章,大致講到了FCoE模塊的設計。雖然很清楚地講了FcoE模塊的組成,可是沒有站在整個存儲子系統的角度來看FCoE,總是有點侷限的感覺,然後存儲子系統和網絡子系統是怎麼交互的也沒有說清楚,希望在這裏這些疑問都能得到解答。

        我們知道linux內核是層次設計的設計模式,存儲子系統也不例外。下面這張圖(來自網絡)表示了linux下面存儲子系統的層次化模塊。




e.g.Application 訪問文件

        根據上圖,如果一個用戶空間中的應用程序(假設是用c語言編寫的)要讀取存放在remote scsi磁盤上面的某個文件,那麼這個應用程序就需要使用c庫的程序,然後調用內核提供的系統調用read(),系統調用會訪問VFS,也就是虛擬文件系統,那麼虛擬文件系統是什麼呢?虛擬文件系統其實是文件系統的抽象層(複用代碼的設計思想?),然後由VFS 選擇那個正確的文件系統,因爲甚至有的文件系統就是網絡文件系統呢。然後到了真正的文件系統,文件系統是一個組織文件在磁盤上面存放的管理系統,由文件系統找到文件對應的塊。再然後到了塊設備層。文件系統和塊設備驅動層會有一個叫做buffer cache的層次,那是將磁盤上面的數據緩存的一段內存和相關的數據結構。


        塊設備驅動需要要和下面的接口打交道,對於scsi子系統來說,或者對於更加具體的fcoe接口,這個交互過程是怎樣的?那麼首先看一下塊設備的作用吧。



塊設備

        當unix系統剛寫出來的時候,它有一個大膽的設計,那就是把所有的物理設備也都看做是文件。但是不同的設備是有區別的,有的是隨機存取,有的是按順序存取方式。但是爲什麼還要用同樣的接口(文件系統)來和一個打印機或一個磁盤設備通信呢?因爲即使他們不一樣,但是都抽象爲文件還是可以的,並且這樣可以讓整個系統變得很簡單。

        字符設備又稱爲rawdevices,比如打印機和終端機,文件系統根據這個文件,然後使用字符設備驅動提供的API就可以往字符設備讀寫數據。塊設備在文件系統裏面爲/dev/dsk,塊設備是隨機存取的,文件系統可以掛(mount)在塊設備上面,而不可以掛在字符設備上面。


塊設備驅動

         塊設備驅動是爲磁盤塊設備和文件系統之間通信的一個橋。系統可以將文件系統加載在塊設備上面,塊設備驅動大概就是提供了這樣的一個加載的功能,然後使得文件系統可以讀寫塊設備。

        塊設備驅動下面可能是scsi子系統或者別的磁盤設備驅動,直接連接磁盤。至於scsi子系統,下面將單獨介紹。



scsi子系統

        SCSI是一組標準集,定義了與大量設備通信所需的接口和協議。linux提供了一個SCSI子系統用於和SCSI設備通信。SCSI適合於可靠高性能遠距離存儲。


        SCSI是客戶機/服務器模型,客戶機發出SCSI命令,然後由服務器接收和處理SCSI命令,SCSI目標通常爲啓動程序提供一個或者多個邏輯單元號(LUN),SCSI實際的I/O操作也只處理這種實體。在存儲區域中,LUN通常表示一個主機能夠執行讀寫操作的磁盤。

 

        關於SCSI,我在FCoE模塊設計和實現介紹的比較詳細。總之,SCSI上層接收來自上層(比如通用塊層,文件系統)的請求並將其轉換成SCSI請求,及負責完成SCSI命令並將狀態信息通知上層。中間層是上層和底層的公共服務層。底層是一組驅動器,稱爲SCSI底層驅動,可以與物理設備通信。


note:學習塊設備編程和scsi塊設備編程?參考http://www.tldp.org/LDP/khg/HyperNews/get/devices/scsi/1.html



FCoE模塊

        從上面的分析中,我們發現FCoE模塊是作爲linux內核中SCSI子系統的底層驅動, 用來連接SCSI子系統和以太網系統,主要完成SCSI命令到FCoE幀的轉化。

        FCoE模塊的協議處理依賴scsi_transport_fc模塊、libfc模塊和libfcoe模塊。


 note:因爲FCoE模塊設計和實現介紹的比較詳細了,關於FCoE模塊的相關component不再重複,主要說一下I/O component。


         I/O模塊完成FCoE協議處理,其中包含了SCSI命令(或數據)生成FC幀、FC幀到FCoE幀的映射、FCoE幀封裝到以太網幀和發送到以太網核心。FCoE模塊需要結合SCSI系統,libFC模塊和以太網系統完成IO請求。發起端主要IO請求類型爲讀請求和寫請求。


        Ethernet模塊是Linux內核網絡處理的模塊,工作在網絡的l2層,負責將數據包發送到物理層(然後經過FCoE交換機達到storageserevr),或者將從link過來的層次轉發到別的層次,比如說網絡的上層,這裏是指的l3,又或者根據頭部的內容轉發到FCoE模塊,再由FCoE模塊處理後,交給SCSI子系統和存儲子系統進行處理。



#########存儲虛擬化

         在虛擬化環境中,存儲子系統又有着怎樣怎樣的layout?或許下面的簡單分析值得參考。

相對於host中的存儲子系統,虛擬機中的存儲子系統則有更多的層次(既包括VM由包括hypervisor和host),還可以由於部署的不同,有更大的彈性(flex?)。

比如說對於基於fcoe的存儲虛擬化,主要包括virtual disk, raw disk 和vm based storage。


Virtual disk是SCSI層的虛擬化,虛擬機通過SCSI層直接訪問存儲設備。虛擬機不需要考慮其存儲設備是網絡存儲還是本地存儲。Virtual disk是比較通用的模型,在不修改虛擬化平臺和內核代碼的情況下,可以在主流虛擬化平臺上運行。在論文[IOFlow]中的存儲方式就是這種Virtual disk的。

Raw disk的實現層次是FCoE協議棧,和FCoE的機制原理(FCoE的虛擬化)關係比較大。

NAS(Network Attached Storage)和iSCSI可以通過虛擬機的網絡設備訪問存儲設備,不需要VMM(VirtualMachine Monitor)將存儲設備映射給虛擬機。上述訪問存儲設備的模式,被稱爲VM-based storage,這種方式我在試驗中部署過。

 



p.s.這裏只是大概的講了一下存儲子系統,如果要精通存儲子系統最好看看linux內核源碼相關部分,順帶把網絡子系統的源碼看看~~


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章