我正在为基于ZFS的iSCSI Target实施VSS硬件提供程序。我们已经实现了AreLunSupported,precommitsnapshot和commitsnapshot等功能,直到这一点它才能正常工作。但在此之后,它在LocateLun方法中出现“VSS_E_NO_SNAPSHOTS_IMPORTED
”错误失败。我认为我们没有正确填写目标LUN信息。
我的问题是:
如何查找目标LUN的序列号?我是否需要挂载新创建的快照然后获取序列号?
我们是否还需要填写互连,存储标识符信息,或者我可以为这些信息传递NULL。
答案 0 :(得分:1)
问:如何查找目标LUN的序列号?我是否需要挂载新创建的快照然后获取序列号?
不,此时不应安装快照。您应该使用带外机制直接与存储通信(我假设您的基于ZFS的iSCSI目标来自NAS盒),可能是REST API调用,弄清楚快照的序列号。
让我详细介绍快照的序列号:
由于您使用的是ZFS快照,而没有详细介绍您的确切实现,因此您有2个选项可以获取具体LUN的序列号:
一个。如果您的存储允许将ZFS快照目录公开为iSCSI目标,则创建该iSCSI目标并使用其标识符
湾如果没有,请使用ZFS快照创建ZFS克隆,并将其公开为iSCSI目标并使用其标识符
问:我们是否还需要填写互连,存储标识符信息 或者我可以为这些传递NULL。
VDS_LUN_INFORMATION
并仅编辑m_szSerialNumber
字段与目标LUN的字段(假设产品ID,供应商ID)等等都将保持不变)此链接详细说明了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快照回滚。