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 目标
安装 targetcli 软件包
# yum install targetcli
启动 targetcli 命令集
# targetcli
创建存储对象
使用存储池创建三个存储对象。- 创建块存储对象
- 导航到
/backstores/block
目录。 - 运行 create 命令。
# create [block-name][filepath]
例如:# create block1 dev=/dev/sdb1
- 创建 fileio 对象
- 进入
/fileio
目录。 - 运行 create 命令。
# create [fileio-name][image-name] [image-size]
例如:# create fileio1 /foo.img 50M
- 创建 ramdisk 对象
- 导航到
/ramdisk
目录。 - 运行 create 命令。
# create [ramdisk-name] [ramdisk-size]
例如:# create ramdisk1 1M
- 记录这一步中创建的磁盘名称。稍后将使用它们。
创建 iSCSI 目标
- 导航到
/iscsi
目录。 - 以两种方式之一创建目标:
- 运行 create 命令(不带参数)。iSCSI 限定名称( IQN)会自动生成。
- 运行 create 命令并指定 IQN 和服务器。例如:
# create iqn.2010-05.com.example.server1:iscsirhel7guest
定义门户 IP 地址
要通过 iSCSI 导出块存储,必须先配置门户、LUN 和 访问控制列表 ACL。该门户包括目标监控器的 IP 地址和 TCP,以及它连接到的启动器。iSCSI 使用端口 3260。默认配置了这个端口。连接到端口 3260:- 进入
/tpg
目录。 - 运行以下命令:
# portals/ create
此命令提供侦听端口 3260 的所有可用 IP 地址。如果只使用单个 IP 地址侦听端口 3260,请将 IP 地址添加到 命令的末尾。例如:# portals/ create 143.22.16.33
配置 LUN,并将存储对象分配到光纤
此步骤使用创建存储对象 中创建的 存储对象。- 导航到 定义门户 IP 地址 中创建的 TPG
的 lun
目录。例如:# iscsi>iqn.iqn.2010-05.com.example.server1:iscsirhel7guest
- 将第一个 LUN 分配给 ramdisk。例如:
# create /backstores/ramdisk/ramdisk1
- 将第二个 LUN 分配给块磁盘。例如:
# create /backstores/block/block1
- 将第三个 LUN 分配给 fileio 磁盘。例如:
# create /backstores/fileio/fileio1
- 列出生成的 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]
为每个启动器创建 ACL
在启动器连接时启用身份验证。您还可以将指定的 LUN 重新变为指定的非联网器。目标和启动器具有唯一名称。iSCSI 启动器使用 IQN。- 使用启动器名称查找 iSCSI initiator 的 IQN。例如:
# cat /etc/iscsi/initiator2.iscsi InitiatorName=create iqn.2010-05.com.example.server1:iscsirhel7guest
此 IQN 用于创建 ACL。 - 进入
acls
目录。 - 通过执行以下操作之一创建 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
完成此步骤后,通过 保护存储池来继续。保存配置
通过覆盖之前的引导设置使配置持久。# saveconfig
启用服务
要在下一次启动时应用保存的设置,请启用该服务。# systemctl enable target.service
可选流程
在创建基于 iSCSI 的存储池前,您可以使用 iSCSI 目标执行多个可选步骤。
过程 13.6. 在 RAID 阵列中配置逻辑卷
创建 RAID5 阵列
有关创建 RAID5 阵列的详情,请参考 Red Hat Enterprise Linux 7 存储管理指南。在 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. 测试设备附加
附加新的 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.
分离设备
# 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 存储池的安全。这可以在定义池之前或之后配置,但必须启动池才能使身份验证设置生效。
创建 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>
定义 secret
# virsh secret-define secret.xml
验证 UUID
# virsh secret-list UUID Usage -------------------------------------------------------------------------------- 2d7891af-20be-4e5e-af83-190e8a922360 iscsi iscsirhel7secret
为 UID 分配 secret
使用以下命令,将密码分配给上一步输出中的 UUID。这样可保证 CHAP 用户名和密码位于由 libvirt 控制的 secret 列表中。# MYSECRET=`printf %s "password123" | base64` # virsh secret-set-value 2d7891af-20be-4e5e-af83-190e8a922360 $MYSECRET
在存储池中添加身份验证条目
使用 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>
激活更改
必须启动存储池才能激活这些更改。- 如果存储池尚未启动,请按照使用 virsh 创建存储池中的步骤来定义和启动 存储池。
- 如果池已启动,输入以下命令停止并重启存储池:
# virsh pool-destroy iscsirhel7pool # virsh pool-start iscsirhel7pool
参数
下表提供了 XML 文件、virsh pool-define-as 命令和 Virtual Machine Manager 应用程序所需的参数列表,用于创建基于 iSCSI 的存储池。
描述 | XML | pool-define-as | 虚拟机管理器 |
---|---|---|---|
存储池的类型 | <pool type='iscsi'> | [type] iscsi | iSCSI:iSCSI 目标 |
存储池的名称 | <name>name</name> | [name] name | Name |
主机的名称。 |
<source> | source-host hostname | 主机名 |
iSCSI IQN。 |
device path="iSCSI_IQN" /> | source-dev iSCSI_IQN | 源 IQN |
指定目标的路径。这将是用于存储池的路径。 |
<target> | 目标 path_to_pool | 目标路径 |
(可选)iSCSI initiator 的 IQN。只有 ACL 将 LUN 限制为特定发起方时才需要。 |
<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 的存储池示例