Red Hat Training

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

第 25 章 在线存储管理

在操作系统运行时,通常最好在操作系统运行时添加、删除或重新调整存储设备,而且无需重新启动。本章概述了在系统运行时,在 Red Hat Enterprise Linux 7 主机系统中重新配置存储设备的步骤。它涵盖了 iSCSI 和光纤通道存储互连;以后可能会添加其他互连类型。
本章重点介绍添加、删除、修改和监控存储设备。它不会详细讨论光纤通道或 iSCSI 协议。有关这些协议的更多信息,请参阅其他文档。
本章引用各种 sysfs 对象。红帽建议 sysfs 对象名称和目录结构在主 Red Hat Enterprise Linux 版本中有所变化。这是因为上游 Linux 内核不提供稳定的内部 API。有关如何以传输的方式引用 sysfs 对象的说明,请参阅内核源树中的文档 /usr/share/doc/kernel-doc-版本/Documentation/sysfs-rules.txt
警告
必须谨慎进行在线存储重新配置。处理过程中的系统故障或中断可能会导致意外的结果。红帽建议在更改操作期间最大程度地减少系统负载。这将减少配置更改期间发生 I/O 错误、内存不足或类似错误的可能性。以下章节提供了关于此方面的更具体的指南。
另外,红帽建议您在重新配置在线存储前备份所有数据。 

25.1. 目标设置

Red Hat Enterprise Linux 7 使用 targetcli shell 作为前端来查看、编辑和保存 Linux-IO 目标配置,而无需直接操作内核目标的配置文件。targetcli 工具是一个命令行界面,允许管理员将本地存储资源导出,这些资源由文件、卷、本地 SCSI 设备或 RAM 磁盘支持。targetcli 工具具有一个基于树形的布局,包含内置 tab 自动完成功能,并提供完整的自动完成支持和内联文档。
targetcli 的层次结构并不总是与内核接口完全匹配,因为 targetcli 尽可能简化。
重要
要确保 targetcli 中所做的更改是持久的,请启动并启用 target 服务:
# systemctl start target
# systemctl enable target

25.1.1. 安装并运行 targetcli

要安装 targetcli,请使用:
# yum install targetcli
启动 目标 服务:
# systemctl start target
将目标 配置为在引导时启动:
# systemctl enable target
在防火墙中打开端口 3260,并重新载入防火墙配置:
# firewall-cmd --permanent --add-port=3260/tcp
Success
# firewall-cmd --reload
Success
使用 targetcli 命令,然后使用 ls 命令获取树接口的布局:
# targetcli
:
/> ls
o- /........................................[...]
  o- backstores.............................[...]
  | o- block.................[Storage Objects: 0]           
  | o- fileio................[Storage Objects: 0]       
  | o- pscsi.................[Storage Objects: 0]         
  | o- ramdisk...............[Storage Ojbects: 0]         
  o- iscsi...........................[Targets: 0]   
  o- loopback........................[Targets: 0]
注意
在 Red Hat Enterprise Linux 7.0 中,使用 Bash 中的 targetcli 命令(例如 targetcli iscsi/ create )无法正常工作,且不会返回错误。从 Red Hat Enterprise Linux 7.1 开始,提供了一个错误状态代码,以便使用 targetcli 和 shell 脚本。

25.1.2. 创建后端存储

后端存储支持在本地计算机上存储导出的 LUN 数据的不同方法。创建存储对象定义了后端存储使用的资源。
注意
在 Red Hat Enterprise Linux 6 中,术语"backing-store"用于引用创建的映射。但是,为了避免在 Red Hat Enterprise Linux 7 中使用 'backstores' 的不同方法混淆,在 Red Hat Enterprise Linux 7 术语 'storage objects' 指的是所创建的映射和"backstores"来描述不同类型的后备设备。
LIO 支持的后端存储设备有:
FILEIO (Linux 文件支持的存储)
FILEIO 存储对象可以支持 write_backwrite_thru 操作。write_back 启用本地文件系统缓存。这提高了性能,但会增加数据丢失的风险。建议您使用 write_back=false 禁用 write_back,而是使用 write_thru
要创建 fileio 存储对象,请运行命令 /backstores/fileio create file_name file_location file_size write_back=false。例如:
/> /backstores/fileio create file1 /tmp/disk1.img 200M write_back=false
Created fileio file1 with size 209715200
BLOCK (Linux BLOCK 设备)
块驱动程序允许使用 /sys/block 中出现的任何块设备与 LIO 一起使用。这包括物理设备(如 HDD、SSD、CD、DVD)和逻辑设备(如软件或硬件 RAID 卷或 LVM 卷)。
注意
BLOCK backstores 通常提供最佳性能。
要使用任何块设备创建 BLOCK 后端存储,请使用以下命令:
# fdisk /dev/vdb
Welcome to fdisk (util-linux 2.23.2).

Changes will remain in memory only, until you decide to write them.
Be careful before using the write command.

Device does not contain a recognized partition table
Building a new DOS disklabel with disk identifier 0x39dc48fb.

Command (m for help): n
Partition type:
   p   primary (0 primary, 0 extended, 4 free)
   e   extended
Select (default p): *Enter*
Using default response p
Partition number (1-4, default 1): *Enter*
First sector (2048-2097151, default 2048): *Enter*
Using default value 2048
Last sector, +sectors or +size{K,M,G} (2048-2097151, default 2097151): +250M
Partition 1 of type Linux and of size 250 MiB is set

Command (m for help): w
The partition table has been altered!

Calling ioctl() to re-read partition table.
Syncing disks.
/> /backstores/block create name=block_backend dev=/dev/vdb
Generating a wwn serial.
Created block storage object block_backend using /dev/vdb.
注意
您还可以在逻辑卷中创建 BLOCK 后端存储。
PSCSI (Linux 直通 SCSI 设备)
任何支持直接传递 SCSI 命令且无 SCSI 模拟的存储对象,并且使用 /proc/scsi/scsi (如 SAS 硬盘驱动器)中显示的底层 SCSI 设备可以配置为后备存储。这个子系统支持 SCSI-3 及更高系统。
警告
PSCSI 应该只供高级用户使用。高级 SCSI 命令(如 Aysmmetric Logical Unit Assignment (ALUAs)或 Persistent Reservations (ALUAs))或 Persistent Reservations (如 VMware ESX 和 vSphere 使用)通常不会在设备固件中实施,并可能导致故障或崩溃。如果有疑问,请对生产环境设置使用 BLOCK。
要为物理 SCSI 设备创建 PSCSI 后端存储,本例中使用 /dev/sr0TYPE_ROM 设备,请使用:
/> backstores/pscsi/ create name=pscsi_backend dev=/dev/sr0
Generating a wwn serial.
Created pscsi storage object pscsi_backend using /dev/sr0
内存复制 RAM 磁盘(Linux RAMDISK_MCP)
Memory Copy RAM 磁盘(ramdisk)为 RAM 磁盘提供完整的 SCSI 模拟,并使用启动器的内存副本来分隔内存映射。这为多会话提供了功能,对于生产环境的快速易失性存储特别有用。
要创建 1GB RAM 磁盘后备存储,请使用以下命令:
/> backstores/ramdisk/ create name=rd_backend size=1GB
Generating a wwn serial.
Created rd_mcp ramdisk rd_backend with size 1GB.

25.1.3. 创建 iSCSI 目标

创建 iSCSI 目标:

过程 25.1. 创建 iSCSI 目标

  1. 运行 targetcli
  2. 移动到 iSCSI 配置路径:
    /> iscsi/
    注意
    cd 命令还可接受更改目录,并只是列出要移动到的路径。
  3. 使用默认目标名称创建 iSCSI 目标。
    /iscsi> create
    Created target
    iqn.2003-01.org.linux-iscsi.hostname.x8664:sn.78b473f296ff
    Created TPG1
    或者使用指定名称创建 iSCSI 目标。
    /iscsi > create iqn.2006-04.com.example:444
    Created target iqn.2006-04.com.example:444
    Created TPG1
  4. 使用 ls 列出目标时,验证新创建的目标是否可见。
    /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]
    
注意
从 Red Hat Enterprise Linux 7.1 开始,每当创建目标时,也会创建一个默认门户。

25.1.4. 配置 iSCSI 门户

要配置 iSCSI 门户,必须首先创建 iSCSI 目标并与 TPG 关联。有关如何进行此操作的步骤,请参考 第 25.1.3 节 “创建 iSCSI 目标”
注意
从 Red Hat Enterprise Linux 7.1 创建 iSCSI 目标时,也会创建一个默认门户。此门户设置为使用默认端口号(00:3260)侦听所有 IP 地址。要删除此功能并只添加指定的门户,请使用 /iscsi/iqn-name/tpg1/portals delete ip_address=0.0.0.0 ip_port=3260,然后使用所需信息创建一个新门户。

过程 25.2. 创建 iSCSI 门户

  1. 移至 TPG。
    /iscsi> iqn.2006-04.example:444/tpg1/
  2. 创建门户的方法有两种:创建一个默认门户,或者创建一个门户,指定要侦听的 IP 地址。
    创建默认门户使用默认 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
    
    要创建门户,请指定要侦听的 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. 使用 ls 命令,验证新创建的门户是否可见。
    /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]
    

25.1.5. 配置 LUN

要配置 LUN,首先请创建存储对象。请参阅 第 25.1.2 节 “创建后端存储” 了解更多信息。

过程 25.3. 配置 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. 显示更改。
    /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 开始,而不是在 Red Hat Enterprise Linux 6 中使用 tgtd 时为 1。
  3. 配置 ACL。如需更多信息,请参阅 第 25.1.6 节 “配置 ACL”
重要
默认情况下,使用读写权限创建 LUN。如果在创建 ACL 后添加了新的 LUN,则 LUN 将自动映射到所有可用 ACL。这可能导致安全风险。使用以下步骤以只读方式创建 LUN。

过程 25.4. 创建一个只读 LUN

  1. 要创建具有只读权限的 LUN,首先使用以下命令:
    /> set global auto_add_mapped_luns=false
    Parameter auto_add_mapped_luns is now 'false'.
    
    这样可防止 LUN 自动映射到现有 ACL,从而允许手动映射 LUN。
  2. 接下来,使用命令 iscsi/target_iqn_name/tpg1/acls/initiator_iqn_name/ create mapped_lun=next_sequential_LUN_number tpg_lun_or_backstore=backstore write_protect=1 来手动创建 LUN。
    /> iscsi/iqn.2015-06.com.redhat:target/tpg1/acls/iqn.2015-06.com.redhat:initiator/ create mapped_lun=1 tpg_lun_or_backstore=/backstores/block/block2 write_protect=1
    Created LUN 1.
    Created Mapped LUN 1.
    /> ls
    o- / ...................................................... [...]
      o- backstores ........................................... [...]
      <snip>
      o- iscsi ......................................... [Targets: 1]
      | o- iqn.2015-06.com.redhat:target .................. [TPGs: 1]
      |   o- tpg1 ............................ [no-gen-acls, no-auth]
      |     o- acls ....................................... [ACLs: 2]
      |     | o- iqn.2015-06.com.redhat:initiator .. [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's (rw)),表示它是只读的。
  3. 配置 ACL。如需更多信息,请参阅 第 25.1.6 节 “配置 ACL”

25.1.6. 配置 ACL

为要连接的每个启动器创建 ACL。这会在启动器连接时强制身份验证,仅允许将 LUN 公开给每个启动器。通常,每个 initator 都具有对 LUN 的独占访问权限。目标和发起方都有唯一的标识名称。必须知道启动器的唯一名称来配置 ACL。对于 open-iscsi 启动器,可在 /etc/iscsi/initiatorname.iscsi 中找到。

过程 25.5. 配置 ACL

  1. 移动到 acls 目录。
    /iscsi/iqn.20...mple:444/tpg1> acls/
  2. 创建 ACL。使用启动器上 /etc/iscsi/initiatorname.iscsi 中找到的启动器名称,或者使用更易于记住的名称,请参阅 第 25.2 节 “创建 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. 显示更改。
    /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)]
    

25.1.7. 通过以太网配置光纤通道(FCoE)目标

除了通过 FCoE 挂载 LUN 外,如 第 25.5 节 “通过以太网接口配置光纤通道” 所述,还支持通过 FCoE 将 LUN 导出到其它机器,并帮助 targetcli
重要
在继续操作前,请参阅 第 25.5 节 “通过以太网接口配置光纤通道” 并验证基本 FCoE 设置已完成,并且 fcoeadm -i 显示配置的 FCoE 接口。

过程 25.6. 配置 FCoE 目标

  1. 设置 FCoE 目标需要安装 targetcli 软件包,及其依赖项。有关 targetcli 基础知识和设置的详情,请参考 第 25.1 节 “目标设置”
  2. 在 FCoE 接口上创建 FCoE 目标实例。
    /> tcm_fc/ create 00:11:22:33:44:55:66:77
    如果系统上存在 FCoE 接口,则创建后相应的选项卡将列出可用的接口。如果没有,请确保 fcoeadm -i 显示活动的接口。
  3. 将后端存储映射到目标实例。

    例 25.1. 将后端存储映射到目标实例的示例

    /> tcm_fc/00:11:22:33:44:55:66:77
    /> luns/ create /backstores/fileio/example2
  4. 允许从 FCoE 启动器访问 LUN。
    /> acls/ create 00:99:88:77:66:55:44:33
    现在,LUN 应该可以被该启动器访问。
  5. 要使更改在重启后保留,请使用 saveconfig 命令,并在提示时输入 yes。如果没有这样做,则配置将在重新引导后丢失。
  6. 通过键入 exit 或输入 ctrl+D 退出 targetcli

25.1.8. 使用 targetcli删除对象

要删除后端存储,请使用以下命令:
/> /backstores/backstore-type/backstore-name
要删除 iSCSI 目标(如 ACL)的部分,请使用以下命令:
/> /iscsi/iqn-name/tpg/acls/ delete iqn-name
要删除整个目标,包括所有 ACL、LUN 和门户,请使用以下命令:
/> /iscsi delete iqn-name

25.1.9. targetcli 参考

有关 targetcli 的更多信息,请参阅以下资源:
man targetcli
targetcli 手册页。它包括示例步骤。
Linux SCSI Target Wiki
Andy Grover 的录屏
注意
这于 2012 年 2 月 28 日上传。因此,服务名称已从 targetcli 改为 target