天天看點

iSCSI原理和實作

資料往往是應用程式(架構)核心,那麼如何存儲資料就非常重要。

顧名思義,直接附加存儲就是将存儲直接附加在應用伺服器中來實作資料的存儲。儲存設備是通過接口類型于應用程式伺服器連接配接的。

IDE (并行):資料可能有幹擾 理論:133MB/s。早期是叫做ATA

SATA (串行)II: 3Gbps III: 6Gbps

    IDE速度慢,出現了SCSI(Smal System System Interface)。

SCSI接口:

    UltraSCSI-320:320MB/s

    UltraSCSI-640:640MB/s

SAS: 6Gbps

USB,sSATA,1394

現在直連式存儲與伺服器主機之間的連接配接通道通常采用SCSI協定連接配接

一般說來,NAS是檔案伺服器。像NFS,Samba等。提供檔案級别的共享。

SCSI之間通信是一種C/S架構。

叫做Initator(發起者 C)

這裡稱之為Target:(目标 S),每個Target可包含多個LUN(Logical Unit Number 邏輯單元)。真正提供服務的是LUN。

下圖是SCSI協定之間通信的過程:

<a href="http://guoting.blog.51cto.com/attachment/201409/20/8886857_1411228392dbxp.png" target="_blank"></a>

<a href="http://guoting.blog.51cto.com/attachment/201409/20/8886857_1411228428fRuv.png" target="_blank"></a>

核心空間:系統調用 --》 虛拟檔案系統 --》 檔案系統 --》 buffer cache --》 驅動 --》 SCSI接口

使用者空間:通過GNU c library 調用核心空間的系統調用

如下圖:

<a href="http://guoting.blog.51cto.com/attachment/201409/20/8886857_1411228438LQzM.png" target="_blank"></a>

所謂iSCSI是利用tcp/ip協定來傳輸SCSI封包的一種機制。

說明:

172.166.10.16 Target端

1

2

3

4

5

<code>### Target端:(172.16.10.16)</code>

<code>1、準備要共享的裝置,這裡使用本地磁盤上的新分區代替(隻需要分區,不需要格式化即可)</code>

<code>fdisk</code> <code>/dev/sda</code>

<code>partx -d </code><code>/dev/sda</code>

<code>partx -a </code><code>/dev/sda</code>

<a href="http://guoting.blog.51cto.com/attachment/201409/20/8886857_1411228454Q7aj.png" target="_blank"></a>

準備好共享磁盤後,繼續以下的操作:

<code>2、安裝iscsi服務端:</code>

<code>yum -y </code><code>install</code> <code>scsi-target-utils</code>

<code>service tgtd start</code>

<code>chkconfig tgtd on</code>

<code>netstat</code> <code>-tnlp | </code><code>grep</code> <code>3260</code>

<a href="http://guoting.blog.51cto.com/attachment/201409/20/8886857_1411228481Y85W.png" target="_blank"></a>

服務端的配置,可以使用指令方式,也可使用配置檔案的方式。

tgtadm指令的介紹:

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

42

43

44

45

46

47

48

49

50

51

52

<code>tgtadm 是一個模式化的指令</code>

<code>使用格式:tgtadm --lld [driver] --</code><code>op</code> <code>[operation] --mode [mode] [OPTION]...</code>

<code>常見的模式(mode):target logicalunit account</code>

<code>#####################################################</code>

<code>target模式的管理指令:管理target</code>

<code>    </code><code>new:建立一個新的 target</code>

<code>    </code><code>show:顯示target</code>

<code>    </code><code>delete:删除target</code>

<code>    </code><code>update:更新(修改)target</code>

<code>    </code><code>bind:基于IP位址控制</code>

<code>    </code><code>unbind:解除綁定</code>

<code>logicalunit模式的管理指令:關聯tid和後端磁盤</code>

<code>    </code><code>new:建立一個新的LUN</code>

<code>    </code><code>deltete:删除一個已有的LUN</code>

<code>account模式的管理指令:管理account CHAP(挑戰式握手應用) 單向認證 </code>

<code>    </code><code>new</code>

<code>    </code><code>deltete</code>

<code>    </code><code>bind</code>

<code>    </code><code>unbid</code>

<code>target和Initator之間是通過iqn名稱來通信的</code>

<code>iqn格式名稱:</code>

<code>    </code><code>iqn.yyyy-mm.reverse-domaim-name:string[.sunstring]</code>

<code>例如:iscsi-iname -p iqn.2014-09.com.magedu.target</code>

<code>也可通過指令的生成的方式:iscsi-iname -p iqn.2014-09.com.magedu</code>

<code>示例:</code>

<code># (1)、添加一個新的 target 且其ID為 [id], 名字為 [name].</code>

<code>--lld [driver] --</code><code>op</code> <code>new --mode target --tid=[</code><code>id</code><code>] --targetname [name]</code>

<code># (2)、顯示所有或某個特定的target:</code>

<code>--lld [driver] --</code><code>op</code> <code>show --mode target [--tid=[</code><code>id</code><code>]]</code>

<code># (3)、向某ID為[id]的裝置上添加一個新的LUN,其号碼為[lun],且此裝置提供給initiator使用。</code>

<code>## [path]是某“塊裝置”的路徑,此塊裝置也可以是raid或lvm裝置。lun0已經被系統預留。</code>

<code>--lld [driver] --</code><code>op</code> <code>new --mode=logicalunit --tid=[</code><code>id</code><code>] --lun=[lun] --backing-store [path]</code>

<code># (4)、删除ID為[id]的target:</code>

<code>--lld [driver] --</code><code>op</code> <code>delete --mode target --tid=[</code><code>id</code><code>]</code>

<code># (5)、删除target [id]中的LUN [lun]:</code>

<code>-lld [driver] --</code><code>op</code> <code>delete --mode=logicalunit --tid=[</code><code>id</code><code>] --lun=[lun]</code>

<code># (6)、定義某target的基于主機的通路控制清單,其中,[address]表示允許通路此target的</code>

<code>#  initiator用戶端的清單:</code>

<code>--lld [driver] --</code><code>op</code> <code>bind --mode=target --tid=[</code><code>id</code><code>] --initiator-address=[address]</code>

<code># (7)、解除target [id]的通路控制清單中[address]的通路控制權限:</code>

<code>--lld [driver] --</code><code>op</code> <code>unbind --mode=target --tid=[</code><code>id</code><code>] --initiator-address=[address]</code>

通過tgtadm指令提供SCSI服務:

<code>步驟如下:</code>

<code># 建立一個target:</code>

<code>tgtadm --lld iscsi --</code><code>op</code> <code>new --mode target --tid 1 -T iqn.2014-09.com.magedu:test2</code>

<code># 建立LUN,号碼為1:</code>

<code>tgtadm --lld iscsi --</code><code>op</code> <code>new --mode logicalunit --tid 1 --lun 1 -b </code><code>/dev/sda5</code>

<code># 開放給172.16.0.0/16網絡中的主機通路:</code>

<code>tgtadm --lld iscsi --</code><code>op</code> <code>bind --mode target --tid 1 -I 172.16.0.0</code><code>/16</code>

<code>其中的-I相當于--initiator-address</code>

<a href="http://guoting.blog.51cto.com/attachment/201409/20/8886857_1411228497ROQ8.png" target="_blank"></a>

建立完成後,可以使用如上圖的指令檢視,檢視正确後,服務端配置完成。

在用戶端:

這裡使用的位址是:172.16.10.22

<code>用戶端配置(Initiator):</code>

<code>yum </code><code>install</code> <code>iscsi-initiator-utils </code><code># 用戶端管理工具</code>

<code># 以下配置是非必需的,預設情況下,會有一個預設的iqn名稱</code>

<code>echo</code> <code>"InitiatorName=`iscsi-iname -p iqn.2014-09.com.magedu`"</code> <code>&gt;  \</code>

<code>  </code><code>/etc/iscsi/initiatorname</code><code>.iscsi</code>

<code>echo</code> <code>"InitiatorAlias=initiator1"</code> <code>&gt;&gt; </code><code>/etc/iscsi/initiatorname</code><code>.iscsi</code>

<code>service iscsi start</code>

<code>chkconfig iscsi on</code>

用戶端Initator使用iscsiadm指令來發現,登陸裝置。

<code>iscsiadm是個模式化的工具,其模式可通過-m或--mode選項指定,常見的模式有discovery、</code>

<code>    </code><code>node、fw、session、host、iface幾個。</code>

<code>如果沒有額外指定其它選項,則discovery和node會顯示其相關的所有記錄;</code>

<code>session用于顯示所有的活動會話和連接配接</code>

<code>fw顯示所有的啟動固件值</code>

<code>host顯示所有的iSCSI主機</code>

<code>iface顯示</code><code>/var/lib/iscsi/ifaces</code><code>目錄中的所有ifaces設定。</code>

<code># 用法如下:</code>

<code>iscsiadm -m discovery [ -d debug_level ] [ -P printlevel ] \</code>

<code>      </code><code>[ -I iface -t </code><code>type</code> <code>-p ip:port [ -l ] ] </code>

<code>iscsiadm -m node [ -d debug_level ] [ -P printlevel ] [ -L all,manual,automatic ] \</code>

<code> </code><code>[ -U all,manual,automatic ] [ [ -T </code><code>tar</code><code>-getname -p ip:port -I iface ] \</code>

<code> </code><code>[ -l | -u | -R | -s] ] [ [ -o operation ] </code>

<code># 參數說明:</code>

<code>-d, --debug=debug_level   顯示debug資訊,級别為0-8;</code>

<code>-l, --login</code>

<code>-t, --</code><code>type</code><code>=</code><code>type</code>  <code>這裡可以使用的類型為sendtargets(可簡寫為st)、slp、fw和 isns,</code>

<code>    </code><code>此選項僅用于discovery模式,且目前僅支援st、fw和isns;其中st表示允許每個iSCSI target</code>

<code>    </code><code>發送一個可用target清單給initiator;</code>

<code>-p, --portal=ip[:port]  指定target服務的IP和端口;</code>

<code>-m, --mode </code><code>op</code>  <code>可用的mode有discovery, node, fw, host iface 和 session</code>

<code>-T, --targetname=targetname  用于指定target的名字</code>

<code>-u, --</code><code>logout</code> 

<code>-o, --</code><code>op</code><code>=OPEARTION:指定針對discoverydb資料庫的操作,其僅能為new、delete、update、show</code>

<code>   </code><code>和nonpersistent其中之一;</code>

<code>-I, --interface=[iface]:指定執行操作的iSCSI接口,這些接口定義在</code><code>/var/lib/iscsi/ifaces</code><code>中;</code>

<code>iscsiadm -m discovery -t sendtargets -p 172.16.10.16</code>

<code>iscsiadm -m node -T iqn.2014-09.com.magedu:test2 -p 172.16.10.16 -l</code>

<a href="http://guoting.blog.51cto.com/attachment/201409/20/8886857_1411228507RAgY.png" target="_blank"></a>

登陸成功後,在用戶端會發現多了一塊磁盤,可以向本地磁盤一樣,分區、格式化、挂載使用。

<a href="http://guoting.blog.51cto.com/attachment/201409/20/8886857_1411228516Sy7M.png" target="_blank"></a>

完成挂載使用。

一般情況下,在服務端是使用配置檔案。使用指令式為了更好的了解Target端的工作模式。

<code># 配置檔案/etc/tgt/targets.conf </code>

<code>&lt;target iqn.2014-09.com.magedu:test2&gt;</code>

<code>   </code><code>backing-store </code><code>/dev/sda5</code>

<code>  </code><code>initiator-address 172.16.0.0</code><code>/16</code>

<code>&lt;</code><code>/target</code><code>&gt;</code>

如果用戶端不想使用的話,可以登出

<code>iscsiadm -m node -T iqn.2014-09.com.magedu:test2 -p 172.16.10.16  -u</code>

<code>iscsiadm -m node -T iqn.2014-09.com.magedu:test2 -p 172.16.10.16  -o delete</code>

<code># 必要的時候,使用</code>

<code>rm</code> <code>-rf -rf </code><code>/var/lib/iscsi/send_targets/</code><code>*</code>

<code>建立服務端誰所需要的帳号,并實作單方向的認證:</code>

<code>1、在target端建立帳号christina,并為其授予通路某tid的權限:</code>

<code># tgtadm --lld iscsi --op new --mode account --user mageedu --password 123456</code>

<code>接下來還要将使用者與某target進行綁定:</code>

<code># tgtadm --lld iscsi --op bind --mode account --tid 1 --user mageedu</code>

<code># tgtadm --lld iscsi --op show --mode account</code>

<code>2、編輯initiator端主配置檔案,配置用戶端登入target時使用此帳号和密碼:</code>

<code># vim /etc/iscsi/iscsid.conf</code>

<code>取消如下項的注釋:</code>

<code># node.session.auth.authmethod = CHAP</code>

<code># node.session.auth.username = username</code>

<code># node.session.auth.password = password</code>

<code>而後,将後兩項的使用者名密碼設定為target端設定的使用者名和密碼:</code>

<code>node.session.auth.username = mageedu</code>

<code>node.session.auth.password = 123456</code>

<code>哪果此前尚未登入過此target,接下來直接發現并登入即可。否則,則需要按照下面的第三步實</code>

<code>  </code><code>現認證的啟用。</code>

<code>3、如果initiator端已經登入過此target,此時還需要先登出登入後重新開機iscsid服務,并在删除此</code>

<code>   </code><code>前生成的database後重新發現target,并重新登入,過程如下:</code>

<code># iscsiadm -m session -r sid -u</code>

<code># iscsiadm -m node -T iqn.2010-8.com.example.ts:disk1 -p 172.16.10.16:3260 -u</code>

<code># iscsiadm -m node -T iqn.2010-8.com.example.ts:disk1 -p 172.16.10.16:3260 -o delete</code>

<code># rm -rf -rf /var/lib/iscsi/send_targets/172.16.10.16:3260</code>

<code># service iscsid restart</code>

<code># iscsiadm -m discovery -t sendtargets -p 192.168.0.11</code>

<code># iscsiadm -m node -T iqn.2010-8.com.example.ts:disk1 -p 192.168.0.11:3260 -l</code>

<code>說明:其中的target名字和target主機位址可能需要按照您的實際情況修改。</code>

配置完成。

本文轉自 羊木狼 51CTO部落格,原文連結:http://blog.51cto.com/guoting/1556487,如需轉載請自行聯系原作者