Red Hat Training

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

13.3.6.3. 在客户机中添加基于 SCSI LUN 的存储

可以通过多种方式向客户机公开主机 SCSI LUN。将 SCSI LUN 公开给客户机提供了在客户机上直接向 LUN 执行 SCSI 命令的能力。这可很有用,作为在客户机间共享 LUN 的方法,并在主机之间共享光纤通道存储。
有关基于 SCSI LUN 的存储的详情,请参考使用 SCSI 设备 的基于 vHBA 的存储池
重要
可选的 sgio 属性控制是否为 device='lun' 磁盘过滤非特权 SCSI Generical I/O(SG_IO)命令。sgio 属性可以指定为 'filtered''unfiltered',但必须设置为 'unfiltered' 以允许 SG_IO ioctl 命令在持久预留中通过客户端传递命令。
除了设置 sgio='unfiltered' 外,必须将 <shareable> 元素设置为在客户机间共享 LUN。如果没有指定 sgio 属性,则默认为 'filtered'
<disk> XML 属性 device='lun' 可用于以下客户机磁盘配置:
  • type='block' for <source dev='/dev/disk/by-{path|id|uuid|label}'/>
    <disk type='block' device='lun' sgio='unfiltered'>
      <driver name='qemu' type='raw'/>
      <source dev='/dev/disk/by-path/pci-0000\:04\:00.1-fc-0x203400a0b85ad1d7-lun-0'/>
      <target dev='sda' bus='scsi'/>
      <shareable/>
    </disk>
    注意
    <source> 设备名称中的冒号前的反斜杠是必需的。
  • type='network' for <source protocol='iscsi'... />
    <disk type='network' device='lun' sgio='unfiltered'>
      <driver name='qemu' type='raw'/>
      <source protocol='iscsi' name='iqn.2013-07.com.example:iscsi-net-pool/1'>
        <host name='example.com' port='3260'/>
        <auth username='myuser'>
          <secret type='iscsi' usage='libvirtiscsi'/>
        </auth>
      </source>
      <target dev='sda' bus='scsi'/>
      <shareable/>
    </disk>
  • 当使用 iSCSI 或 NPIV/vHBA 源池作为 SCSI 源池时,type='volume'
    以下示例 XML 显示使用 iSCSI 源池(名为 iscsi-net-pool)作为 SCSI 源池的客户机:
    <disk type='volume' device='lun' sgio='unfiltered'>
      <driver name='qemu' type='raw'/>
      <source pool='iscsi-net-pool' volume='unit:0:0:1' mode='host'/>
      <target dev='sda' bus='scsi'/>
      <shareable/>
    </disk>
    注意
    <source> 标签中的 mode= 选项是可选的,但如果使用,则必须设置为 'host',而不是 'direct'。当设置为 "host" 时,libvirt 将找到本地主机上设备的路径。当设置为 "直接" 时,libvirt 将使用源池的来源主机数据生成到设备的路径。
    上面示例中的 iSCSI 池(iscsi-net-pool)将具有类似如下的配置:
    # virsh pool-dumpxml iscsi-net-pool
    <pool type='iscsi'>
      <name>iscsi-net-pool</name>
      <capacity unit='bytes'>11274289152</capacity>
      <allocation unit='bytes'>11274289152</allocation>
      <available unit='bytes'>0</available>
      <source>
        <host name='192.168.122.1' port='3260'/>
        <device path='iqn.2013-12.com.example:iscsi-chap-netpool'/>
        <auth type='chap' username='redhat'>
          <secret usage='libvirtiscsi'/>
        </auth>
      </source>
      <target>
        <path>/dev/disk/by-path</path>
        <permissions>
          <mode>0755</mode>
        </permissions>
      </target>
    </pool>
    要验证 iSCSI 源池中的可用 LUN 的详情,请输入以下命令:
    # virsh vol-list iscsi-net-pool
    Name                 Path
    ------------------------------------------------------------------------------
    unit:0:0:1           /dev/disk/by-path/ip-192.168.122.1:3260-iscsi-iqn.2013-12.com.example:iscsi-chap-netpool-lun-1
    unit:0:0:2           /dev/disk/by-path/ip-192.168.122.1:3260-iscsi-iqn.2013-12.com.example:iscsi-chap-netpool-lun-2
  • 当使用 NPIV/vHBA 源池作为 SCSI 源池时,type='volume'
    以下示例 XML 显示使用 NPIV/vHBA 源池(名为 vhbapool_host3)作为 SCSI 源池的客户机:
    <disk type='volume' device='lun' sgio='unfiltered'>
      <driver name='qemu' type='raw'/>
      <source pool='vhbapool_host3' volume='unit:0:1:0'/>
      <target dev='sda' bus='scsi'/>
      <shareable/>
    </disk>
    上例中的 NPIV/vHBA 池(vhbapool_host3)将具有类似的配置:
    # virsh pool-dumpxml vhbapool_host3
    <pool type='scsi'>
      <name>vhbapool_host3</name>
      <capacity unit='bytes'>0</capacity>
      <allocation unit='bytes'>0</allocation>
      <available unit='bytes'>0</available>
      <source>
        <adapter type='fc_host' parent='scsi_host3' managed='yes' wwnn='5001a4a93526d0a1' wwpn='5001a4ace3ee045d'/>
      </source>
      <target>
        <path>/dev/disk/by-path</path>
        <permissions>
          <mode>0700</mode>
          <owner>0</owner>
          <group>0</group>
        </permissions>
      </target>
    </pool>
    要验证 vHBA 上可用 LUN 的详情,请输入以下命令:
    # virsh vol-list vhbapool_host3
    Name                 Path
    ------------------------------------------------------------------------------
    unit:0:0:0           /dev/disk/by-path/pci-0000:10:00.0-fc-0x5006016044602198-lun-0
    unit:0:1:0           /dev/disk/by-path/pci-0000:10:00.0-fc-0x5006016844602198-lun-0
    有关在 SCSI 设备中使用 NPIV vHBA 的详情,请参考 第 13.2.3.8 节 “使用 SCSI 设备使用基于 vHBA 的存储池”
以下流程演示了在客户机中添加基于 SCSI LUN 的存储设备的示例。以上 <disk device='lun'> 客户机磁盘配置都可以使用这个方法附加。根据您的环境替换配置。

过程 13.13. 将基于 SCSI LUN 的存储附加到客户端

  1. 通过在新文件中写入 <disk> 元素来创建设备文件,并使用 XML 扩展(本例中为 sda.xml)保存此文件:
    # cat sda.xml
    <disk type='volume' device='lun' sgio='unfiltered'>
      <driver name='qemu' type='raw'/>
      <source pool='vhbapool_host3' volume='unit:0:1:0'/>
      <target dev='sda' bus='scsi'/>
      <shareable/>
    </disk>
  2. sda.xml 中创建的设备与您的虚拟客户机相关联(例如:
    # virsh attach-device --config Guest1 ~/sda.xml
    注意
    使用 --config 选项运行 virsh attach-device 命令,需要 guest reboot 将设备永久添加到客户端。或者,可以使用 --persistent 选项而不是 --config,它也可用于将设备热插到客户机中。
另外,可使用 virt-manager 在客户机中附加或配置基于 SCSI LUN 的存储。要使用 virt-manager 进行配置,请点击 Add Hardware 按钮并添加带有所需参数的虚拟磁盘,或者从此窗口中更改现有 SCSI LUN 设备的设置。在 Red Hat Enterprise Linux 7.2 及更高版本中,SGIO 值也可以在 virt-manager 中配置:

图 13.21. 使用 virt-manager 配置 SCSI LUN 存储

使用 virt-manager 配置 SCSI LUN 存储

硬件失败后重新连接到公开的 LUN

如果因为硬件失败(如主机总线适配器),与公开的光纤通道(FC)LUN 的连接会丢失,则客户机上公开的 LUN 也可能会继续显示为故障,即使硬件故障也是如此。要防止这种情况,请编辑 dev_loss_tmofast_io_fail_tmo 内核选项:
  • dev_loss_tmo 控制 SCSI 层在将 SCSI 设备标记为失败前等待的时间。要防止超时,建议将 选项设置为最大值,即 2147483647
  • fast_io_fail_tmo 控制 SCSI 层在失败的 SCSI 设备失败后等待多久,然后再返回 I/O。为确保内核不忽略 dev_loss_tmo,请将这个选项的值设置为小于 dev_loss_tmo 的值的任意数值。
要修改 dev_loss_tmofast_io_fail 的值,请执行以下操作之一:
  • 编辑 /etc/multipath.conf 文件,并在 defaults 部分中设置值:
    defaults {
    ...
    fast_io_fail_tmo     20
    dev_loss_tmo    infinity
    }
    
  • 在 FC 主机或远程端口级别设置 dev_loss_tmofast_io_fail,例如:
    # echo 20 > /sys/devices/pci0000:00/0000:00:06.0/0000:13:00.0/host1/rport-1:0-0/fc_remote_ports/rport-1:0-0/fast_io_fail_tmo
    # echo 2147483647 > /sys/devices/pci0000:00/0000:00:06.0/0000:13:00.0/host1/rport-1:0-0/fc_remote_ports/rport-1:0-0/dev_loss_tmo
要验证 dev_loss_tmofast_io_fail 的新值是否活跃,请使用以下命令:
# find /sys -name dev_loss_tmo -print -exec cat {} \;
如果正确设置了参数,输出将类似如下,使用适当的设备或设备而不是 pci0000:00/0000:00:06.0/0000:13:00.0/host1/rport-1:0-0/fc_remote_ports/rport-1:0-0:
# find /sys -name dev_loss_tmo -print -exec cat {} \;
...
/sys/devices/pci0000:00/0000:00:06.0/0000:13:00.0/host1/rport-1:0-0/fc_remote_ports/rport-1:0-0/dev_loss_tmo
2147483647
...