1. 程式人生 > >iSCSI協議簡介

iSCSI協議簡介

本文綜合了幾篇參考文獻的內容,做了刪減與重組,但嚴格來說,不算原創。

筆者筆記如下:

iSCSI initiator和target的核心功能都在核心中,無須人工干預;而要人工干預的大約是這麼幾件事: 

1. 建立iSCSI Initiator到iSCSI target的session(雖也可自動發現,但還是要有些配置)

2. 建立LUN,以便位於Initiator端的系統進行塊裝置的掛載

3. 將來不需要的時候,可刪除1和2中建立的LUN和iSCSI連線

至於應用程式將讀寫塊裝置,大致路徑是:應用程式 -> 系統呼叫 -> 檔案系統 -> 核心 -> iSCSI相應模組(initiator or target) -> 網路協議棧 -> 對端

 

1. SCSI協議

SCSI: Small Computer System Interface,SCSI最初是一種專門為小型計算機系統設計的I/O技術,但由於其架構和協議自身的優點,後被廣泛應用於實現DAS以及作為SAN的底層技術。

所有的SCSI裝置是通過一根匯流排將其連線起來,這個線就叫做SCSI匯流排。SCSI匯流排是SCSI裝置之間傳輸資料的通路。SCSI匯流排又被稱作SCSI通道。SCSI匯流排最終會連線到SCSI控制器上,SCSI控制器也稱為主機介面卡(HBA),它控制著SCSI總線上所有的裝置與計算器之間的通訊。控制器既可以是插入可用插槽的卡,也可以內建在主機板上。

(注:SCSI連線長度一般不超過25米,掛載的總裝置數不超過16個(除去SCSI控制器,就是15個))

因此,SCSI控制器和SCSI裝置的連線方式如下圖所示:

wKiom1T4j5WxrZMVAAFn4osqIqI716.jpg

在SCSI匯流排末端上有一個終結器,用來減小相互影響的訊號,維持SCSI鏈上的電壓恆定。

 

1.1 SCSI基本概念介紹

SCSI ID

一個獨立的SCSI匯流排按照規格不同可以支援8或16個SCSI目標裝置(可以稱為Target),每個SCSI目標裝置都必須具有唯一的識別符號(ID)才能正常工作。SCSI ID實際上就是這些目標裝置的地址。

窄SCSI匯流排最多允許8個、寬SCSI匯流排最多允許16個不同的SCSI目標裝置和它進行連線。但是一般SCSI控制器需要使用一個ID,因此,能使用的ID理論比實際要少一個。

LUN

在每一個SCSI目標裝置(Target)下還可以連線多個邏輯裝置(如磁碟,卷組等等),為了讓系統區分每一個邏輯裝置,因此每一個邏輯裝置都有一個LUN(Logical  Unit Number)來標識自己。每個SCSI ID最多有32個LUN,預設從0開始(不過0被佔用了),每一個LUN對應著一個邏輯裝置。

SCSI通訊模型

SCSI是一個C/S架構,其中client端叫做initiator(啟動器),伺服器端叫做target(目標裝置)。SCSI協議採用了分層的思想,SCSI協議簇從上向下可以分為四層:裝置特定命令集,共享命令集,傳輸協議,網際網路層。並且SCSI的資料傳輸是以塊的方式進行的。

CDB (命令描述塊)

SCSI的命令以及引數是填充在一定長度的資料塊內傳輸的。這個資料塊就是命令描述塊,即CDB. 

典型的SCSI系統

 

2. iSCSI協議

雖然SCSI控制器可以連線多個儲存裝置,形成自己的網路,但是它只能與直接相連的儲存裝置進行通訊,只能在在區域網內部使用,不能再乙太網上共享。因此,對於SCSI協議來說,傳輸資料的距離是非常有限的。因此,人們為了利用SCSI協議長距離的傳輸資料,於是就研發了一種新的技術,就是iSCSI協議。另有一個重要的原因是,基於Fiber Channel的FC-SAN比較昂貴,而基於iSCSI的IP-SAN就便宜很多。
iSCSI協議是一種新的儲存技術,它是將SCSI介面與乙太網(Ethernet)技術結合起來工作的,簡單的說iSCSI協議是將使用者的請求轉換成SCSI規則編碼,然後再將這些資料封裝在IP包中以便在乙太網中進行傳輸的協議。

 

2.1 iSCSI協議的功能

iSCSI:internet Small Computer System  Interface的縮寫,即Internet小型計算機介面。iSCSI技術是一種由IBM公司研究開發的,是一個供硬體裝置使用的可以在IP協議的上層執行的SCSI指令集,這種指令集合可以實現在IP網路上執行 SCSI協議,使其能夠在諸如高速千兆乙太網上進行路由選擇。它是基於TCP/IP協議的,用來建立和管理IP儲存裝置、主機和客戶機之間的相互連線,並建立SAN。這樣使得SAN利用SCSI協議應用在高速資料傳輸網路成為可能。這種傳輸是以塊級別的方式在各個儲存裝置上進行的。

2.2 iSCSI的結構

由於SCSI協議是一個C/S架構,因此iSCSI協議也是一個C/S結構,其中client是initiator,server端為target。iSCSI協議的主要功能是利用TCP/IP網路,在主機系統(可稱為initiator)和目標儲存裝置(稱為target)之間進行大量的資料封裝和可靠傳輸過程。此外,iSCSI協議還將SCSI協議封裝在IP網路上,並且執行在TCP上。
因此,ISCSI協議的協議棧為下圖所示:

wKioL1T67XKxgABQAAEgPELrafo516.jpg

 

2.3 iSCSI協議的工作原理

當iSCSI主機發起資料讀寫操作後,作業系統會生成一個SCSI指令集,然後該SCSI指令集在iSCSI initiator端被封裝成iSCSI訊息包,並通過TCP/IP網路傳輸到儲存區域,當儲存區域的iSCSI target收到iSCSI訊息包時會將其解開,讀取其中的SCSI指令,然後再將其SCSI指令傳送給SCSI裝置執行其指令。當SCSI指令被執行後,返回的資料經過SCSI裝置傳送給iSCSI target時被封裝為iSCSI的響應PDU,然後再通過TCP/IP網路傳輸給iSCSI initiator端,iSCSI initiator解開其iSCSI PDU包,讀取其中的SCSI響應內容,並將其提交給作業系統進行處理,然後作業系統在將其處理後的內容返回給應用程式。

 

2.4 iSCSI的優點

iSCSI最大的優點就是節約成本,利用iSCSI協議構建一個儲存網路,除了需要儲存裝置,交換機、線纜還有乙太網介面以外,基本就不需要其他的裝置了,只需要在現有的網路上安裝iSCSI就可以實現構建一個比較大的儲存網路了。

 

2.5 iSCSI基本概念

iSCSI客戶端 (iSCSI Initiator)

iSCSI客戶端為iSCSI initiator,這是I/O操作的發起者。在RedHat Linux系統中可以通過軟體來模擬,需要安裝iSCSI裝置驅動。如iscsi-initiator-utils.rpm
iSCSI  initiator具有的特性:
a) 既然是I/O操作的發起者,需要通過發現過程請求遠端快裝置。
b) 它可以與target進行持久連線
c) Linux中可以通過軟體方式來實現

iSCSI伺服器端 (iSCSI Target)

iSCSI伺服器端為iSCSI target,這是I/O操作的執行者。在RedHat Enterprise Linux中可以使用scsi-target-utils軟體包來模擬實現。
iSCSI target端具有的特性:
a) 需要匯出一個或多個塊裝置供啟動者(initiator)使用
b) 可以通過硬體和軟體的方式來實現

iSCSI target裝置名稱

iSCSI target名稱必須是全球唯一的,其格式為:

iqn.<yyyy-mm>.<tld.domain.some.host>[:<identifier>]

# iqn:iSCSI target名稱必須是以iqn開頭的
# yyyy-mm:表示的是時間
# tld.domain.some.host:這個表示的是一個反過來寫的域名
# identifier:這個可以是任意字串
# 如:iqn.2015-03.com.xsl.www:storge.disk1

邏輯單元號LUN

LUN ID由iSCSI目標裝置(Target)分配。iSCSI 啟動端(Initiator)裝置當前支援在每個目標裝置(Target)中匯出最多256個LUN。即最大支援16個target。
對於LUN,比較通俗的理解就是磁碟分割槽、LVM卷組、RAID等等。

Target 即“儲存裝置”(Storage Device),也就是存放資料的硬碟(以硬碟陣列居多)。在使用iSCSI時,會在 iSCSI 儲存裝置上去建立 LUN(Logical Unit Number)來提供給具備 iSCSI Initiator 功能的主機來存取 資料的。LUN 好比是個“邏輯單位磁碟”,物理上通常是由數個實體磁碟( RAID 或 LVM 技術的技術實現)所組成。


2.6 iSCSI的發現機制

iSCSI發起端為了和iSCSI目標端建立iSCSI會話,initiator需要知道target的 IP地址,TCP埠號和名字 三個資訊。iSCSI發現的目的是為了讓iSCSI發起端獲取一條到iSCSI目標端的通路。iSCSI有三種發現機制:

a. 靜態配置

在iSCSI發起端已經知道iSCSI目標端的IP地址TCP埠號和名字資訊時,iSCSI發起端不需要執行發現。iSCSI發起端直接通過IP地址和TCP埠來建立TCP連線,使用iSCSI目標端的名字來建立iSCSI會話。這種發現機制比較適合比較小的iSCSI體系結構

b. SendTarget發現

在iSCSI發起端知道iSCSI目標端的IP地址和TCP埠的情況下,iSCSI使用IP地址和TCP埠號建立TCP連線後建立發現對話。iSCSI發起端傳送SendTarget命令查詢網路中的存在的iSCSI資訊。這種方法主要用於閘道器裝置,iSCSI發起端被靜態配置連線到指定的iSCSI裝置。iSCSI發起端和iSCSI閘道器裝置建立對話併發送SendTarget請求給iSCSI閘道器裝置。iSCSI閘道器裝置返回一系列和它相連的ISCSI目標端的資訊。iSCSI發起端選擇一個目標端來建立對話。

c. 零配置發現

這種機制用於iSCSI傳送裝置完全不知道iSCSI目標端的資訊的情況下。iSCSI發起端利用現有的IP網路協議SLP(Service Location Protocol for Discovery,服務定位協議)。iSCSI目標端使用SLP來註冊,iSCSI發起端可以通過查詢SLP代理來獲得註冊的iSCSI目標端的資訊。當iSCSI目標端加入到網路中的時候,拓撲結構也隨之改變。雖然這種方法增加了實現的複雜性,但它不需要重新配置發起端即可找到新的目標端。

 

2.7 iSCSI裝置具有的特性

  1. 支援報頭和資料摘要
  2. 支援兩種挑戰握手協議CHAP(ChallengeHandshake  Authentication Protocol)的認證方式
  3. 目標端支援R2T(ReadytoTransfer)流控制
  4. 從RHEL4U2開始支援多通道(multipath
  5. 支援sendtargets發現機制
  6. 支援動態目標端發現
  7. 具備非同步事件通知入口
  8. 支援即時資料更新
  9. 支援動態裝置重配
  10. 支援自動掛接iSCSI技術
  11. 支援IPV6技術

2.8 iSCSI裝置名稱

iSCSI裝置在iSCSI啟動端(Initiator)匯入的時候,其核心將按當前的裝置情況給iSCSI裝置分配一個本地SCSI裝置名(例如/dev/sda或/dev/sdb等),如果匯入的iSCSI裝置已被分割槽,在匯入iSCSI裝置建立本地SCSI裝置的同時也會建立相應的分割槽裝置名(例如/dev/sda1、/dev/sda5等等),但是此SCSI裝置名並不是每次匯入是都是固定的,比如你的主機之前沒有/dev/sda裝置,你匯入了iSCSI裝置,其被核心命名為/dev/sda;之後你將其取消了匯入,並重新掛接了一個熱插拔裝置(如U盤或行動硬碟),這個熱插拔裝置佔據的/dev/sda裝置;你又重新匯入了iSCSI裝置,此時其被核心分配的裝置名就成了 /dev/sdb。

 

3. tgtadm的使用

tgtadm是一個伺服器端管理配置工具,它也是一個模式化的命令,其常見的模式有target、logicalunit、account


3.1 target模式

tgtadm  --lld  <driver>  --mode  target  --op  {new|delete|show|update|bind|unbind} [option]

其中,driver一般為iscsi, --op後面的引數表示要進行的操作:

  • new: 增加一個target,語法格式為:--tid <id> --targetname <name>
  • delete:刪除一個target,語法格式為:delete --tid <id>
  • show:顯示所有的target,後面可以接某個target的id,只顯示某個target的資訊。格式為:show [--tid <id>]
  • update:修改某個特定的target的引數。格式為:update --tid <id> --name <param> --value <value>
  • bind:將某個特定的initiator和target繫結在一起,表示只接受特定的initiator的請求。語法格式為: bind --tid <id> --initiator-address <address>
  • unbind:解綁。語法格式為:unbind --tid <id> --initiator-address  <address>

 

3.2 logicalunit模式

tgtadm --lld  <driver>   --mode   logicalunit  --op  {new|delete}  [option]

其中,driver一般為iscsi,--op後面的引數表示要進行的操作: 

  • new: 新建一個LUN,語法格式為:new --tid <id> --lun <lun>  --backing-store <device-path> --bstype <type> --bsoflags 
  • delete: 刪除一個LUN,語法格式為:delete --tid <id> --lun <lun>

 

3.3 account模式

tgtadm --lld  <driver>   --mode   account  --op  {new|delete|bind|unbind}  [option]

其中,driver一般為iscsi,--op後面的引數表示要進行的操作:

  • new: 新建一個賬號和密碼,格式為:new --user <name> --password <pass>
  • delete: 刪除某個已有的賬號,格式為:delete --user <name>
  • bind:在某個特定的target上新增賬號,格式為:bind --tid <id> --user <name> [--outgoing],如果使用了--outgoing選項,將被新增作為出去的賬號來使用。
  • unbind:在某個特定的target上刪除某個賬號。其格式為:account --op unbind --tid <id> --user <name>

 

在tgtadm命令中,某些長選項可以使用短選項來代理,如:

 --lld=-L
 --tid=-t
 --lun=-l
 --backing-store=-b
 --initiator-address=-I
 --targetname <targetname>=-T

 

4. iscsiadm的使用

iscsiadm是一個客戶端的管理工具,它也是一個模式化的工具,其模式可通過-m或--mode選項指定,常見的模式有discovery、node、fw、session、host、iface幾個。這些模式的主要功能如下:

  • discovery: 用於發現某伺服器是否有target輸出,以及輸出了哪些target
  • node: 管理跟某target的關聯關係
  • session:用於顯示所有的活動會話和連線
  • fw:顯示所有的啟動韌體值
  • host:顯示所有的iSCSI主機
  • iface:顯示/var/lib/iscsi/ifaces目錄中的所有ifaces設定

4.1 discovery模式

iscsiadm -m discovery  [ -d debug_level ]  [ -I iface -t type -p  ip:port  [-l ] ] 

discovery模式下可用選項:

  • -d, --debug   顯示debug資訊,級別為0-8;
  • -l, --login   表示登入target的意思
  • -t, --type 這裡可以使用的型別為sendtargets(可簡寫為st)、slp、fw和 isns,此選項僅用於discovery模式,且目前僅支援st、fw和isns;其中st表示允許每個iSCSI target傳送一個可用target列表給initiator;
  • -p, --portal  指定target服務的IP和埠;
  • -m, --mode   可用的mode有discovery, node, fw, host iface 和 session

4.2 node模式

iscsiadm -m node [ -d debug_level ] [ -L all,manual,automatic ] [ -U all,manual,automatic ] [ [ -T targetname -p ip:port -I iface ] [ -l | -u | -R | -s] ] [ [ -o operation ] 

node模式下可用選項:

  • -L ,--loginall  表示登入到所有發現的target裝置上。all表示登入到所有的target裝置上;manual表示手動登入;automatic表示自動登入。
  • -T, --targetname  用於指定target的名字
  • -u, --logout   從target裝置上登出
  • -s, --stats   顯示session統計資訊
  • -o, --op:指定針對discoverydb資料庫的操作,其僅能為new、delete、update、show和nonpersistent其中之一;
  • -I, --interface:指定執行操作的iSCSI介面,這些介面定義在/var/lib/iscsi/ifaces中;

4.3 session模式

iscsiadm -m session  -s  # 顯示會話的相關資訊

4.4 客戶端配置檔案/etc/iscsi/iscsid.conf 

這個檔案中的主要引數有如下:

  • node.startup   設定啟動方式,可選的引數有auotmatic 和manual
  • node.session.auth.authmethod 設定使用CHAP認證方式,預設為NONE
  • node.session.auth.username target端認證所需initiator提供的使用者
  • node.session.auth.password target端認證所需initiator提供的密碼
  • node.session.auth.username_in initiator端認證所需target提供的使用者
  • node.session.auth.password_in initiator端認證所需target提供的密碼
  • discovery.sendtargets.auth.authmethod 設定使用CHAP認證方式用以發現target端匯出的裝置,預設為NONE
  • discovery.sendtargets.auth.username 發現操作時target端認證所需initiator提供的使用者
  • discovery.sendtargets.auth.passwd 發現操作時target端認證所需initiator提供的密碼
  • discovery.sendtargets.auth.username_in 發現操作時initiator端認證所需target提供的使用者
  • discovery.sendtargets.auth.password_in 發現操作時initiator端認證所需target提供的密碼

4.5 客戶端的認證方式

客戶端的認證方式有2種:一種是基於ip認證的;另一種是基於使用者認證的,使用的認證協議為CHAP。同時iscsi-initiator-utils不支援discovery的認證。對於使用者認證而言,必須先配置基於ip認證,然後才可以配置基於使用者認證。

 

參考文獻:

http://blog.51cto.com/xslwahaha/1617781

https://blog.csdn.net/qq776306395/article/details/27490977

https://wenku.baidu.com/view/5aa43ef6f705cc175527097b.html