Linux中三種SCSI target的介紹之LIO


 

版權聲明:本文為博主原創文章,遵循 CC 4.0 BY-SA 版權協議,轉載請附上原文出處鏈接和本聲明。
本文鏈接:https://blog.csdn.net/scaleqiao/article/details/46744891

1. 簡介
Linux-IO Target在Linux內核中(linux 2.6.38后),用軟件實現各種SCSI Target,其支持的SAN技術中所有流行的存儲協議包括Fibre Channel(Qlogic,linux3.5)、FCoE(linux3.0)、iSCSI(linux 3.1)、iSER (Mellanox InfiniBand,linux3.10), SRP (Mellanox InfiniBand,linux3.3), USB等,同時還能為本機生成模擬的SCSI設備,以及為虛擬機提供基於virtio的SCSI設備。Linux-IO Target使用戶能夠使用相對廉價的Linux系統實現SCSI、SAN的各種功能,而不用購買昂貴的專業設備。

2. 架構

 

 

 上圖顯示了Linux-IO Target的各個組件。LIO模擬了通用的SCSI設備,並且實現了SPC-3和4。接着,通過各種各樣的backstore對象,來導入真正的后端存儲,最后連接上各種前端Fabric模塊,來導出模擬的SCSI設備。無論是Fibre Channel、FCoE、iSCSI還是vhost(即virtio),都只是一種Fabric技術,我們可以將其理解成傳輸協議,而在這些傳輸協議中傳輸的SCSI命令則總是由核心的SCSI設備處理的。要支持新的Fabric技術,並不需要修改核心的SCSI設備和后端存儲模塊,只需要按照該Fabric技術的規范實現對SCSI命令的傳輸就可以了。iSCSI技術就是把SCSI命令放在TCP/IP中傳輸,vhost技術就是把SCSI命令放在virtio隊列中傳輸。

Generic Target Engine:實現了SAM中規定的一個SCSI target的功能,主要是SCSI協議的解析。它通過Fabric模塊和initiator通信,通過backstore和具體的存儲設備通信。Fabric modules:實現了LIO的前端,即SCSI協議傳輸層的模塊。可以通過Fabric Hardware Abstraction Layer(F-HAL)來為LIO增加新的fabric模塊。
Backstores:實現了LIO的后端,即訪問磁盤數據的方式。可以通過Storage Hardware Abstraction Layer(S-HAL)在LIO中增加新的存儲硬件的支持。通常使用BLOCKIO和FILEIO。

3. 使用方法

Linux-IO Target則在內核態實現了對Target的模擬,配置管理則采用了更為“現代化”的基於sysfs的方式,提供了友好的用戶態管理工具。從內核的2.6.38版起,Linux內核都包含Linux-IO Target的相關模塊。在用戶態,各大發行版都打包了targetcli和rtslib,其中targetcli程序用於配置、管理,rtslib則提供Python編程接口。

1)targetcli
targetcli是Linux-IO Target的用戶態的管理配置工具。用戶可以使用yum或apt-get直接從各大發行版的官方倉庫安裝,對於較老的linux版本需要自己編譯源碼安裝。targetcli提供一個類似shell的界面,各種Target、TPG、LUN、backstore對象則被組織成目錄樹的形式,用戶可以用ls、cd命令來瀏覽目錄樹,用create、delete命令來創建和刪除各種對象。瀏覽配置,就是瀏覽目錄樹,創建刪除各種對象,就是在目錄樹的各級節點中創建新的節點。同時targetcli還提供了常見的shell命令輔助編輯功能,例如TAB智能補全、上下鍵切換命令歷史、Ctrl + R搜索命令歷史。凡是有不熟悉的命令,都可以用help命令查詢使用說明。

其實,對於我們來說,配置LIO主要就是使用targetcli,具體使用步驟如下:
  1.   1a)root權限運行targetcli
  2.   1b)瀏覽存儲對象, ls查看目錄樹信息,cd到執行目錄
  3.   1c)創建文件存儲對象
  4.   cd /backstores/fileio
  5.   create disk0 /tmp/disk0.img 10MB
  6.   cd /backstores/ramdisk
  7.   create rd0 10MB
  8.   1d)創建iSCSI目標
  9. cd /iscsi
  10.   create
  11.   cd iqn.2003-01.org.linux-iscsi.localhost.x8664:sn.6b448471ba5e/tpg1/
  12.   luns/ create /backstores/fileio/disk0
  13.   luns/ create /backstores/ramdisk/rd0
  14.   portals/ create 0.0.0.0
  15.   set attribute authentication=0 demo_mode_write_protect=0 generate_node_acls=1 cache_dynamic_acls=1
  16.   cd /
  17.   ls
  18.   saveconfig
  19.   1e)啟動iscsi target服務
  20.   [root@localhost ~]# service target start
  21.   [root@localhost ~]# service target status
  22.   1f)裝載iSCSI Target
  23.   [root@localhost ~]# iscsiadm -m discovery -t sendtargets -p 127.0.0.1
  24.   127.0.0.1:3260,1 iqn.2003-01.org.linux-iscsi.localhost.x8664:sn.6b448471ba5e
  25.   [root@localhost ~]# iscsiadm –mode node \
  26.   > –targetname iqn.2003-01.org.linux-iscsi.localhost.x8664:sn.6b448471ba5e \
  27.   > –portal 127.0.0.1 –login
  28.   [root@localhost dennis]# lsscsi
  29.   [2:0:0:0] disk ATA ST3160815AS A /dev/sda
  30.   [6:0:0:0] disk LIO-ORG disk0 4.0 /dev/sdb
  31.   [6:0:0:1] disk LIO-ORG rd0 4.0 /dev/sdc
  32.   1g)卸載並刪除iSCSI目標
  33.   iscsiadm –mode node –targetname iqn.2003-01.org.linux-iscsi.localhost.x8664:sn. 6b448471ba5e –portal 127.0.0.1 –logout
  34.   targetcli iscsi/ delete iqn.2003-01.org.linux-iscsi.localhost.x8664:sn.6b448471ba5e
除了targetcli,LIO還提供python的編程接口。

 

2)rtslib
rtslib是一個Python程序庫,讓用戶可以以編程的方式配置Linux-IO Target的各項功能。rtslib中的對象也被組織成樹狀結構,並且與我們在targetcli中熟悉的各種對象也很相似。熟悉了targetcli的操作之后,用rtslib編程就變得十分容易。首先,我們需要安裝python-rtslib的RPM包。還可以安裝python-rtslib-doc的RPM包,里面包含了接口的說明文檔。下面以iSCSI為例,展示如何用rtslib創建Target。下面的例子是使用rtslib創建iSCSI target。

  1.   import rtslib
  2.   def createTarget():
  3.   fio = rtslib.FileIOStorageObject(
  4.   'disk0', dev='/tmp/disk0.img', size=100 * 1024 * 1024)
  5.   iscsiMod = rtslib.FabricModule('iscsi')
  6.   tgt = rtslib.Target(iscsiMod, mode='create')
  7.   tpg = rtslib.TPG(tgt, tag=None, mode='create')
  8.   rtslib.LUN(tpg, lun=None, storage_object=fio)
  9.   tpg.set_attribute('generate_node_acls', '1')
  10.   tpg.set_attribute('cache_dynamic_acls', '1')
  11.   tpg.set_attribute('authentication', '0')
  12.   tpg.set_attribute('demo_mode_write_protect', '0')
  13.   tpg.enable = True
  14.   rtslib.NetworkPortal(tpg, '0.0.0.0', mode='create')
  15.   return tgt.wwn
  16.   print createTarget()


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM