【轉】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命令查詢使用說明。
[plain] view plain copy print ?
- 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
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。
- import rtslib
- def createTarget():
- fio = rtslib.FileIOStorageObject(
- 'disk0', dev='/tmp/disk0.img', size=100 * 1024 * 1024)
- iscsiMod = rtslib.FabricModule('iscsi')
- tgt = rtslib.Target(iscsiMod, mode='create')
- tpg = rtslib.TPG(tgt, tag=None, mode='create')
- rtslib.LUN(tpg, lun=None, storage_object=fio)
- tpg.set_attribute('generate_node_acls', '1')
- tpg.set_attribute('cache_dynamic_acls', '1')
- tpg.set_attribute('authentication', '0')
- tpg.set_attribute('demo_mode_write_protect', '0')
- tpg.enable = True
- rtslib.NetworkPortal(tpg, '0.0.0.0', mode='create')
- return tgt.wwn
- print createTarget()