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


Использование автоматического восстановления системы 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".

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

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

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

  11. Вызовите методы IVssBackupComponents::CollectWriterStatus и IVssBackupComponents::GetWriterStatus (или IVssBackupComponentsEx3::GetWriterStatus), чтобы проверить состояние модуля записи ASR.

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

  13. Вызовите IVssBackupComponents::D oSnapshotSet , чтобы создать теневую копию тома.

  14. Вызовите методы IVssBackupComponents::CollectWriterStatus и IVssBackupComponents::GetWriterStatus , чтобы проверить состояние модуля записи ASR.

  15. Создайте резервную копию данных.

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

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

  18. Вызовите методы IVssBackupComponents::GatherWriterStatus и 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 см. в разделе Сведения о 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 = "This is the path to the boot BCD store and the boot managers... Для всех файлов в этом каталоге необходимо создать резервную копию...">

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

    Примечание

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

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

      SystemPartitionPath\EFI\Microsoft\Boot\*.*

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

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

      SystemPartitionPath\Boot\*.*

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

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

     

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

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

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

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

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

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

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

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

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

      Примечание

      При зеркальном отображении простого тома пакет не остается без изменений и будет создан повторно, чтобы обеспечить согласованность состояния 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::P reRestore завершится ошибкой .

    В следующем примере показано, как использовать 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::P reRestore , чтобы уведомить модуль записи ASR о необходимости подготовки к операции восстановления. Вызывайте IVssAsync::QueryStatus столько раз, сколько необходимо, пока значение состояния, возвращаемое в параметре pHrResult , не будет VSS_S_ASYNC_PENDING.

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

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

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

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

  6. Вызовите метод IVssBackupComponents::P ostRestore , чтобы указать окончание операции восстановления. Вызывайте 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\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 );
}