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裝置的連線方式如下圖所示:
在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協議的協議棧為下圖所示:
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裝置具有的特性
- 支援報頭和資料摘要
- 支援兩種挑戰握手協議CHAP(ChallengeHandshake Authentication Protocol)的認證方式
- 目標端支援R2T(ReadytoTransfer)流控制
- 從RHEL4U2開始支援多通道(multipath)
- 支援sendtargets發現機制
- 支援動態目標端發現
- 具備非同步事件通知入口
- 支援即時資料更新
- 支援動態裝置重配
- 支援自動掛接iSCSI技術
- 支援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