【问题标题】:How to implement GetTargetLUNs in vss Hardware provider?如何在 vss 硬件提供商中实现 GetTargetLUNs?
【发布时间】:2024-04-20 19:20:01
【问题描述】:

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

我的问题是:

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

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

【问题讨论】:

    标签: volume-shadow-service


    【解决方案1】:

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

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

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

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

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

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

    Q:是否还需要填写interconnect,storage identifier信息 或者我可以只为这些传递 NULL。

    1. 出于所有实际目的,通常只需复制原始源 LUN 的 VDS_LUN_INFORMATION 并仅使用目标 LUN 的 m_szSerialNumber 字段编辑即可(假设产品 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 的 STORAGE_IDENTIFIER,以及一个 0 的关联在原始 LUN 和新 LUN 上必须是唯一的 已创建卷影副本 LUN。

    额外的闲聊(回答到此结束):

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

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

    【讨论】:

    • 在可传输备份的情况下,我创建了一个 zfs 快照,并且快照名称基于提交快照期间的 snapId(影子 id),在重新同步中我没有得到关于 snapId 的任何信息,我得到只有使用它的 lun 信息我才能恢复快照名称
    最近更新 更多