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命令查詢使用說明。
-
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服務
-
[
-
[
-
1f)裝載iSCSI Target
-
[
-
127.0.0.1:3260,1 iqn.2003-01.org.linux-iscsi.localhost.x8664:sn.6b448471ba5e
-
[
-
> –targetname iqn.2003-01.org.linux-iscsi.localhost.x8664:sn.6b448471ba5e \
-
> –portal 127.0.0.1 –login
-
[
-
[
-
[
-
[
-
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
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()