zoukankan      html  css  js  c++  java
  • 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

  • 相关阅读:
    iOS开发UI篇—IOS开发中Xcode的一些使用技巧
    iOS开发UI篇—推荐两个好用的Xcode插件(提供下载链接)
    iOS开发UI篇—UITableviewcell的性能问题
    iOS开发UI篇—UITableview控件基本使用
    iOS开发UI篇—UITableview控件简单介绍
    iOS开发UI篇—UIScrollView控件实现图片缩放功能
    iOS开发UI篇—实现UITableview控件数据刷新
    iOS开发UI篇—使用嵌套模型完成的一个简单汽车图标展示程序
    C# 高性能 TCP 服务的多种实现方式
    高性能数据传输系统的框架设计
  • 原文地址:https://www.cnblogs.com/wn1m/p/10700591.html
Copyright © 2011-2022 走看看