FCOE協議介紹
太網光纖通道(FCoE)將FC幀映射並封裝到以太網幀中,從而使得光纖通道存儲流量能在太網上傳輸,加上FCoE交換機的支持,將以太網上IP數據和FC數據等其它數據流整合到統一網絡鏈路,構成一個融合網絡。
1背景
FCoE技術的背景:海量數據存儲
1.1存儲技術與海量數據存儲
本地存儲:直接連接存儲(Direct Attached Storage,DAS),直接與主機服務器相連接,不足是:I/O操作需要佔據服務器大量的CPU時間來處理SCSI指令和數據塊,擴展性差。
網絡存儲:包括網絡附加存儲(Network Attached Storage,NAS)和存儲區域網(Storage Area Network,SAN)。
NAS是以太網上利用NFS(Network File System),CIFS(Common Internet File System)等網絡文件系統對外提供訪問其文件系統接口的文件共享服務器。
SAN採用集中式存儲策略,在服務器與存儲設備之間通過交換機進行連接,將多級存儲器合併成一個集中管理的網絡存儲基礎設備。擴展性好,並且易於管理。
所以,爲了實現海量數據存儲,SAN是較好的存儲技術。現在主要SAN架構有FC-SAN和IP-SAN,其中FC-SAN採用光纖通道協議,部署於高性能的數據中心。
1.2 FC協議
光纖通道FC作爲SAN的一項連接技術已經取得了成功。
FC是一種雙向、點到點、串行的數據通道,而FC協議定義了數據在網絡上傳輸規則。FC協議分層,由物理接口層、編碼層、網絡層、通用服務層和上層協議(Upper Layer Protocol,ULP)映射層共五層構成。
如在FC-SAN中,將目標端系統的存儲設備掛載到發起端系統中,作爲一個塊設備進行訪問。
2 FCoE目的
大方向:實現以太網融合,減少數據中心的網絡複雜度。
技術目標:融合傳統局域網和SAN,在高速以太網鏈路上傳輸IP幀和FC幀。
3相關知識
3.1 SCSI系統
SCSI是一組標準集,定義了與大量設備通信所需的接口和協議。
SCSI上層接收來自上層(比如通用塊層,文件系統)的請求並將其轉換成SCSI請求,及負責完成SCSI命令並將狀態信息通知上層。
中間層是上層和底層的公共服務層。
底層是一組驅動器,稱爲SCSI底層驅動,可以與物理設備通信。
3.2塊設備和請求隊列
塊設備(Block Device)將信息存儲在固定大小的塊中,每個塊都有自己的地址,且每個塊都能獨立於其它塊進行讀寫,即具有隨機讀寫能力。
一個塊設備驅動只有一個請求隊列(關於請求隊列,和應用程序的socket隊列或者Qdisc是否可以對比?點擊這裏,應該是和Qdisc更加有比較性),用於完成I/O請求的合併、調度和處理。請求隊列跟蹤未完成的塊設備I/O請求,保存了描述設備所能處理的請求的參數,比如最大I/O大小,段數目,硬件扇區大小和對齊需求。請求隊列具有I/O調度功能,通過I/O調度程序來實現。
4 FCoE設計與實現
4.1總體功能設計
FCoE模塊是實現FCoE協議功能的總體模塊,包括:
模塊加載/卸載
接口創建/銷燬
FCoE登陸
I/O通信
FCoE模塊作爲LINUX內核中SCSI系統的底層驅動模塊,連接SCSI系統和以太網系統,主要實現SCSI命令到FCoE幀的轉化、數據傳輸任務控制、協議註冊、FCoE模塊和以太網系統的通信。
總體結構如下,
如上圖,FCoE接口的創建成功,還需要完成FCoE登陸,遠程目標端SCSI設備的發現和在發起端創建目標端設備的設備文件(/dev/sdb)。
FCoE模塊具有用戶接口和內部接口。
用戶接口控制模塊加載/卸載,接口創建/銷燬,接口開啓/關閉等功能。
內部接口實現FCoE模塊和LINUX內核各系統或模塊交互。
如下,
FCoE模塊的協議處理依賴scsi_transport_fc模塊、libfc模塊和libfcoe模塊。
scsi_transport_fc模塊提供了SCSI系統與FC之間的接口。
libfc模塊提供了FC協議處理接口。
Libfcoe模塊提供了FCoE協議處理接口,也爲FCoE模塊提供用戶接口。
4.2功能模塊設計與實現
加載/卸載模塊
FCoE模塊的加載主要完成向FCoE Transport和FC Tranport的添加,申請資源,創建內核線程,註冊通知鏈等。FCoE模塊的卸載主要完成運行期間建立資源的釋放(比如接口創建)和模塊加載資源的釋放。
加載/卸載模塊的實現比較簡單。
接口創建
FCoE接口創建主要是完成FCoE接口結構(struct hust_interface)分配和初始化,及FIP和FCoE協議註冊,接口創建成功後,會繼續完成登陸和設備發現等工作,通過調用用戶接口create來創建FCoE接口。FCoE接口創建的同時,需要創建對應的FC接口,FC接口是實現FC協議處理的關鍵。
hust_fcoe_create是實現FCoE接口創建的函數(如圖)。hust_interface_lookup函數完成接口查詢,判斷某網卡接口是否已經創建FCoE接口,如果沒有創建則創建接口,否則返回。hust_inteface_create完成接口的實際創建工作,調用fcoe_ctlr_init完成FIP和FCoE協議初始化和註冊,調用hust_interface_setup完成FCoE接口配置(如圖)。hust_fcoe_hardware_setup函數完成硬件配置工作,該函數開啓網卡的硬件卸載功能,可以更具不同的網卡類型配置不同的運行環境,比如開啓Intel網卡的DDP(Direct Data Placement)功能。
接口銷燬
接口銷燬是接口創建的逆過程,但在接口銷燬前需要關閉接口和清除隊列中未完成的請求。網卡接口上已經創建對應的FCoE接口,可以調用用戶接口destroy來銷燬FCoE接口。hust_fcoe_destory是FCoE接口的銷燬函數,調用hust_if_destory_work完成FC接口銷燬。
登陸
FCoE登陸主要完成發起端發現FCF,向FCF註冊和DNS註冊。
發起端可能與FCoE網絡的交換機連接或與目標端設備直連,發送FLOGI,根據ACC(FLOGI)選擇方式建立和目標設備的連接。
如果發起端連接FCoE交換機,需要PLOGI登陸FCF的DNS,在DNS註冊自己的端口信息,並獲得其它端口信息,完成DNS過程後,就可以向其它設備發送PLOGI請求。
如果是目標端設備,還會建立進程通信和在發起端建立目標端設備文件。如果發起端直連目標端設備,則直接進行目標端的PLOGI和後續操作。如下,
IO模塊
IO模塊完成FCoE協議處理,其中包含了SCSI命令(或數據)生成FC幀、FC幀到FCoE幀的映射、FCoE幀封裝到以太網幀和發送到以太網核心。
FCoE模塊需要結合SCSI系統,libFC模塊和以太網系統完成IO請求。發起端主要IO請求類型爲讀請求和寫請求。讀請求是發起端向目標端發送讀命令,目標端接收到命令後將數據發送給發起端。寫請求是發起端向目標端發送寫命令,目標端接收到命令後分配接收數據所需的內存並通知發起端,然後發起端將數據發送到目標端。
fc_queuecommand爲SCSI系統的接口函數,將SCSI請求發送到底層處理。
5效果
在發起端看來,訪問存儲區域網的設備就像訪問本地的塊設備一樣簡單高效!
以傳輸的角度看,光纖通道(FC)幀映射並封裝到以太網幀中,從而使得光纖通道存儲流量能在太網上傳輸。使得能在高速以太網鏈路上同時傳輸IP幀和FC幀。
從數據中心角度,FCoE可以和數據中心現有的以太網及FC基礎設施無縫互通,將以太網上IP數據和FC數據等其它數據流整合到統一網絡鏈路,構成一個融合網絡。
在IT業界看來,FCoE爲存儲網絡流量提供統一交換網絡,更有效地利用資源、減少交換基礎設施、服務器的IO適配器和線纜的數量,從而大幅減少電力和冷卻成本。同時,簡化的基礎設施也能降低管理和運營開支。