Поделиться через


Использование автоматического восстановления системы VSS для аварийного восстановления

Приложение резервного копирования и восстановления VSS, которое выполняет аварийное восстановление (также называемое восстановлением на 'голое железо'), может использовать модуль автоматического восстановления системы (ASR) вместе со средой предустановки Windows (Windows PE) для резервного копирования и восстановления важнейших томов и других компонентов загрузочного состояния системы. Приложение для резервного копирования реализуется как запрос VSS.

Примечание Приложения, использующие ASR, должны лицензировать Windows PE.

Windows Server 2003 и Windows XP: ASR не реализован в качестве средства записи VSS.

Сведения о средствах трассировки, которые можно использовать с ASR, см. в разделе о использовании средств трассировки с приложениями VSS ASR.

В этой статье:

Общие сведения о задачах этапа резервного копирования

Во время резервного копирования запрашиватель выполняет следующие действия.

Заметка

Все шаги требуются, если иное не указано.

 

  1. Вызовите функциюCreateVssBackupComponents, чтобы создать экземпляр интерфейса IVssBackupComponents и вызвать метод IVssBackupComponents::InitializeForBackup для инициализации экземпляра для управления резервной копией.

  2. Вызовите IVssBackupComponents::SetContext, чтобы задать контекст для операции теневого копирования.

  3. Вызовите IVssBackupComponents::SetBackupState для настройки резервной копии. Задайте параметру bBackupBootableSystemState значение true, чтобы указать, что резервная копия будет включать загрузочное состояние системы.

  4. Выберите критически важные компоненты в документе метаданных записи ASR для резервного копирования и вызова IVssBackupComponents::AddComponent для каждого из них.

  5. Вызовите IVssBackupComponents::StartSnapshotSet, чтобы создать новый пустой набор теней.

  6. Вызовите IVssBackupComponents::GatherWriterMetadata, чтобы инициировать асинхронный контакт с модулями записи.

  7. Вызовите IVssBackupComponents::GetWriterMetadata, чтобы получить документ метаданных писателя ASR. Идентификатор писателя для ASR-писателя — BE000CBE-11FE-4426-9C58-531AA6355FC4, а строка имени писателя — "ASR Writer".

  8. Вызовите IVssExamineWriterMetadata::SaveAsXML, чтобы сохранить копию документа метаданных писателя ASR.

  9. Вызовите IVssBackupComponents::AddToSnapshotSet для каждого тома, который может участвовать в теневых копиях, чтобы добавить его в набор теневых копий.

  10. Вызовите IVssBackupComponents::PrepareForBackup, чтобы уведомить писателей о подготовке к операции резервного копирования.

  11. Вызовите IVssBackupComponents::GatherWriterStatus и IVssBackupComponents::GetWriterStatus (или IVssBackupComponentsEx3::GetWriterStatus) для проверки состояния писателя ASR.

  12. На этом этапе можно запросить сообщения об ошибках, заданные средством записи в методе CVssWriter::OnPrepareBackup. Пример кода, демонстрирующий просмотр этих сообщений, см. IVssComponentEx::GetPrepareForBackupFailureMsg.

  13. Вызовите IVssBackupComponents::DoSnapshotSet для создания теневой копии тома.

  14. Вызовите IVssBackupComponents::GatherWriterStatus и IVssBackupComponents::GetWriterStatus для проверки состояния писателя ASR.

  15. Резервное копирование данных.

  16. Укажите, выполнена ли операция резервного копирования путем вызова IVssBackupComponents::SetBackupSucceeded.

  17. Вызовите IVssBackupComponents::BackupComplete, чтобы указать, что операция резервного копирования завершена.

  18. Вызов IVssBackupComponents::СобратьСтатусЗаписывателя и IVssBackupComponents::GetWriterStatus. Память состояния сеанса записи является ограниченным ресурсом, и писателям в конечном итоге нужно повторно использовать состояния сеанса. На этом шаге состояние сеанса резервного копирования записи помечается как завершенное и уведомляет VSS о том, что этот слот сеанса резервного копирования можно повторно использовать при последующей операции резервного копирования.

    Заметка

    Это необходимо только в Windows Server 2008 с пакетом обновления 2 (SP2) и более ранними версиями.

     

  19. Вызовите IVssBackupComponents::SaveAsXML, чтобы сохранить копию документа компонентов резервного копирования запрашивающего. Сведения в документе компонентов резервного копирования используются во время восстановления, когда запрашивающий вызывает метод IVssBackupComponents::InitializeForRestore.

Выбор критически важных компонентов для резервного копирования

На этапе инициализации резервного копирования модуль записи ASR сообщает о следующих типах компонентов в документе метаданных записи:

  • Критические тома, такие как тома загрузки, системы и среды восстановления Windows (Windows RE) и раздел Windows RE, связанный с экземпляром Windows Vista или Windows Server 2008, работающим в настоящее время. Том — это критический том, если он содержит сведения о состоянии системы. Тома загрузки и системы включаются автоматически. Запрашивающий объект должен включать все тома, содержащие критически важные для системы компоненты, сообщаемые авторами, например тома, содержащие Active Directory. Критически важные для системы компоненты помечены как "не подлежащие выбору для резервного копирования". В VSS "не подлежащие выбору" означает "обязательно". Таким образом, запрашиватель должен включать их в резервное копирование в составе системного состояния. Дополнительные сведения см. в разделе Резервное копирование и восстановление состояния системы. Компоненты, для которых установлен флаг VSS_CF_NOT_SYSTEM_STATE, не являются системными.

    Заметка

    Компонент ASR — это критически важная часть системы, о которой сообщает средство записи ASR.

     

  • Диски Каждый жесткий диск на компьютере представлен как компонент в ASR. Если диск не был исключен во время резервного копирования, он будет назначен во время восстановления и может быть повторно создан и переформатирован. Обратите внимание, что во время восстановления запрашивающий объект по-прежнему может повторно создать диск, исключенный во время резервного копирования, вызвав метод IVssBackupComponents::SetRestoreOptions. Если выбран один диск в динамическом пакете дисков, все остальные диски в этом пакете также должны быть выбраны. Если выбран том, так как это критически важный том (т. е. том, содержащий сведения о состоянии системы), каждый диск, содержащий экстент для этого тома, также должен быть выбран. Чтобы найти экстенты для тома, используйте управляющий код IOCTL_VOLUME_GET_VOLUME_DISK_EXTENTS.

    Заметка

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

     

    В среде кластеризации ASR не воссоздает структуру общих дисков кластера. Эти диски следует восстановить в сети после восстановления операционной системы в Windows RE.

  • Хранилище данных конфигурации загрузки (BCD). Этот компонент указывает путь к каталогу, содержаму хранилище BCD. Запрашиватель должен указать этот компонент и создать резервную копию всех файлов в каталоге хранилища BCD. Дополнительные сведения о хранилище BCD см. в разделе About BCD.

    Заметка

    На компьютерах, использующих расширенный интерфейс встроенного ПО (EFI), системный раздел EFI (ESP) всегда скрыт и не может быть включен в теневое копирование тома. Запрашиватель должен создать резервную копию содержимого этой секции. Так как эта секция не может быть включена в теневую копию тома, резервная копия может выполняться только из динамического тома, а не из теневого копирования. Дополнительные сведения об EFI и ESP см. в руководстве .

Имена компонентов используют следующие форматы:

  • Для компонентов диска используется формат

    <COMPONENT logicalPath="Disks" componentName="harddiskn" componentType="filegroup" />

    где n — номер диска. Записывается только номер диска. Чтобы получить номер диска, используйте код элемента управления IOCTL_STORAGE_GET_DEVICE_NUMBER.

  • Для компонентов тома используется следующий формат.

    <COMPONENT logicalPath="Volumes" componentName="Volume{GUID}" componentType="filegroup" />

    где GUID — это GUID тома.

  • Для компонента хранилища BCD формат следующий.

    <component logicalPath="BCD" componentName="BCD" componentType="filegroup" componentCaption = "Это путь к хранилищу BCD загрузки и диспетчерам загрузки... Все файлы в этом каталоге необходимо сделать резервное копирование...">

    Если системный раздел имеет имя GUID тома, этот компонент можно выбрать. В противном случае его нельзя выбрать.

    Заметка

    ASR добавляет файлы в группу файлов компонента хранилища BCD следующим образом:

    • ASR добавляется для дисков EFI

      SystemPartitionPath\EFI\Microsoft\Boot\*.*

      где SystemPartitionPath — путь к системной секции.

    • Для дисков GPT добавляет ASR

      SystemPartitionPath\Boot\*.*

      где SystemPartitionPath — путь к системной секции.

    • Путь к системной секции можно найти в следующем разделе реестра: HKEY_LOCAL_MACHINE\System\Setup\SystemPartition

     

При восстановлении необходимо восстановить все компоненты, которые отмечены как критические тома. Если не удается восстановить один или несколько критически важных томов, операция восстановления завершается ошибкой.

На этапе PreRestore последовательности восстановления диски, которые не были исключены во время резервного копирования, создаются повторно и переформатируются по умолчанию. Однако они не создаются повторно или переформатируются, если они соответствуют следующим условиям:

  • Базовый диск не создается повторно, если его макет диска нетронут или в него были внесены только аддитивные изменения. Макет диска не изменяется, если выполняются следующие условия:

    • Сигнатура диска, стиль диска (GPT или MBR), размер логического сектора и смещение запуска тома не изменяются.
    • Размер тома не уменьшается.
    • Для дисков GPT идентификатор секции не изменяется.
  • Динамический диск не создается повторно, если его макет диска нетронут или в него были внесены только аддитивные изменения. Чтобы динамический диск был нетронутым, все условия для базового диска должны быть выполнены. Кроме того, структура тома всего пакета дисков должна быть нетронутой. Структура тома пакета диска не изменяется, если она соответствует следующим условиям, которые применяются как к дискам MBR, так и к GPT:

    • Количество томов, доступных в физическом пакете во время восстановления, должно быть больше или равно количеству томов, указанных в метаданных записи ASR во время резервного копирования.

    • Количество plexes в единице объёма должно быть неизменным.

    • Количество элементов должно быть неизменным.

    • Число экстентов физического диска должно превышать количество экстентов, указанных в метаданных ASR writer.

    • Нетронутый набор остается неизменным при добавлении дополнительных томов или если том в наборе расширяется (например, из простого тома в почлененный том).

      Заметка

      Если простой том зеркально отражён, пакет не будет целым и будет воссоздан, чтобы убедиться, что состояние BCD и загрузочного тома остаётся согласованным после восстановления. Если тома удаляются, пакет создается повторно.

       

  • Если структура тома динамического пакета дисков не изменяется и в него были внесены только аддитивные изменения, диски в пакете не создаются повторно.

    Windows Vista: динамические диски всегда создаются повторно. Обратите внимание, что это поведение изменилось с Windows Server 2008 и Windows Vista с пакетом обновления 1 (SP1).

В любое время до начала этапа восстановления запрашивающий может указать, что диски должны быть быстро отформатированы, установив ключ реестра HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\ASR\RestoreSession. Под этим ключом есть значение с именем QuickFormat с типом данных REG_DWORD. Если это значение не существует, необходимо создать его. Установите значение QuickFormat параметра на 1 для быстрого форматирования или на 0 для медленного форматирования.

Если значение QuickFormat не существует, диски будут медленно отформатированы.

Быстрое форматирование значительно быстрее, чем медленное форматирование (также называемое полным форматированием). Однако быстрое форматирование не проверяет каждый сектор в томе.

Обзор задач этапа восстановления

Во время восстановления запрашиватель выполняет следующие действия:

Заметка

Все шаги требуются, если иное не указано.

 

  1. Вызовите функцию CreateVssBackupComponents, чтобы создать экземпляр интерфейса IVssBackupComponents и вызвать метод IVssBackupComponents::InitializeForRestore для инициализации экземпляра для восстановления путем загрузки документа компонентов резервного копирования запроса в экземпляр.

  2. [Этот шаг требуется только в том случае, если запрашиватель должен изменить значение "IncludeDisk" или "ExcludeDisk" для одного или нескольких дисков. Вызовите IVssBackupComponents::SetRestoreOptions, чтобы задать параметры восстановления для компонентов записи ASR. Средство записи ASR поддерживает следующие параметры: "IncludeDisk" позволяет включить диск по запросу в целевую систему для восстановления, даже если он не был выбран на этапе резервного копирования. "ExcludeDisk" позволяет запрашивающей стороне предотвратить повторное создание диска в целевой системе. Обратите внимание, что если параметр ExcludeDisk указан для диска, содержащего критически важный том, последующий вызов IVssBackupComponents::PreRestore завершится ошибкой.

    В следующем примере показано, как использовать SetRestoreOptions, чтобы предотвратить повторное создание диска 0 и диска 1 и внедрение сторонних драйверов в восстановленный том загрузки.

    Windows Server 2008, Windows Vista, Windows Server 2003 и Windows XP: внедрение сторонних драйверов не поддерживается.

    В этом примере предполагается, что указатель IVssBackupComponents, m_pBackupComponents, является валидным.

        m_pBackupComponents->SetRestoreOptions(
            AsrWriterId,
            VSS_CT_FILEGROUP,
            NULL,
            TEXT("ASR"),
            TEXT("\"ExcludeDisk\"=\"0\", \"ExcludeDisk\"=\"1\" "),
            TEXT("\"InjectDrivers\"=\"1\" ")
            );
    

    Чтобы исключить все диски для указанного тома, см. раздел "Исключение всех дисков для тома".

  3. Вызовите IVssBackupComponents::PreRestore, чтобы уведомить модуль записи ASR о подготовке к операции восстановления. Вызывайте IVssAsync::QueryStatus столько раз, сколько необходимо, пока возвращаемое значение состояния в параметре pHrResult не станет отличным от VSS_S_ASYNC_PENDING.

  4. Восстановите данные. На этапе восстановления ASR перенастраивает путь GUID тома (\\?\Volume{GUID}) для каждого тома, чтобы он соответствовал пути GUID тома, который использовался во время этапа резервного копирования. Однако буквы дисков не сохраняются, так как это приведет к конфликтам с буквами дисков, которые автоматически назначаются в среде восстановления. Таким образом, при восстановлении данных пользователь, запрашивающий данные, должен использовать пути GUID тома, а не буквы дисков для доступа к томам.

  5. Задайте \SOFTWARE\Microsoft\Windows NT\CurrentVersion\ASR\RestoreSession, чтобы указать набор томов, которые были восстановлены или переформатированы.

    В этом ключе имеется значение с именем RestoredVolumes с типом данных REG_MULTI_SZ. Если это значение не существует, необходимо создать его. Под этим значением запрашивающий должен создать запись GUID для каждого восстановленного тома. Эта запись должна быть в следующем формате: \\?\Volume{78618c8f-aefd-11da-a898-806e6f6e6e6963}. Каждый раз, когда выполняется восстановление на голое железо, ASR задает значение RestoredVolumes набором томов, восстановленных ASR. Если запрашивающая сторона восстановила дополнительные тома, она должна установить это значение как объединение набора томов, восстановленных этой стороной, и набора томов, восстановленных ASR. Если запрашивающий не использовал ASR, он должен заменить список томов.

    Необходимо также создать значение с именем LastInstance с типом данных REG_SZ. Этот ключ должен содержать случайный файл cookie, который однозначно идентифицирует текущую операцию восстановления. Такой файл cookie можно создать с помощью функций UuidCreate и UuidToString. При каждом выполнении восстановления на голое железо ASR сбрасывает это значение реестра, чтобы уведомить пользователей и приложения резервного копирования, отличные от VSS, что восстановление было выполнено.

  6. Вызовите IVssBackupComponents::PostRestore, чтобы указать конец операции восстановления. Выполняйте вызов IVssAsync::QueryStatus столько раз, сколько необходимо, до тех пор, пока возвращаемое значение статуса в параметре pHrResult не станет отличным от VSS_S_ASYNC_PENDING.

На этапе восстановления ASR может создавать или удалять секции для восстановления компьютера до предыдущего состояния. Запрашивающие не должны пытаться сопоставить номера дисков из этапа резервного копирования с этапом восстановления.

При восстановлении запрашивающий должен исключить диск, содержащий его резервную копию. В противном случае резервный набор можно перезаписать операцией восстановления.

При восстановлении диск исключается, если он не был выбран в качестве компонента во время резервного копирования, или если он явно исключен путем вызова IVssBackupComponents::SetRestoreOptions с параметром ExcludeDisk во время восстановления.

Важно отметить, что во время аварийного восстановления WinPE функция записи ASR присутствует, но другие записи недоступны, и служба VSS не запущена. После завершения аварийного восстановления WinPE, перезагрузки компьютера и нормальной работы операционной системы Windows, можно запустить службу VSS, и запрашивающий может выполнить любые дополнительные операции восстановления, требующие участия писателей, кроме ASR-писателя.

Если во время сеанса восстановления приложение резервного копирования обнаруживает, что уникальные идентификаторы тома не изменяются, и поэтому все тома с момента резервного копирования присутствуют и нетронуты в WinPE, приложение резервного копирования может продолжить восстановление только содержимого томов без участия ASR. В этом случае приложение резервного копирования должно указать, что компьютер был восстановлен, задав следующий раздел реестра в восстановленной операционной системе: HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT NT\CurrentVersion\ASR\RestoreSession

В этом разделе укажите LastInstance для имени значения, REG_SZ для типа значения и случайный файл cookie (например, GUID, созданный функцией UuidCreate) для данных значений.

Если во время сеанса восстановления приложение резервного копирования обнаруживает, что одно или несколько томов изменены или отсутствуют, приложение резервного копирования должно использовать ASR для выполнения восстановления. ASR повторно создаст тома точно так, как они были во время резервной копии, и задаст ключ реестра RestoreSession.

Исключение всех дисков для тома

В следующем примере показано, как исключить все диски для указанного тома.

HRESULT BuildRestoreOptionString
(
    const WCHAR             *pwszVolumeNamePath,
    CMyString               *pstrExclusionList
)
{
    HANDLE                  hVolume           = INVALID_HANDLE_VALUE;
    DWORD                   cbSize            = 0;
    VOLUME_DISK_EXTENTS     * pExtents        = NULL;
    DISK_EXTENT             * pExtent         = NULL;
    ULONG                   i                 = 0;
    BOOL                    fIoRet            = FALSE;
    WCHAR                   wszDest[MAX_PATH] = L"";
    CMyString               strVolumeName;
    CMyString               strRestoreOption;

    // Open a handle to the volume device.
    strVolumeName.Set( pwszVolumeNamePath );
    // If the volume name contains a trailing backslash, remove it.
    strVolumeName.UnTrailing( L'\\' );
    hVolume = ::CreateFile(strVolumeName, 0, FILE_SHARE_READ | FILE_SHARE_WRITE, NULL, OPEN_EXISTING, NULL, 0);
    // Check whether the call to CreateFile succeeded.

    // Get the list of disks used by this volume.
    cbSize = sizeof(VOLUME_DISK_EXTENTS);
    pExtents = (VOLUME_DISK_EXTENTS *)::CoTaskMemAlloc(cbSize);

    ::ZeroMemory(pExtents, cbSize);

    fIoRet = ::DeviceIoControl(hVolume, IOCTL_VOLUME_GET_VOLUME_DISK_EXTENTS, NULL, 0, pExtents, cbSize, &cbSize, 0);
    if ( !fIoRet && GetLastError() == ERROR_MORE_DATA )
    {
        // Allocate more memory.
        cbSize = FIELD_OFFSET(VOLUME_DISK_EXTENTS, Extents) + pExtents->NumberOfDiskExtents * sizeof(DISK_EXTENT);
        ::CoTaskMemFree(pExtents);
        pExtents = NULL;

        pExtents = (VOLUME_DISK_EXTENTS *) ::CoTaskMemAlloc(cbSize);
        // Check whether CoTaskMemAlloc returned an out-of-memory error.
        ::ZeroMemory(pExtents, cbSize);

        // Now the buffer should be big enough.
        ::DeviceIoControl(hVolume, IOCTL_VOLUME_GET_VOLUME_DISK_EXTENTS, NULL, 0, pExtents, cbSize, &cbSize, 0);
        // Check whether the IOCTL succeeded.
    }
    // Check for errors; note that the IOCTL can fail for a reason other than insufficient memory.

    // For each disk, mark it to be excluded in the Restore Option string.
    for (i = 0; i < pExtents->NumberOfDiskExtents; i++)
    {
        pExtent = &pExtents->Extents[i];

        *wszDest = L'\0';
        StringCchPrintf(wszDest, MAX_PATH, L"\"ExcludeDisk\"=\"%d\", ", pExtent->DiskNumber); // check errors

        strRestoreOption.Append(wszDest);
        // Check for an out-of-memory error.
    }

    // Remove the trailing comma.
    strRestoreOption.TrimRight();
    strRestoreOption.UnTrailing(',');

    // Set the output parameter.
    strRestoreOption.Transfer( pstrExclusionList );

Exit:
    if( pExtents )
    {
        ::CoTaskMemFree(pExtents);
        pExtents = NULL;
    }

    if( hVolume != INVALID_HANDLE_VALUE )
    {
        ::CloseHandle(hVolume);
        hVolume = INVALID_HANDLE_VALUE;
    }

    return ( hr );
}