iscsi是Internet SCSI的缩写,是一种存储通信协议。它将SCSI协议封装在传统的TCP/IP协议中。可以实现一台主机通过IP网络远程访问另一台主机所提供的存储设备,就像访问本地块设备一样。

除了nfs外,OmniOS还提供了iscsi和fc两种SAN,而且都是免费的,这也是它吸引广大用户的原因之一。从iscsi稳定性这个角度来说,FreeNAS9还是比不上OmniOS,linux就更不用说了。所以目前在iscsi target的选择上,OmniOS是当之无愧的首选。

当然,FreeNAS9也有它的过人之处,它提供了一个叫VAAI的插件。系统管理员可以在VMware vShpere/Client图形界面中轻易地创建和配置iscsi target。这一切都是通过VAAI来实现的,系统管理员在下达指令的时候,VMware vSphere通过VAAI与FreeNAS实现联动,由FreeNAS自动在后台完成iscsi target的创建和配置工作,非常方便。OmniOS/napp-it还没有这个功能。

未来鹿死谁手就很难说,因为FreeBSD10重写了iscsi target,并将其作为内核模块发布,稳定性方面应该有提升。FreeNAS10也即将发布,再加上VAAI插件的加持,FreeNAS10在iscsi target存储方面更具吸引力。

术语

COMSTAR

COmmon Multiprotocol SCSI TARget的缩写。是solaris中的一个软件框架,它可以将solaris*转换成一个SCSI target设备。initiator可通过存储网络访问SCSI target设备。支持的存储协议为 iSCSI、FC、iSER 和 SRP,本文仅涉及iSCSI。

iscsi target

iscsi target设备,可以看作是具备网络通信功能的硬盘驱动器;

iscsi initator

iscsi 启动器,向iscsi target设备发起scsi请求,可以看作是客户端。

iqn

iqn是iscsi网络中的设备的唯一标识符。当初始化iscsi target或initiator时,系统将自动为它们分配一个唯一是iqn。

LU

Logical Unit的缩写,逻辑单元,是iscsi存储系统中实际被读写的实体。每个LU都有一个唯一的Logical Unit Number(LUN)。

host group

指的是被允许访问相同LUs的一组initiators的名称。

target group

指的是将同一组LUs导出到同一组host group的一组target的名称。

view

view是粘合剂,负责将LU、initiator/host group、target/target group关联起来。当来自host group的initiator登录到包含在target group中的target端口时,LU可被访问。

target portal group

确定一组iSCSI targets将侦听哪些接口的IP地址:TCP端口(又名network portal)列表。换句话说,它是network portals的集合,通过与view的配合可以灵活的控制target和initiator的关系。

网络拓扑

硬件信息

Table 1. 主机角色
角色 主机名 ip地址

iscsi target

storage1.jklab.com

192.168.55.120

192.168.56.120

192.168.57.120

iscsi initiator

pmx2.jklab.com

192.168.55.232

192.168.56.232

192.168.57.232

pmx3.jklab.com

192.168.55.233

192.168.56.233

192.168.57.233

网络拓扑

iscsi各组件关系图如下:

LU是initiator最终读写数据的地方,然而initiator连接的是target,那么LU和target是如何关联的呢?

首先创建一个LU,然后创建一个target和target group,接着将target添加到该target group中,随后创建一个view,将target group和LU关联起来,实现LU和target的结合。

在生产环境中建议每个LU、Target、Target Group、View是一一对应关系,便于管理,减少数据冲突风险。当然,如果是构建cluster的话请参考OmniOS中的iscsi-part2。

iscsi target的配置

启用stmf服务

  • 安装相关软件包

    illumos将常用的存储功能(包括iscsi、fc等)打包成一个软件包:storage-server,所以在配置iscsi target之前,需要确保该软件包已安装。

    $ pfexec pkg info -r storage-server
              Name: storage-server
           Summary:
             State: Not installed (Obsolete)
         Publisher: OmniOS
           Version: 0.1
            Branch: 0.133
    Packaging Date: June  3, 2016 03:22:19 AM
              Size: 1.75 kB
              FMRI: pkg://OmniOS/storage-server@0.1-0.133:20160603T032219Z
    
              Name: storage/storage-server
           Summary:
             State: Not installed (Obsolete)
         Publisher: OmniOS
           Version: 0.1
            Branch: 0.151018
    Packaging Date: June  3, 2016 03:22:19 AM
              Size: 1.75 kB
              FMRI: pkg://OmniOS/storage/storage-server@0.1-0.151018:20160603T032219Z

    OmniOS repo提供了两个同名的storage-server软件包,这里应安装第二个。

    $ pfexec pkg install storage/storage-server
  • 启动stmf服务

    $ pfexec svcadm enable svc:/system/stmf:default

创建Logical Unit(简称LU)

  • 创建一个zfs卷

    $ pfexec zfs create -V 50G tank2/zvol001
    $ pfexec zfs list tank2/iscsi-pmx
    NAME              USED  AVAIL  REFER  MOUNTPOINT
    tank2/iscsi-vol001  51.6G  2.62T  18.1G  - (1)
    1 zfs卷这种数据集跟zfs fs不一样,它没有mountpoint。
  • 在zfs卷上创建LU

    创建完zfs卷后,还需要在该卷的上创建LU。

    $ pfexec sbdadm create-lu /dev/zvol/rdsk/tank2/zvol001
    GUID                    DATA SIZE           SOURCE
    --------------------------------  -------------------  ----------------
    600144F039A72F5A000057E111300001  53687091200          /dev/zvol/rdsk/tank2/zvol001
  • 检查LU的状态

    $ pfexec stmfadm list-lu -v
    LU Name: 600144F039A72F5A000057E111300001
        Operational Status: Online
        Provider Name     : sbd
        Alias             : /dev/zvol/rdsk/tank2/zvol001
        View Entry Count  : 1
        Data File         : /dev/zvol/rdsk/tank2/zvol001
        Meta File         : not set
        Size              : 53687091200
        Block Size        : 512
        Management URL    : not set
        Vendor ID         : SUN
        Product ID        : COMSTAR
        Serial Num        : not set
        Write Protect     : Disabled
        Writeback Cache   : Disabled
        Access State      : Active

创建iscsi target

  • 启动iscsi target服务

    $ pfexec  svcadm enable svc:/network/iscsi/target:default
  • 检查iscsi target服务的状态

    $ pfexec stmfadm list-state
    Operational Status: online
    Config Status     : initialized
    ALUA Status       : disabled   (1)
    ALUA Node         : 0
    1 假如ALUA Status为enabled,则stmf允许一个LUN同时以fc target和iscsi target的方式呈现。以多种协议发布同一个LUN的行为很危险,这意味着多台initator可同时对该LUN进行写操作,导致数据损毁。需要确保它处于disabled状态。
  • 创建一个iscsi target

    $ pfexec itadm create-target
    Target iqn.2010-08.org.illumos:02:35d2f21f-2385-6274-b267-8d325db86491 successfully created (1)
    1 创建target时将自动生成一个iqn
  • 将iscsi target置于Offline状态

    后面还需要将iSCSI target添加到target group中。这个动作要求iSCSI target处于offline状态。

    $ pfexec stmfadm offline-target iqn.2010-08.org.illumos:02:35d2f21f-2385-6274-b267-8d325db86491
  • 显示iscsi target信息

    $ pfexec itadm list-target -v
    TARGET NAME                                                  STATE    SESSIONS
    iqn.2010-08.org.illumos:02:35d2f21f-2385-6274-b267-8d325db86491 offline   0
            alias:                  -
            auth:                   none (defaults)
            targetchapuser:         -
            targetchapsecret:       unset
            tpg-tags:               default

LU映射

创建完LU和target之后,还不能向initiator提供连接服务,还需要做LU映射(mapping),有两种映射方式:

简单映射(simple mapping)

将LU在所有network portals上暴露给全部的initiator,该方式只需要一条命令即可完成配置,非常方便,但也会带来安全隐患。

  • 查找LU的guid-number

    $ pfexec stmfadm list-lu
    LU Name: 600144F039A72F5A000057E111300001 (1)
    1 LU Name就是guid-number
  • 开启简单映射

    $ pfexec stmfadm add-view 600144F039A72F5A000057E111300001

    自此,所有的initiator就可以访问该target了。

选择性映射(selective mapping)

该方式允许用户设置特定的initiator访问LU,步骤如下:

  • 创建一个target group

    $ pfexec stmfadm create-tg tg-zvol001
  • 将target添加到target group中

    $ pfexec stmfadm add-tg-member -g tg-zvol001
    iqn.2010-08.org.illumos:02:35d2f21f-2385-6274-b267-8d325db86491 (1)
    1 在target group中,target以iqn的样式存在
  • 检查target group的配置

    $ pfexec stmfadm list-tg -v
    Target Group: tg-zvol001
    Member: iqn.2010-08.org.illumos:02:35d2f21f-2385-6274-b267-8d325db86491
  • 创建一个host group

    host group存在的意义是为了简化管理。譬如希望设置多台initator均能访问同一个LU的时候,就可以将这几台initator放在同一个host group中。在本文中,pmx1、pmx2、pmx3均能访问 t-zvol001 这个target,所以在这里定义了一个名为 hg-proxmox 的host group。

    $ pfexec stmfadm create-hg hg-proxmox
  • 将iscsi initator添加到host group

    在host group中,iscsi initator是以iqn的方式存在的。所以需要先找出iscsi initiator的iqn,才能添加至host group中。

    $ pfexec stmfadm add-hg-member -g pmx2 iqn.1986-03.com.sun:01:c0ca4ce904ff.4f45b957
  • 创建view

    view是配置的关键,它负责将target group、host group、LU捆绑在一起。如果一个链接不能满足前面两个条件,那么iscsi initiator将无法访问LU。另外,当你配置多台iscsi initiator可同时访问同一个LU的情况下,需要特别小心,否则容易引起数据损毁。

    $ pfexec stmfadm add-view -t tg-zvol001 -h hg-proxmox
    允许多台initiator访问同一个LU的时候,应考虑将多台initiator构建群集,由群集软件来控制在特定时间点由哪台initiator读写该LU
  • 新建一个target portal group

    $ pfexec itadm create-tpg igb0 192.168.56.120 (1)
    $ pfexec itadm create-tpg igb1 192.168.57.120 (2)
    1 默认的TCP端口为3260
    2 为了方便管理,建议tpg的名称与网卡名称一致
  • 配置iscsi target

    $ pfexec modify-target -t igb0, igb1 iqn.2010-08.org.illumos:02:35d2f21f-2385-6274-b267-8d325db86491 (1)
    1 此处iqn属于前面所创建的iscsi target
  • 检查target portal group

    $ pfexec itadm list-tpg -v
    TARGET PORTAL GROUP           PORTAL COUNT
    igb1                          1
        portals:    192.168.57.120:3260
    igb0                          1
        portals:    192.168.56.120:3260
  • 启用静态发现模式(static mode discovery)

    $ pfexec devfsadm -i iscsi

至此完成了iscsi target的全部配置,接下来是iscsi initiator的配置。

iscsi initiator的配置

iscsi initiator可以理解为客户端,主流OS都有各自的实现。

linux

本文中所用的linux OS为proxmox,基于debian的虚拟化平台。

  • 安装open-iscsi软件包

    $ sudo apt-get update && sudo apt-get install open-iscsi
  • 配置iscsid.conf

    $ sudo /etc/iscsi/iscsid.conf
    ------------8<-------------
    node.startup = automatic (1)
    node.session.timeo.replacement_timeout = 15 (2)
    ------------>8-------------
    1 默认情况下需手动登陆iscsi target,建议设置为automatic
    2 默认值为120,建议调小该数值。
  • 启用iscsid守护进程

    默认情况下,安装完open-iscsi将自动启动iscsid守护进程,前面修改了iscsid.conf,所以需要重启iscsid方能生效。

    $ sudo systemctl restart open-iscsi
  • 扫描iscsi target

    $ sudo iscsiadm --mode discovery --type sendtargets --portal 192.168.56.120 --discover
    192.168.56.120:3260,2 iqn.2010-08.org.illumos:02:35d2f21f-2385-6274-b267-8d325db86491
  • 登陆iscsi target

    $ sudo iscsiadm --mode node --targetname iqn.2010-08.org.illumos:02:35d2f21f-2385-6274-b267-8d325db86491 --portal 192.168.56.120:3260 --login
  • 检查结果

    如果成功登陆,iscsi session结果如下:

    $ sudo iscsiadm --mode session -P0
    tcp: [1] 192.168.56.120:3260,2 iqn.2010-08.org.illumos:02:35d2f21f-2385-6274-b267-8d325db86491 (non-flash)

    在initiator中最终看到的iscsi target是一个块设备:

    $ sudo lsblk --scsi
    NAME HCTL       TYPE VENDOR   MODEL             REV TRAN
    sda  0:0:0:0    disk ATA      GB0250EAFYK      HPG2 sata
    sdb  1:0:0:0    disk ATA      GB0250EAFJF      HPGB sata
    sdc  7:0:0:0    disk SUN      COMSTAR          1.0  iscsi (1)
    1 /dev/sdc为新增的iscsi target设备
  • 初始化硬盘

    target在initiator中是以块设备的形式存在,在使用之前需初始化,包括格式化和准备文件系统。

    $ sudo parted -a optimal /dev/sdc mklabel gpt
    $ sudo parted /dev/sdc
    (parted) mkpart primary '0%' '100%' (1)
    (parted> quit
    $ sudo mkfs.xfs /dev/sdc1
    $ sudo mkdir /mnt/iscsi-storage
    $ sudo mount -t xfs /dev/sdc1 /mnt/iscsi-storage
    1 (parted)表示交互模式
  • 修改fstab

    $ sudo vim /etc/fstab
    ---------8<-----------
    /dev/sdc1 /mnt/iscsi-storage       ext4           defaults        0         0
    --------->8-----------

    维护的时候,需要手工退出iscsi target,操作步骤如下:

    $ sudo umount /mnt/storage  (1)
    $ sudo iscsiadm --mode node --targetname --portal 192.168.56.120 --logout (2)
    $ sudo iscsiadm --mode node --targetname --portal 192.168.56.120 --op delete (3)
    1 umount文件系统
    2 注销iscsi target登陆
    3 删除target的会话
  • 检查session

    $ sudo iscsiadm --mode session --print 0

至此完成linux iscsi initiator的配置。

windows

未完,待续。

性能测试

可以参考proxmox的link:(wiki