Linux中三种SCSI target的介绍之SCST

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。

本文链接:https://blog.csdn.net/scaleqiao/article/details/46753209

1. 简介
Linux通用的SCSI 目标子系统(SCST)是一个为Linux SCSI目标子系统的另一种实现。它是由英国著名存储开发团队ID7研发,目前由SanDisk管理(收购了Fusion IO)。它的出现要早于LIO,功能也比LIO完善,目前的用户是许多提供存储解决方案的大公司如EMC,IBM,HP采用。它提供Linux内核之间和处理和SCSI目标驱动程序的统一的,一致的接口,同时提供Linux内核与存储后端句柄连接,连接真实或模拟的存储后端与目标驱动程序。SCST支持主流的SCSI数据传输方式,包括光纤通道,iSCSI,SAS,InfiniBand和并行(宽)的SCSI。

2. 架构

 

 

 

 虚线上方主要是用户态管理工具,scst core实现在内核中,中间蓝色为核心子系统(位于SCSI top layer),其代码框架设计合理,将target具体驱动封装成可注册的插件驱动,如我们经常会用到的就是iscsi-scst插件,通过这个驱动程序我们可以在以太网上做iscsi协议的访问,即iscsi over tcp/ip,后续会继续分析initiator端开源驱动open-iscsi,再详细介绍iscsi协议。

同时,除了必备的target插件驱动,scst内核核心系统也支持了几个存储设备驱动,从外部使用上就是我们经常在配置scsi设备导出时可选择的导出方式,比如blockio 或者 fileio导出,或者 pass through,这几种导出方式在scst 内核其实是由几个专用的存储驱动完成的,它们也实现为可注册插件的形式。

SCST core:实现了协议无关的SCSI处理功能。
Target drivers:实现了SCSI协议的传输层功能。
Storage drivers:实现了SCST的后端存储驱动

3. 安装、使用和配置
3.1 安装
1)下载源码,因为scst的代码使用svn托管在sourceforge上,所以需要安装svn软件
svn co https://scst.svn.sourceforge.net/svnroot/scst/trunk scst
2)准备kernel,因为scst没有加入到linux的内核中,所以为了达到很好的性能,需要在向内核中打入scst自己的patch并重新编译内核。

  1.  # cd /var/Jevon/linux-3.18.16

  2.  # patch -p1 < /root/scst/iscsi-scst/kernel/patches/put_page_callback-3.18.patch

  3.  # make clean

  4.  # make menuconfig

  5.  Select Networking support -> Networking options -> TCP/IP networking

  6.  Select Networking support -> Networking options -> TCP/IP zero-copy transfer completion notification

  7.  Select Device Drivers -> SCSI device support -> SCSI disk support

  8.   Select Enable the block layer -> IO Schedulers -> CFQ I/O Scheduler

  9.  Set Enable the Block layer -> IO Schedulers -> Default I/O Scheduler to 'CFQ'

  10.   Set Processor type and features -> Preemption Model to 'No Forced Preemption (Server)' 

  11. # make bzImage

  12.  # make modules

  13.  # make modules_install

  14.  # make install

  15.  # vim /etc/grub/grub.conf //设置启动新内核

  16.  # reboot

3)编译安装

  1.  # make 2perf

  2.  # make scst scst_install -j24

  3.  # make iscsi iscsi_install -j24

  4. # make scstadm scstadm_install -j24

4)启动相应的服务,假设这里使用iSCSI协议

  1.  <pre name="code" class="plain"># modprobe scst

  2.  # modprobe scst_disk

  3.  # modprobe scst_vdisk

  4.  # modprobe iscsi-scst

  5.  # lsmod |grep scst

  1.  isert_scst             51996  4

  2.  iscsi_scst             92286  5 isert_scst

  3.  scst_vdisk             93522  0

  4.  scst                  869809  2 iscsi_scst,scst_vdisk

  5.  rdma_cm                44234  2 isert_scst,ib_iser

  6.  ib_core                88413  7 isert_scst,ib_iser,rdma_cm,ib_cm,iw_cm,ib_sa,ib_mad

  7.  libcrc32c              12644  4 iscsi_scst,scst_vdisk,dm_persistent_data,xfs

 
 

3.2 配置1)通过scstadm配置iscsi target

  1.  1a) 创建block设备

  2.  scstadmin -open_dev disk03 -handler vdisk_blockio -attributes filename=/dev/sdc1

  3.  1b) 创建target

  4.  scstadmin -add_target iqn.2011-08.nl.feka:storage.vdisk1 -driver iscsi

  5.  1c) 创建lun

  6.  scstadmin -add_lun 0 -driver iscsi -target iqn.2011-08.nl.feka:storage.vdisk1 -device disk03

  7.  1d) 启动target

  8.  scstadmin -enable_target iqn.2011-08.nl.feka:storage.vdisk1 -driver iscsi

  9.  1e) 使用iscsi driver

  10.  scstadmin -set_drv_attr iscsi -attributes enabled=1

  11.  1f) 写入配置文件

  12.  scstadmin -write_config /etc/scst.conf

 

2)通过配置文件配置

# cat /etc/scst.conf

 

  1.  HANDLER vdisk_blockio {

  2.  DEVICE disk01 {

  3.  filename /dev/iscsilun/iscsilun0

  4.  }

  5.  DEVICE disk02 {

  6.  filename /dev/iscsilun/iscsilun1

  7.  }

  8.  }

  9.  TARGET_DRIVER iscsi {

  10.  enabled 1

  11.  TARGET iqn.2007-05.com.example:storage.disk1.scst.jevon {

  12.  LUN 0 disk01

  13.  LUN 1 disk02

  14.  enabled 1

  15.  }

  16.  }

  17.  # /etc/init.d/scst start

  18.  # iscsi-scstd

 

注意如果改变了scst的配置一定要重启scst。
3.3 使用
按照以上的配置,你可以得到一个iscsi target。通过iscsiadm就可以访问这个target,具体访问方式在之前的文章已经介绍过,这里就不再赘述了。  

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
m7_scst_VTABLE是一个结构体,用于存储SCST的虚函数表。在SCST,每个驱动程序都有一个虚函数表,其包含了驱动程序的所有虚函数的地址。这些虚函数可以被其他函数调用,以执行特定的操作。m7_scst_VTABLE结构体包含了以下成员变量: - m7_scst_uint32_t magic:一个魔术数字,用于标识虚函数表的有效性。 - m7_scst_uint32_t version:虚函数表的版本号。 - m7_scst_uint32_t size:虚函数表的大小,以字节为单位。 - m7_scst_uint32_t reserved:保留字段,未使用。 - m7_scst_scsi_command_status_t (*execute_scsi_command)(m7_scst_scsi_command_t *command):执行SCSI命令的虚函数。 - m7_scst_uint32_t (*get_device_type)(void):获取设备类型的虚函数。 - m7_scst_uint32_t (*get_device_id)(void):获取设备ID的虚函数。 - m7_scst_uint32_t (*get_lun)(void):获取逻辑单元号的虚函数。 - m7_scst_uint32_t (*get_max_lun)(void):获取最大逻辑单元号的虚函数。 - m7_scst_uint32_t (*get_block_size)(void):获取块大小的虚函数。 - m7_scst_uint32_t (*get_device_size)(void):获取设备大小的虚函数。 - m7_scst_uint32_t (*get_device_status)(void):获取设备状态的虚函数。 - m7_scst_uint32_t (*get_device_info)(m7_scst_device_info_t *info):获取设备信息的虚函数。 这些虚函数可以被其他函数调用,以执行特定的操作。例如,execute_scsi_command函数用于执行SCSI命令,get_device_type函数用于获取设备类型,get_device_id函数用于获取设备ID等等。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值