Как реализовать GetTargetLUNs в провайдере vss Hardware?
Я внедряю VSS Hardware провайдера для iSCSI Target на основе ZFS. Мы реализовали функции AreLunSupported, precommitsnapshot, commitsnapshot и т. Д., И до этого момента они работали нормально. Но после этого он терпит неудачу сVSS_E_NO_SNAPSHOTS_IMPORTED
"ошибка в методе LocateLun. и я думаю, что мы не заполняем информацию о целевом LUN должным образом.
Мои вопросы:
Как найти серийный номер целевого LUN? Нужно ли монтировать только что созданный снимок, а затем получить серийный номер?
Нужно ли нам также заполнять информацию о соединении, идентификаторе хранилища или я могу просто передать NULL для них.
1 ответ
Q: Как найти серийный номер целевого LUN? Нужно ли монтировать только что созданный снимок, а затем получить серийный номер?
Нет, вы не должны монтировать снимок на этом этапе. Вы должны использовать внеполосный механизм для прямой связи с вашим хранилищем (я предполагаю, что ваша "цель iSCSI на основе ZFS" поступает из коробки NAS), вероятно, вызовом REST API, чтобы выяснить серийный номер снимок.
Позвольте мне подробнее рассказать о серийном номере снимка:
- VSS ожидает, что "теневая копия" будет конкретным, реальным томом, похожим на основной том (в вашем случае цель iSCSI)
Поскольку вы используете моментальные снимки ZFS, не вдаваясь в подробности своей реализации, у вас есть 2 варианта получения серийного номера для конкретного LUN:
а. Если ваше хранилище позволяет отображать каталог моментальных снимков ZFS в качестве цели iSCSI, создайте эту цель iSCSI и используйте ее идентификатор Page83
б. Если нет, создайте клон ZFS с помощью снимка ZFS и представьте его как цель iSCSI и используйте его идентификатор Page83
Вопрос: Нужно ли нам также заполнять информацию о соединении, идентификаторе хранилища или я могу просто передать NULL для них.
- Для всех практических целей обычно достаточно просто скопировать
VDS_LUN_INFORMATION
для исходного источника LUN и редактировать толькоm_szSerialNumber
поле с тем из целевого LUN (при условии, что идентификатор продукта, идентификатор поставщика и т. д. все останутся прежними)
Эта ссылка подробно объясняет, что ожидается от реализации VSS Hardware Provider: https://msdn.microsoft.com/en-us/library/windows/desktop/aa384600(v=vs.85).aspx
Уникальная информация
И исходный LUN, и только что созданный LUN теневой копии должны иметь как минимум один уникальный идентификатор хранилища в данных на странице. По крайней мере один STORAGE_IDENTIFIER с типом 1, 2, 3 или 8 и связью 0 должен быть уникальным для исходного LUN и вновь созданной теневой копии LUN.
Бонусная болтовня (Ответ заканчивается на этом):
Теперь #2(b) выше может вызвать удивление, так как вы создаете клон заранее, и он еще не используется. Причина в том, что вышеуказанные шаги должны быть выполнены в IVssHardwareSnapshotProvider::FillInLunInfo
и это то же самое VDS_LUN_INFORMATION
содержимое передается позже IVssHardwareSnapshotProvider::LocateLuns
(VSS пытается сказать вам, чтобы найти LUN, которые вы ранее сказали, что это LUN теневой копии). Следовательно, независимо от того, будете ли вы использовать клон в будущем или нет, у вас должен быть заранее создан конкретный LUN (цель iSCSI).
Серебряная подкладка к этому: если вы уверены, что рабочий процесс VSS Requestor никогда не смонтирует теневую копию, то вы можете избежать этого, подделав некоторую (действительную) информацию в VDS_LUN_INFORMATION
в течение IVssHardwareSnapshotProvider::FillInLunInfo
, Чтобы это работало, вам нужно будет создать "транспортабельную" теневую копию (запросчик VSS использует VSS_CTX_FILE_SHARE_BACKUP | VSS_VOLSNAP_ATTR_TRANSPORTABLE
флаги). Единственный вариант использования такой теневой копии - выполнить аппаратную повторную синхронизацию, в которой поставщик оборудования VSS реализует IVssHardwareSnapshotProvider::ResyncLuns
метод и выполняет откат снимка ZFS в нем.