我正在为基于ZFS的iSCSI目标实现VSS硬件提供商。我们已经实现了AreLunSupported, precommitsnapshot和commitsnapshot等功能,到目前为止,它工作得很好。但在此之后,它是失败的"VSS_E_NO_SNAPSHOTS_IMPORTED
"错误在LocateLun方法。我认为我们没有正确填写目标LUN信息。
我的问题是:
-
如何查找目标LUN序列号?我是否需要挂载新创建的快照然后获取序列号?
-
我们是否需要填充互连,存储标识符信息,或者我可以为这些传递NULL。
Q:如何查找目标LUN的序列号?我是否需要挂载新创建的快照然后获取序列号?
不,此时不应该挂载快照。您应该使用带外机制直接与您的存储通信(我假设您的"基于ZFS的iSCSI目标"来自NAS盒),可能是REST API调用,以找出快照的序列号。
让我详细说明一下快照的序列号:
- VSS期望"影子副本"是一个具体的、真实的卷,类似于主卷(在您的情况下是iSCSI目标)
-
由于您使用的是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快照回滚。