Как реализовать GetTargetLUNs в провайдере vss Hardware?

Я внедряю VSS Hardware провайдера для iSCSI Target на основе ZFS. Мы реализовали функции AreLunSupported, precommitsnapshot, commitsnapshot и т. Д., И до этого момента они работали нормально. Но после этого он терпит неудачу сVSS_E_NO_SNAPSHOTS_IMPORTED"ошибка в методе LocateLun. и я думаю, что мы не заполняем информацию о целевом LUN должным образом.

Мои вопросы:

  1. Как найти серийный номер целевого LUN? Нужно ли монтировать только что созданный снимок, а затем получить серийный номер?

  2. Нужно ли нам также заполнять информацию о соединении, идентификаторе хранилища или я могу просто передать NULL для них.

1 ответ

Q: Как найти серийный номер целевого LUN? Нужно ли монтировать только что созданный снимок, а затем получить серийный номер?

Нет, вы не должны монтировать снимок на этом этапе. Вы должны использовать внеполосный механизм для прямой связи с вашим хранилищем (я предполагаю, что ваша "цель iSCSI на основе ZFS" поступает из коробки NAS), вероятно, вызовом REST API, чтобы выяснить серийный номер снимок.

Позвольте мне подробнее рассказать о серийном номере снимка:

  1. VSS ожидает, что "теневая копия" будет конкретным, реальным томом, похожим на основной том (в вашем случае цель iSCSI)
  2. Поскольку вы используете моментальные снимки ZFS, не вдаваясь в подробности своей реализации, у вас есть 2 варианта получения серийного номера для конкретного LUN:

    а. Если ваше хранилище позволяет отображать каталог моментальных снимков ZFS в качестве цели iSCSI, создайте эту цель iSCSI и используйте ее идентификатор Page83

    б. Если нет, создайте клон ZFS с помощью снимка ZFS и представьте его как цель iSCSI и используйте его идентификатор Page83

Вопрос: Нужно ли нам также заполнять информацию о соединении, идентификаторе хранилища или я могу просто передать NULL для них.

  1. Для всех практических целей обычно достаточно просто скопировать 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 в нем.

Другие вопросы по тегам