Red Hat Training

A Red Hat training course is available for Red Hat Enterprise Linux

13.2.3.5. 基于 iSCSI 的存储池

建议
Internet Small Computer System Interface(iSCSI)是用于共享存储设备的网络协议。iSCSI 通过 IP 层使用 SCSI 指令连接到目标(存储服务器)。
使用基于 iSCSI 的设备存储客户机虚拟机允许更灵活的存储选项,比如将 iSCSI 用作块存储设备。iSCSI 设备使用 Linux-IO(LIO)目标。这是 Linux 的多协议 SCSI 目标。除了 iSCSI 外,LIO 还支持通过以太网光纤通道和光纤通道(FCoE)。
先决条件
在创建基于 iSCSI 的存储池前,必须创建 iSCSI 目标。iSCSI 目标使用 targetcli 软件包创建,该软件包提供了用于创建软件支持的 iSCSI 目标的命令集。

过程 13.5. 创建 iSCSI 目标

  1. 安装 targetcli 软件包

    # yum install targetcli
  2. 启动 targetcli 命令集

    # targetcli
  3. 创建存储对象

    使用存储池创建三个存储对象。
    1. 创建块存储对象
      1. 导航到 /backstores/block 目录。
      2. 运行 create 命令。
        # create [block-name][filepath]
        例如:
        # create block1 dev=/dev/sdb1
    2. 创建 fileio 对象
      1. 进入 /fileio 目录。
      2. 运行 create 命令。
        # create [fileio-name][image-name] [image-size]
        例如:
        # create fileio1 /foo.img 50M
    3. 创建 ramdisk 对象
      1. 导航到 /ramdisk 目录。
      2. 运行 create 命令。
        # create [ramdisk-name] [ramdisk-size]
        例如:
        # create ramdisk1 1M
    4. 记录这一步中创建的磁盘名称。稍后将使用它们。
  4. 创建 iSCSI 目标

    1. 导航到 /iscsi 目录。
    2. 以两种方式之一创建目标:
      • 运行 create 命令(不带参数)。
        iSCSI 限定名称( IQN)会自动生成。
      • 运行 create 命令并指定 IQN 和服务器。例如:
        # create iqn.2010-05.com.example.server1:iscsirhel7guest
  5. 定义门户 IP 地址

    要通过 iSCSI 导出块存储,必须先配置门户、LUN 和 访问控制列表 ACL。
    该门户包括目标监控器的 IP 地址和 TCP,以及它连接到的启动器。iSCSI 使用端口 3260。默认配置了这个端口。
    连接到端口 3260:
    1. 进入 /tpg 目录。
    2. 运行以下命令:
      # portals/ create
      此命令提供侦听端口 3260 的所有可用 IP 地址。
      如果只使用单个 IP 地址侦听端口 3260,请将 IP 地址添加到 命令的末尾。例如:
      # portals/ create 143.22.16.33
  6. 配置 LUN,并将存储对象分配到光纤

    此步骤使用创建存储对象 中创建的 存储对象
    1. 导航到 定义门户 IP 地址 中创建的 TPG 的 lun 目录。例如:
      # iscsi>iqn.iqn.2010-05.com.example.server1:iscsirhel7guest
    2. 将第一个 LUN 分配给 ramdisk。例如:
      # create /backstores/ramdisk/ramdisk1
    3. 将第二个 LUN 分配给块磁盘。例如:
      # create /backstores/block/block1
    4. 将第三个 LUN 分配给 fileio 磁盘。例如:
      # create /backstores/fileio/fileio1
    5. 列出生成的 LUN。
      /iscsi/iqn.20...csirhel7guest ls
      
      o- tgp1 ............................................................[enabled, 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- IP-ADDRESS:3260.........................................................[OK]
      
  7. 为每个启动器创建 ACL

    在启动器连接时启用身份验证。您还可以将指定的 LUN 重新变为指定的非联网器。目标和启动器具有唯一名称。iSCSI 启动器使用 IQN。
    1. 使用启动器名称查找 iSCSI initiator 的 IQN。例如:
      # cat /etc/iscsi/initiator2.iscsi
      InitiatorName=create iqn.2010-05.com.example.server1:iscsirhel7guest
      此 IQN 用于创建 ACL。
    2. 进入 acls 目录。
    3. 通过执行以下操作之一创建 ACL:
      • 通过运行 create 命令(不带参数)为所有 LUN 和启动器创建 ACLS。
        # create
      • 为特定 LUN 和启动器创建 ACL,运行指定 iSCSI intiator 的 IQN 的 create 命令。例如:
        # create iqn.2010-05.com.example.server1:888
      • 配置内核目标,以为所有启动器使用单个用户 ID 和密码。
        # set auth userid=user_ID
        # set auth password=password
        # set attribute authentication=1
        # set attribute generate_node_acls=1
    完成此步骤后,通过 保护存储池来继续
  8. 保存配置

    通过覆盖之前的引导设置使配置持久。
    # saveconfig
  9. 启用服务

    要在下一次启动时应用保存的设置,请启用该服务。
    # systemctl enable target.service
可选流程
在创建基于 iSCSI 的存储池前,您可以使用 iSCSI 目标执行多个可选步骤。

过程 13.6. 在 RAID 阵列中配置逻辑卷

  1. 创建 RAID5 阵列

    有关创建 RAID5 阵列的详情,请参考 Red Hat Enterprise Linux 7 存储管理指南
  2. 在 RAID5 阵列中创建 LVM 逻辑卷

    有关在 RAID5 阵列中创建 LVM 逻辑卷的详情,请参考 Red Hat Enterprise Linux 7 逻辑卷管理器管理指南

过程 13.7. 测试发现性

  • 确保新的 iSCSI 设备可被发现。

    # iscsiadm --mode discovery --type sendtargets --portal server1.example.com
    143.22.16.33:3260,1 iqn.2010-05.com.example.server1:iscsirhel7guest

过程 13.8. 测试设备附加

  1. 附加新的 iSCSI 设备

    连接新设备(iqn.2010-05.com.example.server1:iscsirhel7guest),以确定是否可以附加该设备。
    # iscsiadm -d2 -m node --login
    scsiadm: Max file limits 1024 1024
    
    Logging in to [iface: default, target: iqn.2010-05.com.example.server1:iscsirhel7guest, portal: 143.22.16.33,3260]
    Login to [iface: default, target: iqn.2010-05.com.example.server1:iscsirhel7guest, portal: 143.22.16.33,3260] successful.
    
  2. 分离设备

    # iscsiadm -d2 -m node --logout
    scsiadm: Max file limits 1024 1024
    
    Logging out of session [sid: 2, target: iqn.2010-05.com.example.server1:iscsirhel7guest, portal: 143.22.16.33,3260
    Logout of [sid: 2, target: iqn.2010-05.com.example.server1:iscsirhel7guest, portal: 143.22.16.33,3260] successful.

过程 13.9. 为 iSCSI 存储池使用 libvirt secret

注意
如果在创建 iSCSI 目标时定义了 user_ID 和密码 则需要这个过程。
可以使用 virsh 配置用户名和密码参数来保护 iSCSI 存储池的安全。这可以在定义池之前或之后配置,但必须启动池才能使身份验证设置生效。
  1. 创建 libvirt secret 文件

    创建一个带有质询身份验证协议(CHAP)用户名的 libvirt secret 文件。例如:
    <secret ephemeral='no' private='yes'>
        <description>Passphrase for the iSCSI example.com server</description>
        <usage type='iscsi'>
            <target>iscsirhel7secret</target>
        </usage>
    </secret>
  2. 定义 secret

    # virsh secret-define secret.xml
  3. 验证 UUID

    # virsh secret-list
    UUID                                  Usage
    --------------------------------------------------------------------------------
    2d7891af-20be-4e5e-af83-190e8a922360  iscsi iscsirhel7secret
  4. 为 UID 分配 secret

    使用以下命令,将密码分配给上一步输出中的 UUID。这样可保证 CHAP 用户名和密码位于由 libvirt 控制的 secret 列表中。
    # MYSECRET=`printf %s "password123" | base64`
    # virsh secret-set-value 2d7891af-20be-4e5e-af83-190e8a922360 $MYSECRET
  5. 在存储池中添加身份验证条目

    使用 virsh edit 修改存储池 XML 文件中的 <source> 条目,再添加一个 <auth> 元素,指定 验证类型用户名secret 使用
    例如:
    <pool type='iscsi'>
      <name>iscsirhel7pool</name>
        <source>
           <host name='192.168.122.1'/>
           <device path='iqn.2010-05.com.example.server1:iscsirhel7guest'/>
           <auth type='chap' username='redhat'>
              <secret usage='iscsirhel7secret'/>
           </auth>
        </source>
      <target>
        <path>/dev/disk/by-path</path>
      </target>
    </pool>
    注意
    <auth> 子元素存在于客户机 XML 的 <pool><disk> 元素的不同位置。对于 <pool><auth><source> 元素中指定,这描述了查找池源的位置,因为身份验证是某些池源(iSCSI 和 RBD)的属性。对于 <disk>,这是域的子元素,对 iSCSI 或 RBD 磁盘的身份验证是磁盘的属性。
    另外,磁盘的 <auth> 子元素与存储池的不同。
    <auth username='redhat'>
      <secret type='iscsi' usage='iscsirhel7secret'/>
    </auth>
  6. 激活更改

    必须启动存储池才能激活这些更改。
参数
下表提供了 XML 文件、virsh pool-define-as 命令和 Virtual Machine Manager 应用程序所需的参数列表,用于创建基于 iSCSI 的存储池。

表 13.5. 基于 iSCSI 的存储池参数

描述XMLpool-define-as虚拟机管理器
存储池的类型 <pool type='iscsi'> [type] iscsi iSCSI:iSCSI 目标
存储池的名称 <name>name</name> [name] name Name
主机的名称。

<source>
  <host name='hostname' />

source-host hostname 主机名
iSCSI IQN。

  device path="iSCSI_IQN" />
</source>

source-dev iSCSI_IQN 源 IQN
指定目标的路径。这将是用于存储池的路径。

<target>
  <path>/dev/disk/by-path</path>
</target>

目标 path_to_pool 目标路径
(可选)iSCSI initiator 的 IQN。只有 ACL 将 LUN 限制为特定发起方时才需要。

<initiator>
  <iqn name='initiator0' />
</initiator>

请参见以下注释。 启动器 IQN
注意
iSCSI initiator 的 IQN 可使用 virsh find-storage-pool-sources-as iscsi 命令确定。
如果您使用 virsh 创建存储池,请继续 验证存储池是否已创建
示例
以下是基于 iSCSI 的存储池的 XML 文件示例:
<pool type='iscsi'>
  <name>iSCSI_pool</name>
  <source>
    <host name='server1.example.com'/>
    <device path='iqn.2010-05.com.example.server1:iscsirhel7guest'/>
  </source>
  <target>
    <path>/dev/disk/by-path</path>
  </target>
</pool>

以下是创建基于 iSCSI 的存储池的命令示例:
# virsh pool-define-as --name iSCSI_pool --type iscsi --source-host server1.example.com --source-dev iqn.2010-05.com.example.server1:iscsirhel7guest --target /dev/disk/by-path
Pool iSCSI_pool defined
下图显示了虚拟机 XML 配置虚拟机管理器 来添加 New Storage Pool 对话框的例子,用于创建基于 iSCSI 的存储池:

图 13.8. 添加新的基于 iSCSI 的存储池示例

添加新的基于 iSCSI 的存储池示例