如何在vss硬件提供程序中实现GetTargetLUNs?

时间:2013-01-15 10:38:45

标签: volume-shadow-service

我正在为基于ZFS的iSCSI Target实施VSS硬件提供程序。我们已经实现了AreLunSupported,precommitsnapshot和commitsnapshot等功能,直到这一点它才能正常工作。但在此之后,它在LocateLun方法中出现“VSS_E_NO_SNAPSHOTS_IMPORTED”错误失败。我认为我们没有正确填写目标LUN信息。

我的问题是:

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

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

1 个答案:

答案 0 :(得分:1)

  

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

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

让我详细介绍快照的序列号

  1. VSS希望'影子副本'是一个具体的实际卷,类似于主卷(在您的情况下是一个iSCSI目标)
  2. 由于您使用的是ZFS快照,而没有详细介绍您的确切实现,因此您有2个选项可以获取具体LUN的序列号

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

    湾如果没有,请使用ZFS快照创建ZFS克隆,并将其公开为iSCSI目标并使用其标识符

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

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

        

      独特的信息

           

      原始LUN和新创建的卷影副本LUN都必须具有   页面83数据中的至少一个唯一存储标识符。至少   一个STORAGE_IDENTIFIER,类型为1,2,3或8,和   0的关联在原始LUN和新LUN上必须是唯一的   创建了影子复制LUN。

      加分聊天(此时答案结束):

      现在,上面的#2(b)可能引起人们的注意,因为你提前创建了一个克隆,但它还没有被使用。原因是,上述步骤需要在IVssHardwareSnapshotProvider::FillInLunInfo中执行,而此相同的VDS_LUN_INFORMATION内容稍后会传递给IVssHardwareSnapshotProvider::LocateLuns(VSS正试图告诉您可以找到之前告诉它的LUN是卷影副本LUN。因此,无论您将来是否将使用克隆,您必须预先创建的具体LUN(iSCSI目标)。

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