2

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

我的问题是:

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

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

4

1 回答 1

1

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

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

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

  1. VSS 期望“卷影副本”是一个具体的真实卷,类似于主卷(在您的情况下是 iSCSI 目标)
  2. 由于您使用的是 ZFS 快照,因此无需过多关注您的具体实现,您有 2 个选项来获取具体 LUN的序列号:

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

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

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

  1. 出于所有实际目的,通常只需复制VDS_LUN_INFORMATION原始源 LUN 的字段并仅m_szSerialNumber使用目标 LUN 的字段编辑字段即可(假设产品 ID、供应商 ID 等都保持不变)

此链接详细解释了 VSS 硬件提供程序实现的预期内容:https ://msdn.microsoft.com/en-us/library/windows/desktop/aa384600(v=vs.85).aspx

独特的第 83 页信息

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

额外的喋喋不休(答案在此结束):

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

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

于 2015-01-31T06:48:06.593 回答