1. 程式人生 > >【轉】Linux中三種SCSI target的介紹之LIO

【轉】Linux中三種SCSI target的介紹之LIO

【轉自】http://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,具體使用步驟如下:
[plain] view plain copy print ?
  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. [[email protected] ~]# service target start  
  21. [[email protected] ~]# service target status  
  22. 1f)裝載iSCSI Target  
  23. [[email protected] ~]# 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. [[email protected] ~]# iscsiadm –mode node \  
  26. > –targetname iqn.2003-01.org.linux-iscsi.localhost.x8664:sn.6b448471ba5e \  
  27. > –portal 127.0.0.1 –login  
  28. [[email protected] 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  
1a)root許可權執行targetcli
1b)瀏覽儲存物件, ls檢視目錄樹資訊,cd到執行目錄
1c)建立檔案儲存物件
cd /backstores/fileio
create disk0 /tmp/disk0.img 10MB
cd /backstores/ramdisk
create rd0 10MB
1d)建立iSCSI目標
cd /iscsi
create
cd iqn.2003-01.org.linux-iscsi.localhost.x8664:sn.6b448471ba5e/tpg1/
luns/ create /backstores/fileio/disk0
luns/ create /backstores/ramdisk/rd0
portals/ create 0.0.0.0
set attribute authentication=0 demo_mode_write_protect=0 generate_node_acls=1 cache_dynamic_acls=1
cd /
ls
saveconfig
1e)啟動iscsi target服務
[[email protected] ~]# service target start
[[email protected] ~]# service target status
1f)裝載iSCSI Target
[[email protected] ~]# iscsiadm -m discovery -t sendtargets -p 127.0.0.1
127.0.0.1:3260,1 iqn.2003-01.org.linux-iscsi.localhost.x8664:sn.6b448471ba5e
[[email protected] ~]# iscsiadm –mode node \
> –targetname iqn.2003-01.org.linux-iscsi.localhost.x8664:sn.6b448471ba5e \
> –portal 127.0.0.1 –login
[[email protected] dennis]# lsscsi
[2:0:0:0] disk ATA ST3160815AS A /dev/sda
[6:0:0:0] disk LIO-ORG disk0 4.0 /dev/sdb
[6:0:0:1] disk LIO-ORG rd0 4.0 /dev/sdc
1g)解除安裝並刪除iSCSI目標
iscsiadm –mode node –targetname iqn.2003-01.org.linux-iscsi.localhost.x8664:sn.	6b448471ba5e –portal 127.0.0.1 –logout
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。

[plain] view plain copy print ?
  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()