卷影子服务-如何在vss硬件提供程序中实现gettargetlun



我正在为基于ZFS的iSCSI目标实现VSS硬件提供商。我们已经实现了AreLunSupported, precommitsnapshot和commitsnapshot等功能,到目前为止,它工作得很好。但在此之后,它是失败的"VSS_E_NO_SNAPSHOTS_IMPORTED"错误在LocateLun方法。我认为我们没有正确填写目标LUN信息。

我的问题是:

  1. 如何查找目标LUN序列号?我是否需要挂载新创建的快照然后获取序列号?

  2. 我们是否需要填充互连,存储标识符信息,或者我可以为这些传递NULL。

Q:如何查找目标LUN的序列号?我是否需要挂载新创建的快照然后获取序列号?

不,此时不应该挂载快照。您应该使用带外机制直接与您的存储通信(我假设您的"基于ZFS的iSCSI目标"来自NAS盒),可能是REST API调用,以找出快照的序列号。

让我详细说明一下快照的序列号:

  1. VSS期望"影子副本"是一个具体的、真实的卷,类似于主卷(在您的情况下是iSCSI目标)
  2. 由于您使用的是ZFS快照,无需深入了解具体的实现,因此您有两个选项可以获取具体LUN的序列号:

    。如果您的存储允许将ZFS快照目录暴露为iSCSI目标,则创建该iSCSI目标并使用其Page83标识符

    b。如果没有,使用ZFS快照创建一个ZFS克隆,并将其公开为iSCSI目标,并使用其Page83标识符

问:我们是否需要填充互连,存储标识符信息也或者我可以为这些传递NULL

  • 出于所有实际目的,通常只需简单地复制原始源LUN的VDS_LUN_INFORMATION,并仅使用目标LUN的m_szSerialNumber字段编辑(假设产品ID,供应商ID等都保持不变)
  • 此链接详细解释了VSS硬件提供程序实现的期望:https://msdn.microsoft.com/en-us/library/windows/desktop/aa384600(v=vs.85).aspx

    Unique Page 83 Information

    原LUN和新创建的影子拷贝LUN都必须有在页83数据中至少有一个唯一存储标识符。至少一个STORAGE_IDENTIFIER,类型为1、2、3或8,一个STORAGE_IDENTIFIER关联值为0的LUN在原LUN和新LUN上不能重复已创建的影子拷贝LUN。

    额外的喋喋不休(回答到此结束):

    现在,上面的#2(b)可能会让人惊讶,因为您提前创建了一个克隆,而它还没有被使用。这样做的原因是,上述步骤需要在IVssHardwareSnapshotProvider::FillInLunInfo中执行,并且这个相同的VDS_LUN_INFORMATION内容稍后传递给IVssHardwareSnapshotProvider::LocateLuns (VSS试图告诉您定位您之前告诉它是影子拷贝lun的lun)。因此,无论将来是否使用克隆,都必须预先创建具体的LUN (iSCSI目标)。

    对此的一线希望是:如果您确信VSS请求者的工作流将永远不会挂载影子副本,那么您可以通过在IVssHardwareSnapshotProvider::FillInLunInfo期间在VDS_LUN_INFORMATION中伪造一些(有效)信息来摆脱这种情况。为此,您必须创建一个"可传输的"影子副本(VSS请求者使用VSS_CTX_FILE_SHARE_BACKUP | VSS_VOLSNAP_ATTR_TRANSPORTABLE标志)。这种影子副本的唯一用例是对其执行硬件重新同步,其中VSS硬件提供程序实现IVssHardwareSnapshotProvider::ResyncLuns方法并在其中执行ZFS快照回滚。

    相关内容

    • 没有找到相关文章

    最新更新