Red Hat Training

A Red Hat training course is available for RHEL 8

第 7 章 iSCSI 入门

Red Hat Enterprise Linux 8 使用 targetcli shell 作为命令行界面执行以下操作:

  • 添加、删除、查看和监控 iSCSI 存储间的连接来利用 iSCSI 硬件。
  • 将由文件、卷、本地 SCSI 设备或者 RAM 磁盘支持的本地存储资源导出到远程系统。

targetcli 工具具有基于树的布局,包括内置的标签页完成、自动完成支持和内联文档。

7.1. 添加 iSCSI 目标

作为系统管理员,您可以使用 targetcli 工具添加 iSCSI 对象。

7.1.1. 安装 targetcli

安装 targetcli 工具来添加、监控和删除 iSCSI 存储间的连接。

流程

  1. 安装 targetcli:

    # yum install targetcli
  2. 启动目标服务:

    # systemctl start target
  3. 将目标配置为在引导时启动:

    # systemctl enable target
  4. 在防火墙中打开端口 3260 并重新载入防火墙配置:

    # firewall-cmd --permanent --add-port=3260/tcp
    Success
    
    # firewall-cmd --reload
    Success
  5. 查看 targetcli 布局:

    # targetcli
    /> ls
    o- /........................................[...]
      o- backstores.............................[...]
      | o- block.................[Storage Objects: 0]
      | o- fileio................[Storage Objects: 0]
      | o- pscsi.................[Storage Objects: 0]
      | o- ramdisk...............[Storage Objects: 0]
      o- iscsi...........................[Targets: 0]
      o- loopback........................[Targets: 0]

其它资源

  • targetcli man page。

7.1.2. 创建 iSCSI 目标

创建 iSCSI 目标可让客户端的 iSCSI 发起程序访问服务器中的存储设备。目标和发起方都有唯一的标识名称。

先决条件

流程

  1. 进入 iSCSI 目录:

    /> iscsi/
    注意

    cd 命令用于更改目录以及列出要移动到的路径。

  2. 使用以下选项之一创建 iSCSI 对象:

    1. 使用默认目标名称创建 iSCSI 对象:

      /iscsi> create
      
      Created target
      iqn.2003-01.org.linux-iscsi.hostname.x8664:sn.78b473f296ff
      Created TPG1
    2. 使用特定名称创建 iSCSI 对象:

      /iscsi> create iqn.2006-04.com.example:444
      
      Created target iqn.2006-04.com.example:444
      Created TPG1
      Here iqn.2006-04.com.example:444 is target_iqn_name

      iqn.2006-04.com.example:444 替换为特定目标名称。

  3. 验证新创建的目标:

    /iscsi> ls
    
    o- iscsi.......................................[1 Target]
        o- iqn.2006-04.com.example:444................[1 TPG]
            o- tpg1...........................[enabled, auth]
               o- acls...............................[0 ACL]
                o- luns...............................[0 LUN]
               o- portals.........................[0 Portal]

其它资源

  • targetcli man page。

7.1.3. iSCSI Backstore

iSCSI 后端存储支持将导出的 LUN 数据存储在本地计算机上的不同方法。创建存储对象定义了后端存储使用的资源。管理员可以选择 Linux-IO(LIO)支持的以下后端存储设备:

其它资源

  • targetcli man page。

7.1.4. 创建 fileio 存储对象

fileio 存储对象可以支持 write_backwrite_thru 操作。write_back 操作启用本地文件系统缓存。这提高了性能,但会增加数据丢失的风险。建议使用 write_back=false 来禁用 write_back 操作,而使用 write_thru 操作。

先决条件

流程

  1. 进入 backstores 目录:

    /> backstores/
  2. 创建一个 fileio 存储对象:

    /> backstores/fileio create file1 /tmp/disk1.img 200M write_back=false
    
    Created fileio file1 with size 209715200
  3. 验证创建的 fileio 存储对象:

    /backstores> ls

其它资源

  • targetcli man page。

7.1.5. 创建块存储对象

块驱动程序允许使用 /sys/block/ 目录中显示的任何块设备与 Linux-IO(LIO)一起使用。这包括物理设备(如 HDD、SSD、CD、DVD)和逻辑设备(如软件或硬件 RAID 卷或 LVM 卷)。

先决条件

流程

  1. 进入 backstores 目录:

    /> backstores/
  2. 创建 block 后端存储:

    /> backstores/block create name=block_backend dev=/dev/sdb
    
    Generating a wwn serial.
    Created block storage object block_backend using /dev/vdb.
  3. 验证创建的 block 存储对象:

    /backstores> ls
    注意

    您还可以在逻辑卷中创建块后备存储。

其它资源

  • targetcli man page。

7.1.6. 创建 pscsi 存储对象

您可以将任何支持直接传递 SCSI 命令的存储对象配置为没有 SCSI 模拟的后端存储,并带有一个底层 SCSI 设备,它出现在 /proc/scsi/scsilsscsi (如一个 SAS 硬盘)。这个子系统支持 SCSI-3 及更高系统。

警告

pscsi 应该只供高级用户使用。设备固件中通常不实施高级 SCSI 命令,如非对称逻辑单元分配(ALUA)或持久保留(例如,VMware ESX 和 vSphere 使用的命令),并可能导致故障或崩溃。当有疑问时,在生产环境中使用 block 后端存储。

先决条件

流程

  1. 进入 backstores 目录:

    /> backstores/
  2. 为物理 SCSI 设备创建一个 pscsi 后端存储,在这个示例中是使用 /dev/sr0 的 TYPE_ROM 设备:

    /> backstores/pscsi/ create name=pscsi_backend dev=/dev/sr0
    
    Generating a wwn serial.
    Created pscsi storage object pscsi_backend using /dev/sr0
  3. 验证创建的 pscsi 存储对象:

    /backstores> ls

其它资源

  • targetcli man page。

7.1.7. 创建内存副本 RAM 磁盘存储对象

内存复制 RAM 磁盘(ramdisk)为 RAM 磁盘提供完整的 SCSI 模拟和独立的内存映射,使用内存副本作为启动器。这为多会话提供了功能,在用于生产目的的快速和可变量存储中特别有用。

先决条件

流程

  1. 进入 backstores 目录:

    /> backstores/
  2. 创建 1GB RAM 磁盘后备存储:

    /> backstores/ramdisk/ create name=rd_backend size=1GB
    
    Generating a wwn serial.
    Created rd_mcp ramdisk rd_backend with size 1GB.
  3. 验证创建的 ramdisk 存储对象:

    /backstores> ls

其它资源

  • targetcli man page。

7.1.8. 创建 iSCSI 门户

创建 iSCSI 门户,为目标添加一个 IP 地址和端口来启用目标。

先决条件

流程

  1. 进入 TPG 目录:

    /iscsi> iqn.2006-04.example:444/tpg1/
  2. 使用以下选项之一创建 iSCSI 门户:

    1. 创建默认门户使用默认 iSCSI 端口 3260,并允许目标侦听该端口上的所有 IP 地址:

      /iscsi/iqn.20...mple:444/tpg1> portals/ create
      
      Using default IP port 3260
      Binding to INADDR_Any (0.0.0.0)
      Created network portal 0.0.0.0:3260
      注意

      当创建 iSCSI 目标时,也会创建一个默认门户网站。此门户设置为侦听所有 IP 地址,其默认端口号为: 0.0.0.0:3260

      删除默认门户网站:

      /iscsi/iqn-name/tpg1/portals delete ip_address=0.0.0.0 ip_port=3260

    2. 使用特定 IP 地址创建门户:

      /iscsi/iqn.20...mple:444/tpg1> portals/ create 192.168.122.137
      
      Using default IP port 3260
      Created network portal 192.168.122.137:3260
  3. 验证新创建的门户网站:

    /iscsi/iqn.20...mple:444/tpg1> ls
    
    o- tpg.................................. [enambled, auth]
        o- acls ......................................[0 ACL]
        o- luns ......................................[0 LUN]
        o- portals ................................[1 Portal]
           o- 192.168.122.137:3260......................[OK]

其它资源

  • targetcli man page。

7.1.9. 创建 iSCSI LUN

逻辑单元号(LUN)是受 iSCSI 后端存储支持的物理设备。每个 LUN 都有唯一的数字。

先决条件

流程

  1. 创建已创建的存储对象的 LUN:

    /iscsi/iqn.20...mple:444/tpg1> luns/ create /backstores/ramdisk/rd_backend
    Created LUN 0.
    
    /iscsi/iqn.20...mple:444/tpg1> luns/ create /backstores/block/block_backend
    Created LUN 1.
    
    /iscsi/iqn.20...mple:444/tpg1> luns/ create /backstores/fileio/file1
    Created LUN 2.
  2. 验证创建的 LUN:

    /iscsi/iqn.20...mple:444/tpg1> ls
    
    o- tpg.................................. [enambled, auth]
        o- acls ......................................[0 ACL]
        o- luns .....................................[3 LUNs]
        |  o- lun0.........................[ramdisk/ramdisk1]
        |  o- lun1.................[block/block1 (/dev/vdb1)]
        |  o- lun2...................[fileio/file1 (/foo.img)]
        o- portals ................................[1 Portal]
            o- 192.168.122.137:3260......................[OK]

    默认 LUN 名称从 0 开始。

    重要

    默认情况下,使用读写权限创建 LUN。如果在创建 ACL 后添加了新 LUN,LUN 会自动映射到所有可用 ACL,并可能导致安全风险。要创建具有只读权限的 LUN,请参考 第 7.1.10 节 “创建只读 iSCSI LUN”

  3. 配置 ACL。更多信息请参阅 第 7.1.11 节 “创建 iSCSI ACL”

其它资源

  • targetcli man page。

7.1.10. 创建只读 iSCSI LUN

默认情况下,使用读写权限创建 LUN。这个步骤描述了如何创建只读 LUN。

先决条件

流程

  1. 设置只读权限:

    /> set global auto_add_mapped_luns=false
    
    Parameter auto_add_mapped_luns is now 'false'.

    这样可防止 LUN 自动映射到现有 ACL,从而允许手动映射 LUN。

  2. 创建 LUN:

    /> iscsi/target_iqn_name/tpg1/acls/initiator_iqn_name/ create mapped_lun=next_sequential_LUN_number tpg_lun_or_backstore=backstore write_protect=1

    例如:

    /> iscsi/iqn.2006-04.example:444/tpg1/acls/2006-04.com.example.foo:888/ create mapped_lun=1 tpg_lun_or_backstore=/backstores/block/block2 write_protect=1
    
    Created LUN 1.
    Created Mapped LUN 1.
  3. 验证所创建的 LUN:

    /> ls
    
    o- / ...................................................... [...]
      o- backstores ........................................... [...]
      <snip>
      o- iscsi ......................................... [Targets: 1]
      | o- iqn.2006-04.example:444 .................. [TPGs: 1]
      |   o- tpg1 ............................ [no-gen-acls, no-auth]
      |     o- acls ....................................... [ACLs: 2]
      |     | o- 2006-04.com.example.foo:888 .. [Mapped LUNs: 2]
      |     | | o- mapped_lun0 .............. [lun0 block/disk1 (rw)]
      |     | | o- mapped_lun1 .............. [lun1 block/disk2 (ro)]
      |     o- luns ....................................... [LUNs: 2]
      |     | o- lun0 ...................... [block/disk1 (/dev/vdb)]
      |     | o- lun1 ...................... [block/disk2 (/dev/vdc)]
      <snip>

    mapping_lun1 行现在在结尾有(ro)(不像 mapping_lun0 的(rw))表示它是只读的。

  4. 配置 ACL。更多信息请参阅 第 7.1.11 节 “创建 iSCSI ACL”

其它资源

  • targetcli man page。

7.1.11. 创建 iSCSI ACL

targetcli 中,访问控制列表(ACL)用于定义访问规则,每个发起方都对 LUN 有独占访问权限。目标和发起方都有唯一的标识名称。您必须知道配置 ACL 的发起方的唯一名称。iSCSI 发起程序可在 /etc/iscsi/initiatorname.iscsi 文件中找到。

先决条件

流程

  1. 进入 acls 目录

    /iscsi/iqn.20...mple:444/tpg1> acls/
  2. 使用以下选项之一创建 ACL:

    1. 使用启动器上 /etc/iscsi/initiatorname.iscsi 文件中的启动器名称。
    2. 使用更容易记住的名称,请参阅 第 7.1.12 节 “创建 iSCSI 启动程序” 部分以确保 ACL 与启动器匹配。

      /iscsi/iqn.20...444/tpg1/acls> create iqn.2006-04.com.example.foo:888
      
      Created Node ACL for iqn.2006-04.com.example.foo:888
      Created mapped LUN 2.
      Created mapped LUN 1.
      Created mapped LUN 0.
      注意

      上例中使用的全局设置 auto_add_mapped_luns 会自动将 LUN 映射到任何创建的 ACL。

      您可以在目标服务器上的 TPG 节点中设置用户创建的 ACL:

      /iscsi/iqn.20...scsi:444/tpg1> set attribute generate_node_acls=1
  3. 验证创建的 ACL:

    /iscsi/iqn.20...444/tpg1/acls> ls
    
    o- acls .................................................[1 ACL]
        o- iqn.2006-04.com.example.foo:888 ....[3 Mapped LUNs, auth]
            o- mapped_lun0 .............[lun0 ramdisk/ramdisk1 (rw)]
            o- mapped_lun1 .................[lun1 block/block1 (rw)]
            o- mapped_lun2 .................[lun2 fileio/file1 (rw)]

其它资源

  • targetcli man page。

7.1.12. 创建 iSCSI 启动程序

iSCSI 启动程序形成连接 iSCSI 目标的会话。有关 iSCSI 目标的详情请参考 第 7.1.2 节 “创建 iSCSI 目标”。默认情况下,iSCSI 服务被启动,服务会在运行 lazily 命令后启动。iscsiadm如果 root 没有在 iSCSI 设备中,或者没有标记为 node.startup = automatic 的节点,则在执行需要 iscsidiscsi 内核模块启动的 iscsiadm 命令前,iSCSI 服务才会启动。

要强制 iscsid 守护进程运行和 iSCSI 内核模块载入:

# systemctl start iscsid.service

先决条件

流程

  1. 在客户端机器上安装 iscsi-initiator-utils:

    # yum install iscsi-initiator-utils
  2. 检查 initiator 名称:

    # cat /etc/iscsi/initiatorname.iscsi
    
    InitiatorName=2006-04.com.example.foo:888
  3. 如果 ACL 在 第 7.1.11 节 “创建 iSCSI ACL” 中被授予自定义名称,请相应地修改 /etc/iscsi/initiatorname.iscsi 文件。

    # vi /etc/iscsi/initiatorname.iscsi
  4. 发现目标并使用显示的目标 IQN 登录到目标:

    # iscsiadm -m discovery -t st -p 10.64.24.179
        10.64.24.179:3260,1 iqn.2006-04.example:444
    
    # iscsiadm -m node -T iqn.2006-04.example:444 -l
        Logging in to [iface: default, target: iqn.2006-04.example:444, portal: 10.64.24.179,3260] (multiple)
        Login to [iface: default, target: iqn.2006-04.example:444, portal: 10.64.24.179,3260] successful.

    10.64.24.179 替换为 target-ip-address。

    如果将对应的启动器名称添加到 ACL 中,如 第 7.1.11 节 “创建 iSCSI ACL” 所述,您可以使用此流程连接到同一目标的任何数量的启动器。

  5. 找到 iSCSI 磁盘名称并在这个 iSCSI 磁盘中创建文件系统:

    # grep "Attached SCSI" /var/log/messages
    
    # mkfs.ext4 /dev/disk_name

    使用 /var/log/messages 文件中显示的 iSCSI 磁盘名称替换 disk_name

  6. 挂载文件系统:

    # mkdir /mount/point
    
    # mount /dev/disk_name /mount/point

    使用分区的挂载点替换 /mount/point

  7. 编辑 /etc/fstab 文件以便在系统引导时自动挂载文件系统:

    # vi /etc/fstab
    
    /dev/disk_name /mount/point ext4 _netdev 0 0

    使用 iSCSI 磁盘名称替换 disk_name,使用分区的挂载点替换 /mount/point

其它资源

  • targetcli man page。
  • iscsiadm man page。

7.1.13. 为目标设置 Challenge-Handshake 验证协议

Challenge-Handshake Authentication Protocol (CHAP) 允许用户使用密码保护目标。发起方必须了解这个密码才能连接到目标。

先决条件

流程

  1. 设置属性身份验证:

    /iscsi/iqn.20...mple:444/tpg1> set attribute authentication=1
    
    Parameter authentication is now '1'.
  2. 设置 useridpassword

    /tpg1> set auth userid=redhat
    Parameter userid is now 'redhat'.
    
    /iscsi/iqn.20...689dcbb3/tpg1> set auth password=redhat_passwd
    Parameter password is now 'redhat_passwd'.

其它资源

  • targetcli man page。

7.1.14. 为发起方设置 Challenge-Handshake Authentication Protocol

Challenge-Handshake Authentication Protocol (CHAP) 允许用户使用密码保护目标。发起方必须了解这个密码才能连接到目标。

先决条件

流程

  1. iscsid.conf 文件中启用 CHAP 验证:

    # vi /etc/iscsi/iscsid.conf
    
    node.session.auth.authmethod = CHAP

    默认情况下,node.session.auth.authmethod 设置为 None

  2. iscsid.conf 文件中添加目标 usernamepassword:

    node.session.auth.username = redhat
    node.session.auth.password = redhat_passwd
  3. 启动 iscsid 守护进程:

    # systemctl start iscsid.service

其它资源

  • iscsiadm man page

7.2. 监控 iSCSI 会话

作为系统管理员,您可以使用 iscsiadm 工具监控 iSCSI 会话。

7.2.1. 使用 iscsiadm 程序监控 iSCSI 会话

这个步骤描述了如何使用 iscsiadm 监控 iscsi 会话。

默认情况下,iSCSI 服务被启动,服务会在运行 lazily 命令后启动。iscsiadm如果 root 没有在 iSCSI 设备中,或者没有标记为 node.startup = automatic 的节点,则在执行需要 iscsidiscsi 内核模块启动的 iscsiadm 命令前,iSCSI 服务才会启动。

要强制 iscsid 守护进程运行和 iSCSI 内核模块载入:

# systemctl start iscsid.service

先决条件

  • 在客户端机器中安装 iscsi-initiator-utils:

    yum install iscsi-initiator-utils

流程

  1. 查找正在运行的会话的信息:

    # iscsiadm -m session -P 3

    此命令显示会话或设备状态、会话 ID(sid)、一些协商参数,以及可通过会话访问的 SCSI 设备。

    • 对于较短的输出,例如,只显示 sid-to-node 映射,请运行:

      # iscsiadm -m session -P 0
              or
      # iscsiadm -m session
      
      tcp [2] 10.15.84.19:3260,2 iqn.1992-08.com.netapp:sn.33615311
      tcp [3] 10.15.85.19:3260,3 iqn.1992-08.com.netapp:sn.33615311

      这些命令以以下格式打印正在运行的会话列表: driver [sid] target_ip:port,target_portal_group_tag proper_target_name

其它资源

  • /usr/share/doc/iscsi-initiator-utils-version/README 文件。
  • iscsiadm man page。

7.3. 删除 iSCSI 目标

作为系统管理员,您可以删除 iSCSI 目标。

7.3.1. 使用 targetcli 工具删除 iSCSI 对象

这个步骤描述了如何使用 targetcli 工具删除 iSCSI 对象。

流程

  1. 从目标登出:

    # iscsiadm -m node -T iqn.2006-04.example:444 -u

    有关如何登录到目标的详情请参考 第 7.1.12 节 “创建 iSCSI 启动程序”

  2. 删除整个目标,包括所有 ACL、LUN 和门户:

    /> iscsi/ delete iqn.2006-04.com.example:444

    iqn.2006-04.com.example:444 替换为 target_iqn_name。

    • 删除 iSCSI 后端存储:

      /> backstores/backstore-type/ delete block_backend
      • 使用 fileioblockpscsiramdisk 替换 backstore-type
      • 使用您要删除的后端存储名称替换 block_backend
    • 要删除 iSCSI 目标的部分内容,如 ACL:

      /> /iscsi/iqn-name/tpg/acls/ delete iqn.2006-04.com.example:444
  3. 查看更改:

    /> iscsi/ ls

其它资源

  • targetcli man page。

7.4. DM 多路径覆盖设备超时

recovery_tmo sysfs 选项控制特定 iSCSI 设备的超时时间。以下选项全局覆盖 recovery_tmo 值:

  • replacement_timeout 配置选项会全局覆盖所有 iSCSI 设备的 recovery_tmo 值。
  • 对于由 DM 多路径管理的所有 iSCSI 设备,DM 多路径中的 fast_io_fail_tmo 选项全局覆盖 recovery_tmo 值。

    DM 多路径中的 fast_io_fail_tmo 选项会覆盖光纤通道设备的 fast_io_fail_tmo 选项。

DM 多路径 fast_io_fail_tmo 选项优先于 replacement_timeout。红帽不推荐使用 replacement_timeout 覆盖在由 DM 多路径管理的设备中的 recovery_tmo,因为 DM 多路径总是在 multipathd 服务重新加载时重置 recovery_tmo