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 配置公开给多个客户机。
先决条件
在使用 SCSI 设备创建基于 vHBA 的存储池前,先创建一个 vHBA:
过程 13.10. 创建 vHBA
在主机系统中找到 HBA
要在主机系统中找到 HBA,请使用 virsh nodedev-list --cap vports 命令。以下示例显示了支持 vHBA 的两个 HBA 的主机:# virsh nodedev-list --cap vports scsi_host3 scsi_host4
检查 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 后更新。创建 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 上游页面。在 vHBA 主机设备中创建新 vHBA
要基于 vhba_host3 创建 vHBA,请使用 virsh nodedev-create 命令:# virsh nodedev-create vhba_host3.xml Node device scsi_host5 created from vhba_host3.xml
验证 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 的存储池。
描述 | XML | pool-define-as |
---|---|---|
存储池的类型 | <pool type='scsi'> | scsi |
存储池的名称 | <name>name</name> | --adapter-name name |
vHBA 的标识符。父 属性为可选。 |
<source> |
[--adapter-parent parent] |
指定目标的路径。这将是用于存储池的路径。 |
<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_hostN
与 vports
和 max_vports
属性相结合,以完成父项识别。parent
、parent_wwnn
、parent_wwpn
或 parent_fabric_wwn
属性提供在主机重启后使用相同的 HBA 的不同保证程度。
- 如果没有指定
parent
,libvirt 将使用支持 NPIV 的第一个scsi_hostN
适配器。 - 如果只指定
parent
,则在配置中添加额外的 SCSI 主机适配器时会出现问题。 - 如果指定了
parent_wwnn
或parent_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_wwnn
、parent_wwpn
或 parent_fabric_wwn
属性的方法。
配置虚拟机以使用 vHBA LUN
为 vHBA 创建存储池后,必须将 vHBA LUN 添加到虚拟机配置中。
- 在虚拟机 XML 的虚拟机中创建一个磁盘卷。
- 在
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 的存储”。