问:如何查找目标 LUN 的序列号?我需要挂载新创建的快照然后获取序列号吗?
不,此时您不应挂载快照。您应该使用带外机制直接与您的存储通信(我假设您的“基于 ZFS 的 iSCSI 目标”来自 NAS 盒),可能是 REST API 调用,以找出序列号快照。
让我详细说明一下快照的序列号:
- VSS 期望“卷影副本”是一个具体的真实卷,类似于主卷(在您的情况下是 iSCSI 目标)
由于您使用的是 ZFS 快照,因此无需过多关注您的具体实现,您有 2 个选项来获取具体 LUN的序列号:
一个。如果您的存储允许将 ZFS 快照目录公开为 iSCSI 目标,则创建该 iSCSI 目标并使用其 Page83 标识符
湾。如果不是,请使用 ZFS 快照创建 ZFS 克隆并将其公开为 iSCSI 目标并使用其 Page83 标识符
问:我们是否还需要填写互连、存储标识符信息,或者我可以只为这些传递 NULL。
- 出于所有实际目的,通常只需复制
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_INFORMATION
during 中伪造一些(有效)信息来避免这种情况IVssHardwareSnapshotProvider::FillInLunInfo
。为此,您必须创建一个“可传输”卷影副本(VSS 请求者使用这些VSS_CTX_FILE_SHARE_BACKUP | VSS_VOLSNAP_ATTR_TRANSPORTABLE
标志)。这种卷影副本的唯一用例是对其执行硬件重新同步,其中 VSS 硬件提供程序实现该IVssHardwareSnapshotProvider::ResyncLuns
方法并在其中执行 ZFS 快照回滚。