iSCSI是由IBM發明的基於以太網的存儲協議,該協議與SUN的NFS協議都是爲了解決存儲資源共享問題的解決方案。二者意圖一致,只不過二者是不一樣的實現方式,前者在客戶機上呈現的是一個塊設備,然後者則是一個目錄樹。關於二者的區別,能夠參考本號以前的文章,本位再也不贅述。node
本文今天主要介紹一下iSCSI的總體架構,以及在Linux平臺上啓動器端(能夠理解爲客戶端,後續介紹該概念)如何實現對存儲設備(系統)的配置和訪問。安全
歸納的說,iSCSI是一種存儲設備遠程映射技術,它能夠將一個遠程服務器上的存儲設備映射到本地,並呈現爲一個塊設備(大白話就是磁盤)。從普通用戶的角度,映射過來的磁盤與本地安裝的磁盤毫無差別。bash
這種映射方式基因而基於SCSI協議的,SCSI協議是計算機與外圍設備(例如硬盤、光盤等)通訊的協議。而iSCSI則是經過TCP協議對SCSI進行封裝的一種協議,也就是經過以太網傳輸SCSI協議的內容。服務器
從上圖能夠看出來,iSCSI其實也是一種典型的客戶端服務器架構(CS架構),其中訪問存儲系統的計算機成爲客戶端,其中負責鏈接的軟件成爲啓動器。而提供存儲服務的計算機成爲服務端,其中的軟件成爲目標器。網絡
因爲iSCSI是基於TCP協議的,所以啓動器和目標器能夠是純軟件實現,也能夠基於硬件實現。若是是硬件實現,硬件實現主要是對SCSI命令封裝和解析等,這樣能夠釋放CPU資源。目前在Linux下面,啓動器和目標器都有純軟件的實現,好比啓動器的實現Open-iSCSI,目標器的實現LIO、SCST和TGT等。session
本節介紹關於iSCSI的一些基本概念,理解這些概念便於咱們理解iSCSI的原理及後續閱讀iSCSI的開源代碼。架構
Network Portal: 網絡端口。網絡實體的一個組成部分,它有一個 TCP/IP 地址。 網絡端口在 initiator 用 IP 地址標識, 在 target 用 IP 地址+偵聽的 TCP 端口標識。工具
Session: 鏈接 initiator 和 target 的一組 TCP 鏈接構成一個 session(能夠簡單理解爲 I_T nexus)。能夠向 session 添加 TCP 鏈接,也能夠把 TCP 鏈接從 session 刪除。 也就是說一個session中是能夠有多個鏈接的。經過一個 session 的全部鏈接,initiator 只看到同一個 target。加密
**Connection **: 一個 TCP 鏈接。Initiator 和 target 之間使用一或者多個 TCP 鏈接通訊。spa
CID(Connection ID): 一個 session 裏的每一個 connection 用 CID 進行標識,該標識在 session 範圍內是惟一。CID 由 initiator 產生,在 login 請求和使用 logout 關閉 鏈接時傳遞給 target。
SSID(Session ID):一個 iSCSI Initiator 與 iSCSI Target 之間的會話(Session)由會話ID(SSID)定義,該會話ID是一個由發起方部分(ISID)和目標部分(Target Portal Group Tag)組成的元組。 ISID 在會話創建時由發起者明確指定。 Target Portal Group Tag 由發起者在鏈接創建時選擇的 TCP端口來隱式指定。 當給定 TargetName 時,TargetPortalGroupTag 也必須由目標在鏈接創建期間做爲確認返回。
Portal Groups: 網絡端口組。iSCSI session 支持多鏈接,一些實現能把經過多個端口創建的多個鏈接捆綁到一個 session。 一個 iSCSI 網絡實體的多個網絡端口被定義爲一個網絡端口組,把該組和一個 session 聯繫起來,該 session 就能夠捆綁經過該組內多個端口創建的多個鏈接,再使它們一塊兒協同工做以達到捆綁的目的。每個該組的 session 並不須要包括該組的全部網絡端口。一個 iSCSI 節點可能有一或者多個網絡端口組,可是每個 iSCSI 使用的網絡端口只能屬於 iSCSI 節點的一個組。
Target Portal Group Tag: 網絡端口組標識。使用 16 比特的數標識一個網絡端口組。在 一個 iSCSI 節點裏,全部具備一樣組標誌的端口構成一個網絡端口組。
iSCSI Task: 一個 iSCSI 任務是指一個須要響應的 iSCSI 請求。
I_T nexus: I_T nexus 是指一個 SCSI initiator 的端口和一個 SCSI target 端口之間 的關係。 對於 iSCSI, 這個關係對應一個 session, 它指 session 的 initiator 端和 iSCSI target 網絡端口組之間的關係。I_T nexus 的標識是一對端口名稱(iSCSI initiator 名稱+i+ISID,iSCSI target 名稱+t+網絡端口組標識)。 PDU (Protocol Data Unit): initiator 和 target 之間通訊時把信息分割爲消息。這些 消息稱爲 iSCSI PDU。 SSID (Session ID): iSCSI initiator 和 iSCSI target 之間的 session 用 SSID 進行標識, 該標識由 initiator 部分的 ISID 和 target 部分的 TPGT 構成。
ISID(The initiator part of the Session Identifier):發起方會話標識,由 initiator 在 session 創建的時候明確給出,
TSIH (Target Session Identifying Handle): Target 分配給與特定名稱 initiator 創建的 session 的標識。 可是 0 值被保留着用於 initiator 告知 target 這是一個新 session。 在爲一個 session 添加一個 connect 時,TSIH 已經隱含指明。
Linux的啓動器包含內核態的啓動器、用戶態的守護進程和命令行工具3部份內容,總體架構仍是比較複雜的。可是若是不想理解其原理,只是通常使用的話,仍是比較簡單方便的。下面咱們介紹一下其操做步驟(這裏假設已經有一個存儲設備),關於更詳細的原理咱們後續再進行詳細的介紹。
啓動iscsi守護進程
在啓動器端是有一個守護進程的,首先要保證該守護進程是處於正常運行狀態。若是沒有運行的狀況下須要啓動該服務。
#service iscsi start
複製代碼
默認狀況下,系統啓動後此進程會自動運行的。若是沒有自動運行能夠經過下面命令進行控制和查看。
# chkconfig iscsi on
# chkconfig iscsi --list (查看ISCSI啓動狀態)
複製代碼
發現目標
默認狀況下,iscsi發起方和目標方之間經過端口3260鏈接。假設已知iscsi的目標方IP是192.168.1.1,運行下列命令:
# iscsiadm -m discovery -t sendtargets -p 192.168.1.1:3260
複製代碼
若是一切正常,過此時找到並擁有了一個目標(target):
192.168.1.1:3260,1 iqn.1997-05.com.test:itworld123
複製代碼
登入節點
以上面被發現的目標爲例:
# iscsiadm -m node –T iqn.1997-05.com.test:itworld123 -p 192.168.1.1:3260 -l
複製代碼
其中iqn.1997-05.com.test:itworld123是目標名。
查看磁盤信息
正常來講,若是登陸成功後在客戶端操做系統中就能夠看到新增的硬盤了。能夠經過下面命令查看。
# fdisk –l
複製代碼
格式化設備
iSCSI設備的使用與普通硬盤沒有任何差別,好比咱們想把該設備格式化爲ext4文件系統,運行:
# mkfs.ext4 /dev/sdb
複製代碼
具體使用咱們這裏就再也不解釋,使用方法與本地磁盤徹底一致。
登出節點
有些狀況下咱們可能須要登出節點,此時將端口啓動器和目標器之間的鏈接,磁盤也會消失。登出以前須要先中止對磁盤的使用。
# umount /mnt/iscsi_itworld123
複製代碼
執行以下命令能夠登出:
# iscsiadm -m node –T iqn.1997-05.com.test:raid -p 192.168.1.1:3260 –u
複製代碼
登入需驗證碼的節點
爲了保證存儲設備的安全,能夠對存儲設備設置權限認證,這樣只有合法用戶才能訪問存儲設備。下面是具備認證的存儲的登陸方法。
1)開啓認證
iscsiadm -m node -T [裝置] -o update --name node.session.auth.authmethod --value=CHAP *.使用-o同--op
複製代碼
2)添加用戶
iscsiadm -m node -T [裝置] --op update --name node.session.auth.username --value=[用戶名]
複製代碼
3)添加密碼
iscsiadm –m node –T [裝置] –op update –name node.session.auth.password –value=[密碼]
複製代碼
好了,今天先到這。咱們今天主要介紹iSCSI的基本架構以及啓動器端的使用。這個主要是讓你們有個感性的認識,爲後面介紹啓動器的實現打下基礎。後續咱們將介紹啓動器用戶態管理程序的架構和實現,以及內核態啓動器的實現。