13.2.3.8. 使用 SCSI 设备使用基于 vHBA 的存储池


注意
您不能使用 Virtual Machine Manager 使用 SCSI 设备创建基于 vHBA 的存储池。
建议
N_Port ID 虚拟化(NPIV)是一种软件技术,允许共享单一物理光纤通道主机总线适配器(HBA)。这样,多个虚拟机可以从多个物理主机查看相同的存储,因而能轻松查看存储的迁移路径。因此,只要指定了正确的存储路径,迁移不需要创建或复制存储。
在虚拟化中,虚拟主机总线适配器vHBA 控制虚拟机的逻辑单元号(LUN)。要使主机在多个 KVM 虚拟机间共享一个光纤通道设备路径,必须为每个虚拟机创建一个 vHBA。多个 KVM 客户机不得使用单个 vHBA。
NPIV 的每个 vHBA 都由其父 HBA 以及自己的 World Wide Node Name(WWN)和 World Wide Port Name(WWPN)标识。存储的路径由 WWNN 和 WWPN 值决定。父 HBA 可以定义为 scsi_host# 或 WWN/WWPN 对。
注意
如果父 HBA 定义为 scsi_host# ,且硬件添加到主机计算机,scsi_host#分配可能会改变。因此,建议您使用 WWNN/WWPN 对定义父 HBA。
建议您基于 vHBA 定义 libvirt 存储池,因为这会保留 vHBA 配置。
使用 libvirt 存储池有两个主要优点:
  • libvirt 代码可使用 virsh 命令输出轻松查找 LUN 路径。
  • 虚拟机迁移只需要在目标机器上定义和启动具有相同 vHBA 名称的存储池。要做到这一点,在虚拟机 XML 配置中必须指定 vHBA LUN、libvirt 存储池和卷名称。例如,请参阅 第 13.2.3.8 节 “使用 SCSI 设备使用基于 vHBA 的存储池”
注意
在创建 vHBA 前,建议您在主机 LUN 中配置存储阵列(SAN)侧 zoning,以提供客户机之间的隔离,并防止数据崩溃的可能性。
要创建持久的 vHBA 配置,首先使用以下格式创建一个 libvirt 'scsi' 存储池 XML 文件。当创建一个使用同一物理 HBA 中的存储池的 vHBA 时,建议为 <path> 值使用一个稳定的位置,比如系统中的 /dev/disk/by-{path|id|uuid|label} 位置之一。
当创建多个使用同一物理 HBA 中的存储池的 vHBA 时,<path> 字段的值只能是 /dev/,否则存储池卷只对其中一个 vHBA 可见,主机中的设备无法通过 NPIV 配置公开给多个客户机。
有关 <path><target> 中的元素的更多信息,请参阅 上游 libvirt 文档
先决条件
在使用 SCSI 设备创建基于 vHBA 的存储池前,先创建一个 vHBA:

过程 13.10. 创建 vHBA

  1. 在主机系统中找到 HBA

    要在主机系统中找到 HBA,请使用 virsh nodedev-list --cap vports 命令。
    以下示例显示了支持 vHBA 的两个 HBA 的主机:
    # virsh nodedev-list --cap vports
    scsi_host3
    scsi_host4
    
  2. 检查 HBA 的详情

    使用 virsh nodedev-dumpxml HBA_device 命令查看 HBA 的详情。
    # virsh nodedev-dumpxml scsi_host3
    命令的输出列出了用于创建 vHBA 的 <name><wwnn><wwpn> 字段。<max_vports> 显示支持的 vHBA 的最大数量。例如:
    <device>
      <name>scsi_host3</name>
      <path>/sys/devices/pci0000:00/0000:00:04.0/0000:10:00.0/host3</path>
      <parent>pci_0000_10_00_0</parent>
      <capability type='scsi_host'>
        <host>3</host>
        <unique_id>0</unique_id>
        <capability type='fc_host'>
          <wwnn>20000000c9848140</wwnn>
          <wwpn>10000000c9848140</wwpn>
          <fabric_wwn>2002000573de9a81</fabric_wwn>
        </capability>
        <capability type='vport_ops'>
          <max_vports>127</max_vports>
          <vports>0</vports>
        </capability>
      </capability>
    </device>
    在这个示例中,<max_vports> 值显示可在 HBA 配置中使用总计 127 个虚拟端口。<vports> 值显示当前使用的虚拟端口数。这些值在创建 vHBA 后更新。
  3. 创建 vHBA 主机设备

    为 vHBA 主机创建类似如下的 XML 文件。在本例中,该文件名为 vhba_host3.xml
    这个示例使用 scsi_host3 来描述父 vHBA。
    # cat vhba_host3.xml
    <device>
      <parent>scsi_host3</parent>
      <capability type='scsi_host'>
        <capability type='fc_host'>
        </capability>
      </capability>
    </device>
    这个示例使用 WWNN/WWPN 对描述父 vHBA。
    # cat vhba_host3.xml
    <device>
      <name>vhba</name>
      <parent wwnn='20000000c9848140' wwpn='10000000c9848140'/>
      <capability type='scsi_host'>
        <capability type='fc_host'>
        </capability>
      </capability>
    </device>
    注意
    WWNN 和 WWPN 值必须与 过程 13.10, “创建 vHBA” 中所示的 HBA 详情中的值匹配。
    <parent> 字段指定要与这个 vHBA 设备关联的 HBA 设备。<device> 标签中的详情在下一步中使用来为主机创建新 vHBA 设备。有关 nodedev XML 格式的详情,请查看 libvirt 上游页面
  4. 在 vHBA 主机设备中创建新 vHBA

    要基于 vhba_host3 创建 vHBA,请使用 virsh nodedev-create 命令:
    # virsh nodedev-create vhba_host3.xml
    Node device scsi_host5 created from vhba_host3.xml
  5. 验证 vHBA

    使用 virsh nodedev-dumpxml 命令验证新的 vHBA 的详情(scsi_host5):
    # virsh nodedev-dumpxml scsi_host5
    <device>
      <name>scsi_host5</name>
      <path>/sys/devices/pci0000:00/0000:00:04.0/0000:10:00.0/host3/vport-3:0-0/host5</path>
      <parent>scsi_host3</parent>
      <capability type='scsi_host'>
        <host>5</host>
        <unique_id>2</unique_id>
        <capability type='fc_host'>
          <wwnn>5001a4a93526d0a1</wwnn>
          <wwpn>5001a4ace3ee047d</wwpn>
          <fabric_wwn>2002000573de9a81</fabric_wwn>
        </capability>
      </capability>
    </device>
验证 vHBA 后,继续使用 定义存储池 的存储池
参数
下表提供了 XML 文件、virsh pool-define-as 命令和 Virtual Machine Manager 应用程序所需的参数列表,用于创建基于 vHBA 的存储池。
表 13.8. 基于 vHBA 的存储池参数
描述XMLpool-define-as
存储池的类型 <pool type='scsi'> scsi
存储池的名称 <name>name</name> --adapter-name name
vHBA 的标识符。 属性为可选。

<source>
  <adapter type='fc_host'
  [parent=parent_scsi_device]
  wwnn='WWNN'
  wwpn='WWPN' />
</source>

[--adapter-parent parent]
--adapter-wwnn wwnn
--adapter-wpnn wwpn

指定目标的路径。这将是用于存储池的路径。

<target>
  <path>target_path</path>
</target>

目标 path_to_pool
重要
<path> 字段是 /dev/ 时,libvirt 为卷设备路径生成唯一的短设备路径。例如: /dev/sdc。否则会使用物理主机路径。例如: /dev/disk/by-path/pci-0000:10:00.0-fc-0x5006016044602198-lun-0。唯一的短设备路径允许多个存储池在多个客户机中列出同一个卷。如果多个虚拟机使用了物理主机路径,则可能会出现重复的设备类型警告。
注意
parent 属性可以在 <adapter> 字段中使用它来识别不同路径可使用 NPIV LUN 的物理 HBA 父父项。此字段 scsi_hostNvportsmax_vports 属性相结合,以完成父项识别。parentparent_wwnnparent_wwpnparent_fabric_wwn 属性提供在主机重启后使用相同的 HBA 的不同保证程度。
  • 如果没有指定 parentlibvirt 将使用支持 NPIV 的第一个 scsi_hostN 适配器。
  • 如果只指定 parent,则在配置中添加额外的 SCSI 主机适配器时会出现问题。
  • 如果指定了 parent_wwnnparent_wwpn,则在主机重启后使用相同的 HBA。
  • 如果使用 parent_fabric_wwn,在主机重启同一光纤中的 HBA 后,无论使用的 scsi_hostN 是什么,都会选择同一光纤中的 HBA。
如果您使用 virsh 创建存储池,请继续 验证存储池是否已创建
示例
以下是基于 vHBA 的存储池的 XML 文件示例。第一个示例是 HBA 中唯一存储池的存储池示例。第二个示例是存储池之一,它是使用多个存储池之一,它使用单个 vHBA 并使用 parent 属性来识别 SCSI 主机设备。
<pool type='scsi'>
  <name>vhbapool_host3</name>
  <source>
    <adapter type='fc_host' wwnn='5001a4a93526d0a1' wwpn='5001a4ace3ee047d'/>
  </source>
  <target>
    <path>/dev/disk/by-path</path>
  </target>
</pool>
<pool type='scsi'>
  <name>vhbapool_host3</name>
  <source>
    <adapter type='fc_host' parent='scsi_host3' wwnn='5001a4a93526d0a1' wwpn='5001a4ace3ee047d'/>
  </source>
  <target>
    <path>/dev/disk/by-path</path>
  </target>
</pool>
以下是创建基于 vHBA 的存储池的命令示例:
# virsh pool-define-as vhbapool_host3 scsi --adapter-parent scsi_host3 --adapter-wwnn 5001a4a93526d0a1 --adapter-wwpn 5001a4ace3ee047d --target /dev/disk/by-path
Pool vhbapool_host3 defined
注意
virsh 命令不提供定义 parent_wwnnparent_wwpnparent_fabric_wwn 属性的方法。
配置虚拟机以使用 vHBA LUN
为 vHBA 创建存储池后,必须将 vHBA LUN 添加到虚拟机配置中。
  1. 在虚拟机 XML 的虚拟机中创建一个磁盘卷。
  2. storage pool 参数中指定 storage volume<source>
以下示例显示了:
<disk type='volume' device='disk'>
  <driver name='qemu' type='raw'/>
  <source pool='vhbapool_host3' volume='unit:0:4:0'/>
  <target dev='hda' bus='ide'/>
</disk>
指定 lun 设备而不是 disk,请参阅以下示例:
<disk type='volume' device='lun' sgio='unfiltered'>
  <driver name='qemu' type='raw'/>
  <source pool='vhbapool_host3' volume='unit:0:4:0' mode='host'/>
  <target dev='sda' bus='scsi'/>
  <shareable />
</disk>
有关在客户机中添加基于 SCSI LUN 的存储的 XML 配置示例,请参考 第 13.3.6.3 节 “在客户机中添加基于 SCSI LUN 的存储”
请注意,为了确保在硬件故障时确保成功连接到 LUN,建议您编辑 fast_io_fail_tmodev_loss_tmo 选项。如需更多信息,请参阅在硬件故障后重新连接到公开的 LUN
Red Hat logoGithubRedditYoutubeTwitter

学习

尝试、购买和销售

社区

关于红帽文档

通过我们的产品和服务,以及可以信赖的内容,帮助红帽用户创新并实现他们的目标。

让开源更具包容性

红帽致力于替换我们的代码、文档和 Web 属性中存在问题的语言。欲了解更多详情,请参阅红帽博客.

關於紅帽

我们提供强化的解决方案,使企业能够更轻松地跨平台和环境(从核心数据中心到网络边缘)工作。

© 2024 Red Hat, Inc.