iSCSI 原理和基础使用

   终于完成最后一篇了,一上午的时间就过去了.

 下文主要是对基本操作和我对iSCSI的理解,网上有很多iSCSI原理,在这里我就不写了,请自行学习.

 这篇文章仅对iSCSI的很多误解做一次梳理,你必须对所有实验都自行验证,才能慢慢理解iSCSI.所有

步骤我都加上了自己的理解,请做参考,实验仅是基础,更多高级功能,还需要自行研究,这篇文章会让你

对iSCSI有基础入门的理解,但前提是,你必须要对iSCSI的原理,已经历史有一定了解,在网上有很多这样的

文章,我这里仅是通过实验的方式,让初学者,像我这样的,希望了解iSCSI的人,能不在被毫无头绪的原理困扰,

而不知道究竟该如何使用它.做一个学习总结.

  另外送每个看客: 快就是慢,慢就是快!!!

    ---------马帮弟子:zcf 

 

 

 

名词:
  Endpoint: 目标名称与显式或屏蔽的TPG (IQN/WWN +标记)的组合。
  Initiator:控制SCSI会话开启和结束的控制设备,比较典型的就是 计算机。
  Target: SCSI会话的接收端,通常是磁盘驱动器、磁带驱动器或扫描仪等设备。
  IQN (iSCSI限定名):iSCSI的一种名称格式,惟一标识世界上的每个设备
    (例如iqn.5886.com.acme.tapedrive.sn-a12345678)。
  Network Portal:iSCSI端点与IP地址和TCP端口的组合。IANA定义的iSCSI协议的TCP端口号是3260
  TPG(Target Portal Group)IP地址和TCP端口号的列表,确定特定iSCSI目标将侦听哪些接口。
  WWN (World Wide Name):标识特定光纤通道或InfiniBand目标的唯一标识符。
            每个WWN是一个8字节的数字,来自IEEE OUI和供应商提供的信息。


targetcli的基本语法
  [<path>] <command> [<parameters>]


iSCSI fabric target模块:

    targetcli在处理target时,它是添加了一个中间层target portal group(TPG),TPG上层是target,
  下层是该target下具体的LUN和ACL. 其他fabric模块不存在这种中间层,它们由特定的fabric模块支持的格式
  WWN定义. 在创建iSCSI target时,targetcli会自动创建TPG,而其它则会屏蔽TPG.
  下图为不同fabric target的结构:
    

    

  bookmarks [add|del|go|show] [书签名]
    引用方式: ls @书签名
    cd @书签名

  get [GroupName] [ParameterName]
    列出给定组中的一个或多个配置参数的值。
    若指定了一个组,则列出该组中的所有可用参数。
    若无指定组或参数的情况下,列出所有可用的组。
    如:
      get global color_mode loglevel_console

 set [GroupName] [ParameterName=Value...]
    如:
    set global color_mode=true loglevel_console=info

  pwd 显示当前目录
  cd 进入目录
  ls 查看
  refresh: 刷新
  status: 显示当前节点的摘要信息.

  所有可用类型:
    @    bool: Boolean. Values: {TRUE|FALSE}
    @   bool-iSCSI: Boolean per RFC 3720. Values: {Yes|No}
    @   enum: List of alphanumeric values.
    @   integer: Digits. Values: [0–9]
    @    string: Alphanumeric characters
    @    color: {black|blue|cyan|default|green|magenta|red|white|yellow}
    @   loglevel: {critical|debug|error|info|warning}

 backstore(后端存储):
    BLOCK: 创建后端磁盘设备
      create <name> <dev> [readonly] [wwn]

    FILEIO: 仅用于测试的后端存储类型, 镜像文件
      create <name> <file_or_device> [size(kK|mM|gG|tT)] [<generate_wwn>] [<buffered>]
         file_or_device: 若为镜像文件,此时size可用来指定使用多少该镜像文件的空间.
            若块设备,则不能使用size设置使用多少磁盘空间.
         generate_wwn: 默认自动生成WWN号码.
         buffered: 是否在该设备上启用写缓存,默认是禁止写缓存的.即同步I/O.

     delete <StoreObjectName>    #如果有lun使用这个存储对象,它们也将被删除。

    PSCSI: 使用真实SCSI磁盘设备做为后端存储,iSCSI将直接使用SCSI驱动来操纵物理设备,
    而不会使用SCSI模拟器.
    create <name> <device>
        device:可以是SCSI设备的完整路径名,也可以是SCSI设备ID。如果设备是路径名,
          Datera组织建议使用/dev/disk/by- ID层次结构,以确保在重新引导或修改底层
          物理SCSI系统时保持一致的命名。
          不建议将设备指定为传统H:C:T:L格式的SCSI设备ID,因为SCSI ID可能随时间而变化


  创建LUN:
    create <storage_object> [<lun>] [<add_mapped_luns>]
      storage_object:指定要关联的后端存储设备对象的绝对路径.
      lun: 指定LUN编号,默认从0开始,自动分配.
      add_mapped_luns: true:自动为新的LUN关联可用的节点ACL.若不指定,
              默认将使用全局的auto_add_mapped_luns的值决定,
      auto_add_mapped_luns它默认为true

  创建节点ACL:
    create <mapped_lun> <tpg_lun_iscsi> [<write_protect>]
      <mapped_lun>是出现在启动程序中的映射LUN。
      <tpg_lun_iscsi>是对应的TPG LUN(仅iSCSI)。
      <write_protect>是一个可选的布尔参数,它指定发起者是否具有对映射LUN的写访问权。

  创建端口:
    create [<ip_address>] [<ip_port>]


  创建一个LUN的步骤:
    1.到相应目录下,创建一个Target。【不同目录所支持的命令不同】
      若是iSCSI,则targetcli会自动创建TPG.其它类型的Target则会屏蔽TPG.
    2.创建LUN并自动关联对应的后端存储对象上.
    3.创建一个iSCSI的网络访问端口,但端口必须与一个可用IP关联。
    4.定义ACL,控制可访问此LUN的客户端
    5.set LUN,可定义LUN映射,即将某个LUN映射为指定LUN号,让客户端看到映射后的LUN号.[可选]


  TPG下创建几个LUN最合适?
      一个iSCSI可支持多个Target,窄SCSI总线可支持最多8个Target,宽SCSI总线可支持最多16个Target,
    每个Target下可扩展N多个LUN,每个LUN可表示一块磁盘,因此一个Target接几个LUN?
    首先:一个Target监听的端口,允许所有合法用户与其建立会话,一旦建立,这个会话将持续保持,直到发起者,
    也就是客户端主动断开,该会话才会终止.
      而一个Target下有多个LUN,就可能有多个客户端与该target建立会话,而iSCSI对于一个Target仅关联
    到一个处理器核心上,也就意味着所有连接到该Target上的用户将共享一个CPU核心资源,那么单个TPG
    下LUN数越多导致每个客户端所能获得的CPU处理资源会更少,总体性能就会下降.客户端的访问体检就会不好.
    所以:资料中提示,若你的网络带宽是1GbE的,则每个TPG下最多不要超过4~8个LUN.
      若你的网络是10GbE的,则每个TPG下最多不要超过8~16个LUN.


  命令队列深度【并不是很理解】
    fabric命令队列的深度与存储对象的TCQ深度不同。目标强制fabric命令队列深度,
  以确定给定启动程序可以向给定目标端点上的所有lun发送多少未完成的I/Os。
  一旦fabric命令队列清除了I/O,它仍然由底层存储对象TCQ强制执行,
  TCQ为所有fabric模块导出的存储对象共享。
  对于较大的存储数组,Datera建议将命令队列深度增加到128。
  /iscsi/iqn.20...a0e4a11/tpgt1> set attribute default_cmdsn_depth = 128

  写缓存仿真
    对于不完全符合标准的iSCSI启动器(例如Red Hat RHEL5),建议在IBLOCK设备级别模拟写缓存。
  要启用写缓存模拟,请在IBLOCK设备上下文中输入:
    /backstores/iblock> set emulate_write_cache = 1


  iSCSI的架构图:
    http://www.linux-iscsi.org/Doc/LIO%20Admin%20Manual.pdf
    详情可参考此英文pdf
      
  实验环境【RHEL7】:
    iscsiServer.zcf.com---------------------------client.zcf.com
    192.168.10.21 192.168.10.22

    注:
      时间已经同步
      名称都写入/etc/hosts, 互相可以解析


    iscsiServer:
      1. 安装iscsi
        yum install targetcli
        注:
        从RHEL7后,使用lio替换了工作在用户空间的iSCSI target守护进程tgtd,
        lio(Linux-IOLIOTarget)是一个内核空间的iscsi target驱动级的守护进程.
        它是iSCSI target的开源实现.
        targetcli 是操作lio的客户端工具.

      2. 创建一个无认证的iSCSI磁盘
      2.1 进入targetcli的操作shell
        targetcli

      2.2 创建一个后端存储 块设备
        /> cd backstores/block
        /backstores/block> create name=blkstore dev=/dev/sdb1
          
          注:
          Backstore(后端存储):
          它提供iSCSI 底层实际的物理存储设备。
          它支持:
          FILEIO:它是用于测试目的的镜像文件,如使用dd创建的file.img .
          BLOCK : BLOCK是LIO可见的任何块设备,用于导出本机基于块的设备访问。
          LVM将其逻辑卷表示为块设备,因此是导出块设备的推荐方法。
          PSCSI: 对底层为物理SCSI设备提供支持,让上层LIO可直接操纵SCSI物理设备,而无需经过SCSI模拟器.
          RAMDISK: 它是为内存映射为SCSI磁盘提供驱动模拟支持的后端存储类型.
              它们的创建方式类似block, 可参考它的创建方式:
        /backstores/block> help create #可查看create的帮助.
        /backstores/block> #在所有地方,按两下tab键,可查看此上下文支持那些命令.

    2.2 创建一个iscsi target
      /backstores/block> cd /iscsi
      /iscsi> create iqn.2019-04.com.zcf:rnode21
        
      注:
        iqn: 是iSCSI的完全合格名称.
        格式:
          iqn.yyyy-mm.<Reversed Domain Name>[:identifier]
          如:
          #2015年1月zcf.com,二楼,1号机房,1号机架,5号存储
          iqn.2015-01.com.zcf:F2.R1.Farm1.5
            
          注:
          当执行create IQN ,会自动创建iSCSI Target的基本结构,这些都是可手工创建的
          有变量可关闭自动创建, 具体可在 /iscsi> 这里按两下tab键查看.
          但不建议关闭自动创建.
        另注:
          此处要特别注意: 这里创建target时,它首先创建了一个tpg(Target portal Group)
          TPG实际是为了方便管理target下众多LUN,而添加的一个虚拟层.
            
        如图中所表示的, 它就是为了方便管理而设置的.

   2.3 创建一个LUN
      /iscsi/iqn.20...m.zcf:rnode21> tpg1/luns
      /iscsi/iqn.20...e21/tpg1/luns> create storage_object=/backstores/block/blkstore

        
        注:
        在命令后按tab键,可查看该命令支持那些可用参数.
        直接写路径 和 使用 cd 路径 功能一样,都可进入该目录(准确说: 命令空间的上下文).

  2.4 创建一个ACL
    /iscsi/iqn.20...e21/tpg1/luns> cd ../acls
    /iscsi/iqn.20...e21/tpg1/acls> create wwn=iqn.2019-04.com.zcf.blk:disktop1

    
    创建ACL此处的目的不是认证,而是让客户端可登录iSCSI后,找到确切要访问的后端
    存储设备.
      注意: 这里自动创建LUN与ACL关联的变量是true, 因此,当执行create后,自动将所有
        已经创建出来的LUN都关联到该ACL下. 若需要关闭, 可使用
    /iscsi/iqn.20...:rnode21/tpg1> set global auto_add_mapped_luns=true
    但关闭后, 你需要手动将LUN与ACL关联,并且LUN也需要手动关联.
    另注:
      创建一个LUN,实际是将后端存储与Target下的一个lun关联, 并且在创建一个让
      客户端查看的lun编号【在上文提供的pdf中解释, 但我不是很懂】
      我的理解如下:
        以上创建target, lun, acl 的关系如下:
      将它们以实际物理设备的形象说明比较容易理解
      iSCSI驱动卡==[target0]===[target1]==.....==[targetN]====【这是Target总线,即上面创建的target】
              |       |        |
              |___[lun0]
              |___[lun1] - - - - - [ACL: 客户端来访问告诉iSCSI我访问lun1]
              |.....
      注意: 这里假设创建了一个ACL,该ACL仅关联了lun1.

  2.5 修改iSCSI监听的端口
    /iscsi/iqn.20...:rnode21/tpg1> cd portals
    /iscsi/iqn.20.../tpg1/portals> delete 0.0.0.0 3260
    /iscsi/iqn.20.../tpg1/portals> create 192.168.10.20 3260
      
      注:
        一个target总线上可以有多个target, 不同target,都可提供一组LUN,所以
      他们可监听不同的IP和端口,来对外提供iSCSI服务.


客户端配置:
  1. 安装iSCSI客户端访问工具
    yum install iscsi-initiator-utils

  2. 修改配置文件
    cd /etc/iscsi/
    vim initiatorname.iscsi
      InitiatorName=iqn.2019-04.com.zcf.blk:disktop1
      注:
        这里的WWN, 就是服务器端LUN ACL的wwn名称.
        你希望此客户端访问那个LUN,就告诉它那个wwn.

  3. 重启iscsi服务,重读配置文件
    systemctl restart iscsi iscsid

  4. 查看是否可登录iSCSI, 并测试是否可对iscsi磁盘做分区
    #先发现一个iSCSI
    iscsiadm -m discovery -d 2 -t sendtargets -p 192.168.10.21

    #尝试登陆发现的iSCSI target
    iscsiadm -m node -T iqn.2019-04.com.zczf:rnode21 -p 192.168.10.21 -l

    #查看 并测试分区
    fdisk -l
    parted /dev/sdb mktable gpt #若成功,则说明iSCSI磁盘可分区,可挂载.

    #退出登录
    iscsiadm -m node -T iqn.2019-04.com.zcf:rnode21 -p 192.168.10.21 -u

    #删除登录信息,避免下次系统重启后,自动连接iSCSI target
    iscsiadm -m node -T iqn.2019-04.com.zcf:rnode21 -p 192.168.10.21 -o delete

  5. 在登录iSCSI target 成功后, 需要关注一下这些目录
    /var/lib/iscsi/nodes/
    /var/lib/iscsi/send_targes/

    /sys/class/iscsi_*
    /sys/class/iscsi_session/
      注:
      当iscsi 服务器端故障,导致已建立的iscsi会话没有正常断开,这里会看到会话信息,
      即便是root也不能删除, 此时似乎只能重启.




iSCSI的安全认证

  这三种CHAP的关系和区别:
    discovery CHAP: 全局认证.只有认证通过才能看到设备.
    TPG CHAP: 一个target下的全局只读认证,若要使用TPG认证的用户名和密码,就不能配置LUN级别的ACL,
          因为LUN级别的ACL优先级更高,它会覆盖TPG级别的用户名和密码.所以若要使用TPG级别的用户名
          密码就不能配置LUN级别的ACL,但这样认证是正常了,但用户挂载后,就只能有读权限,而没有写权限.
    LUN ACL CHAP: 这是最精确的权限控制,配置后,用户必须使用提供该ACL的WWN,以便使用该ACL的用户名和密码
          做CHAP认证,否则iSCSI将无法知道用户到底提供的是那个ACL的用户名和密码,导致用户即便发现了
          并且成功登录的iSCSI,也无法获取该LUN设备的写权限.

实验:

  测试1:
    discovery CHAP + TPG CHAP认证配置:

    discovery CHAP:

    1. 启用发现CHAP认证
      /> cd iscsi/
      /iscsi> #下面都在此目录下操作
      set discovery_auth enable=true

    2. 启用单向CHAP认证, 客户端必须提供这里设置的用户名和密码,才能发现iSCSI输出的target.
      set discovery_auth userid=discoveryUser1 password=discoveryPasswd1

    3. 启用双向CHAP认证,即客户端要提供上面设置的服务器端的用户名和密码,
      同时服务器端必须提供客户端所设置的用户名和密码,才能认证通过.
      set discovery_auth mutual_userid=ClientDisUser1 mutual_password=ClientDisPasswd1

    4. 查询配置:
      get discovery_auth


  TPG CHAP
    1. 启用CHAP认证
      /> cd iscsi/iqn.2019-04.com.zczf:rnode21/tpg1/
      /iscsi/iqn.20...:rnode21/tpg1> #在此目录下做以下操作:
      set attribute authentication=1 generate_node_acls=1

    2. 配置单向CHAP
      set auth userid=tpguser1 password=tgppasswd1

    3. 配置双向CHAP
      #在先有第二步,才能配置此步.
      set auth mutual_userid=ClientTPGuser1 mutual_password=ClientTPGPasswd1


  只读客户端CHAP认证配置:

    1. 设置客户端使用指定WWN下面的LUN资源:
      vim /etc/iscsi/initiatorname.iscsi
        InitiatorName=WWN #此WWN可任意指定,或使用默认值,格式: iSCSI的完全合格名
          iqn:iSCSI的合格名称
          iqn.yyyy-mm.<Reversed Domain Name>[:identifier]
        如:
          #2015年1月zcf.com,二楼,1号机房,1号机架,5号存储
            iqn.2015-01.com.zcf:F2.R1.Farm1.5

    2. 配置客户端使用CHAP认证的用户名和密码
      vim /etc/iscsi/iscsid.conf
        node.session.auth.authmethod = CHAP
        node.session.auth.username = tpguser1
        node.session.auth.password = tpgpasswd1
        #node.session.auth.username_in = ClientTPGuser1
        #node.session.auth.password_in = ClientTPGPasswd1

        discovery.sendtargets.auth.authmethod = CHAP
        discovery.sendtargets.auth.username = discoveryUser1
        discovery.sendtargets.auth.password = discoveryPasswd1
        #discovery.sendtargets.auth.username_in = ClientDisUser1
        #discovery.sendtargets.auth.password_in = ClientDisPasswd1
          注:
          去掉#注释,就是双向认证.

    2.1 重启iSCSI客户端连接进程,以便重读配置文件.
      systemctl restart iscsi iscsid

  3. 客户端测试登录
    #尝试发现iSCSI服务端提供的target:
      iscsiadm -m discovery -d 2 -t sendtargets -p 192.168.10.21

    #尝试登录发现的target
      iscsiadm -m node -T iqn.2019-04.com.zcf:rnode21 -p 192.168.10.21 --login

    #使用fdisk查看iSCSI磁盘
      fdisk -l
      fdisk /dev/sdb   #测试是否可分区, 这种情况下是不能分区的, 因为此时没有写权限.

    #尝试退出该target ; 前提是,没有在使用该iSCSI磁盘
      iscsiadm -m node -T iqn.2019-04.com.zczf:rnode21 -p 192.168.10.21 -u

    #删除target信息,避免重启后,自动连接该target设备
      iscsiadm -m node -T iqn.2019-04.com.zczf:rnode21 -p 192.168.10.21 -o delete




discovery CHAP + LUN ACL CHAP认证:

  discovery CHAP 使用上面的配置.

  LUN ACL CHAP:
    1. 启用CHAP认证
      TPG CHAP认证中的第一步,是配置LUN ACL CHAP的前提.

    2. 配置单向CHAP
      /> cd iscsi/iqn.2019-04.com.zczf:rnode21/tpg1/acls/
      /iscsi/iqn.20...e21/tpg1/acls> create wwn=iqn.2019-09.com.zcf:disktop1
      /iscsi/iqn.20...e21/tpg1/acls> cd iqn.2019-09.com.zcf:disktop1/
      /iscsi/iqn.20....zcf:disktop1> #下面都要在此目录中操作

      set auth userid=lunuser1 password=lunpasswd1

    3. 配置双向CHAP
      #在先有第二步,才能配置此步.
        set auth mutual_userid=ClientLUNuser1 mutual_password=ClientLUNPasswd1

  读写客户端CHAP认证配置:

    1. 设置客户端使用指定WWN下面的LUN资源:
      vim /etc/iscsi/initiatorname.iscsi
        InitiatorName=WWN      #此WWN要使用LUN ACL中ACL的WWN.这样iSCSI才知道
                      客户端提供的用户名密码是那个LUN ACL提供的,从而对该
                      客户端做认证,来确定它是否为合法客户端.

    2. 配置客户端使用CHAP认证的用户名和密码
      vim /etc/iscsi/iscsid.conf
        node.session.auth.authmethod = CHAP
        node.session.auth.username = lunuser1
        node.session.auth.password = lunpasswd1
        #node.session.auth.username_in = ClientLUNuser1
        #node.session.auth.password_in = ClientLUNPasswd1

        discovery.sendtargets.auth.authmethod = CHAP
        discovery.sendtargets.auth.username = discoveryUser1
        discovery.sendtargets.auth.password = discoveryPasswd1
        #discovery.sendtargets.auth.username_in = ClientDisUser1
        #discovery.sendtargets.auth.password_in = ClientDisPasswd1


    2.1 重启iSCSI客户端连接进程,以便重读配置文件.
      systemctl restart iscsi iscsid

  3. 客户端测试登录
    #尝试发现iSCSI服务端提供的target:
      iscsiadm -m discovery -d 2 -t sendtargets -p 192.168.10.21

    #尝试登录发现的target
      iscsiadm -m node -T iqn.2019-04.com.zcf:rnode21 -p 192.168.10.21 --login

    #使用fdisk查看iSCSI磁盘
      fdisk -l
      fdisk /dev/sdb      #测试是否可分区, 此时iSCSI磁盘是可以分区的,因为认证成功后,
                已经确定用户为合法用户,所以给予了该用户写权限.

    #尝试退出该target ; 前提是,没有在使用该iSCSI磁盘
      iscsiadm -m node -T iqn.2019-04.com.zczf:rnode21 -p 192.168.10.21 -u

    #删除target信息,避免重启后,自动连接该target设备
      iscsiadm -m node -T iqn.2019-04.com.zczf:rnode21 -p 192.168.10.21 -o delete

 

posted @ 2019-04-13 12:18  张朝锋  阅读(5618)  评论(0编辑  收藏  举报