Linux-IO Target是什么
Linux上对于scsitarget的是一个实现,主要包括了target_core.ko(从2.6.38的内核版本开始)和其他几个可选的驱动模块。
Lio的目的
提供scsi的target服务,scsi的initiator跟target之间可以在不同的物理主机之间,通过多种不同的协议ip,FC,FCoE,Infiniband;scsi的initiator也可以跟Lio target一起位于同一个物理主机;
Lio的架构
虚线以下都是是现在linux kernel里面的模块。虚线以上是用户态的管理工具,其中targetcli是一个python开发的命令行工具,用来管理和配置Lio target,由Datera,Inc..开发。通过该工具可以配置target的后台存储设备,并根据不同的协议导出为不同形式的scsi target。
FabricModules
² Lio的前端,负责initiator跟target的通信,接收initiator发来的scsi命令给GenericTraget Engine,并把Generic Traget Engine执行scsi命令的结果返回给initiator
GenericTraget Engine
² scsi命令协议栈/处理器
StorageManagement Engine
² Target的存储引擎,屏蔽不同后台存储设备差异,提供统一的存储访问接口给Generic Traget Engine使用
StorageModules
² 后台存储设备的接口,支持多种形式的接口,包括VFS的文件,/dev下面的逻辑block设备,以及裸的块设备
Lio支持多种形式的FabricModules,即可以通过多种形式提供initiator服务,主要包括两种情况:
1) Initiator跟target位于不同的物理主机,中间需要通过网络相连:
FibreChannel:
scsiover FC,
需要QLogicdeHBA驱动 qla2xxx.ko
FCoE:
FibreChannel over ethernet
普通以太网卡驱动+tcm_fc.ko
iSCSI:
scsiover IP
普通以太网卡驱动+iscsi.ko
iSEP:
iscsiover infiniband network
MellanoxHCA卡驱动 ib_sert.ko
SRP:
scsiover infiniband
MellanoxHCA驱动srpt.ko
iscsi方式组网图
2) Initiator跟target位于同一个物理主机
tcm_loop:
模拟scsi设备给本地主机的app程序或者VM使用,相当于把本地主机的跨设备经过Lio映射之后再给本地主机使用,
优点是,可以把本地文件直接映射给虚拟机提供块设备,不需要经过iscsi协议转化消耗,不过效率不可能很高
lookback.ko,
vHost
通过QEMU virtio接口提供块设备服务给QEMU/KVMguest主机,效率比较高,不过目前支持linux guest,对于windows的guest主机开发正在进行中,计划给windows开发一个虚拟的LSI MegaRAID SAS driver.
tcm_vhost.ko
vHost架构图
总结:
Lio目前也在先虚拟化和openstack方向演进,希望通过Lio把本地的块设备提供给VM使用。
利用Lio的vHost接口,可以将支持fuse的分布式文件系统作为虚拟机的块设备
如果分布式文件系统client做到了kernel里面,可以很方便的利用Lio提供的qemu/kvm驱动提供给vm使用,而且效率应该相当高
个人感觉利用Lio的iscsi方式构建分布式块存储不是一个发展方向,而Lio+iscsi方式替换原有的磁盘阵列也不见得是个好方向,因为这方面zfs做的更好,zfs自带iscsi模块
参考资料:
http://linux-iscsi.org/wiki/Target
http://linux-iscsi.org/wiki/VHost