ディザスター リカバリー用に VSS 自動システム回復を使用
ディザスター リカバリー (ベア メタル回復とも呼ばれます) を実行する VSS バックアップおよび回復アプリケーションでは、自動システム回復 (ASR) ライターと Windows プレインストール環境 (Windows PE) を使用して、重要なボリュームと起動可能なシステム状態のその他のコンポーネントをバックアップおよび復元できます。 バックアップ アプリケーションは VSS リクエスターとして実装されます。
メモ ASR を使用するアプリケーションでは、Windows PE のライセンスが必要です。
Windows Server 2003 および Windows XP: ASR は VSS ライターとして実装されていません。
ASR で使用できるトレース ツールの詳細については、「 VSS ASR アプリケーションでのトレース ツールの使用」を参照してください。
この記事の内容:
バックアップ フェーズ タスクの概要
バックアップ時に、リクエスターは次の手順を実行します。
注意
特に指定がない限り、すべての手順が必要です。
CreateVssBackupComponents 関数を呼び出して IVssBackupComponents インターフェイスのインスタンスを作成し、IVssBackupComponents::InitializeForBackup メソッドを呼び出して、バックアップを管理するインスタンスを初期化します。
IVssBackupComponents::SetContext を呼び出して、シャドウ コピー操作のコンテキストを設定します。
IVssBackupComponents::SetBackupState を呼び出してバックアップを構成します。 バックアップに起動可能なシステム状態が含まれることを示すには、 bBackupBootableSystemState パラメーターを true に設定します。
バックアップする ASR ライターのライター メタデータ ドキュメント内の重要なコンポーネントを選択し、それぞれに対して IVssBackupComponents::AddComponent を呼び出します。
IVssBackupComponents::StartSnapshotSet を呼び出して、新しい空のシャドウ コピー セットを作成します。
ライターとの非同期接続を開始するには、 IVssBackupComponents::GatherWriterMetadata を呼び出します。
IVssBackupComponents::GetWriterMetadata を呼び出して、ASR ライターのライター メタデータ ドキュメントを取得します。 ASR ライターのライター ID は BE000CBE-11FE-4426-9C58-531AA6355FC4 で、ライター名の文字列は "ASR ライター" です。
IVssExamineWriterMetadata::SaveAsXML を呼び出して、ASR ライターのライター メタデータ ドキュメントのコピーを保存します。
シャドウ コピーに参加できるボリュームごとに IVssBackupComponents::AddToSnapshotSet を呼び出して、シャドウ コピー セットにボリュームを追加します。
IVssBackupComponents::P repareForBackup を呼び出して、バックアップ操作の準備をライターに通知します。
ASR ライターの状態を確認するには、 IVssBackupComponents::GatherWriterStatus と IVssBackupComponents::GetWriterStatus (または IVssBackupComponentsEx3::GetWriterStatus) を呼び出します。
この時点で、ライターが CVssWriter::OnPrepareBackup メソッドで設定したエラー メッセージを照会できます。 これらのメッセージの表示方法を示すコード例については、「 IVssComponentEx::GetPrepareForBackupFailureMsg」を参照してください。
ボリューム シャドウ コピーを作成するには、 IVssBackupComponents::D oSnapshotSet を呼び出します。
ASR ライターの状態を確認するには、 IVssBackupComponents::GatherWriterStatus と IVssBackupComponents::GetWriterStatus を呼び出します。
データをバックアップします。
IVssBackupComponents::SetBackupSucceeded を呼び出して、バックアップ操作が成功したかどうかを示します。
IVssBackupComponents::BackupComplete を呼び出して、バックアップ操作が完了したことを示します。
IVssBackupComponents::GatherWriterStatus と IVssBackupComponents::GetWriterStatus を呼び出します。 ライター セッション状態メモリは限られたリソースであり、ライターは最終的にセッション状態を再利用する必要があります。 この手順では、ライターのバックアップ セッション状態を完了としてマークし、このバックアップ セッション スロットを後続のバックアップ操作で再利用できることを VSS に通知します。
注意
これは、Service Pack 2 (SP2) 以前の Windows Server 2008 でのみ必要です。
IVssBackupComponents::SaveAsXML を呼び出して、リクエスターのバックアップ コンポーネント ドキュメントのコピーを保存します。 バックアップ コンポーネント ドキュメントの情報は、リクエスターが IVssBackupComponents::InitializeForRestore メソッドを呼び出すときに、復元時に使用されます。
バックアップする重要なコンポーネントの選択
バックアップ初期化フェーズでは、ASR ライターはライター メタデータ ドキュメントで次の種類のコンポーネントを報告します。
ブート、システム、Windows 回復環境 (Windows RE) ボリューム、現在実行中の Windows Vista または Windows Server 2008 のインスタンスに関連付けられているWindows RE パーティションなどの重要なボリューム。 ボリュームにシステム状態情報が含まれている場合、ボリュームは 重要なボリューム です。 ブート ボリュームとシステム ボリュームは自動的に含まれます。 リクエスターには、Active Directory を含むボリュームなど、ライターによって報告されるシステムクリティカルなコンポーネントを含むすべてのボリュームを含める必要があります。 システム クリティカルなコンポーネントは、"バックアップに対して選択できません" とマークされます。VSS では、"選択不可" は "省略不可" を意味します。したがって、リクエスターは、システム状態の一部としてバックアップする必要があります。 詳細については、「 システム状態のバックアップと復元」を参照してください。 VSS_CF_NOT_SYSTEM_STATE フラグが設定されているコンポーネントは、システムクリティカルではありません。
注意
ASR コンポーネントは、ASR ライターによって報告されるシステムクリティカルなコンポーネントです。
ディスク。 コンピューター上のすべての固定ディスクは、ASR のコンポーネントとして公開されます。 バックアップ中にディスクが除外されなかった場合は、復元中にディスクが割り当てられ、再作成および再フォーマットできます。 復元中でも、リクエスターは IVssBackupComponents::SetRestoreOptions メソッドを呼び出すことによって、バックアップ中に除外されたディスクを再作成できることに注意してください。 ダイナミック ディスク パック内の 1 つのディスクが選択されている場合は、そのパック内の他のすべてのディスクも選択する必要があります。 ボリュームが重要なボリューム (つまり、システム状態情報を含むボリューム) であるためにボリュームが選択されている場合は、そのボリュームのエクステントを含むすべてのディスクも選択する必要があります。 ボリュームのエクステントを見つけるには、 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\システム\セットアップ\SystemPartition
復元時に、重要なボリュームとしてマークされているすべてのコンポーネントを復元する必要があります。 1 つ以上の重要なボリュームを復元できない場合、復元操作は失敗します。
復元シーケンスの PreRestore フェーズでは、バックアップ中に除外されなかったディスクは、既定で再作成および再フォーマットされます。 ただし、次の条件を満たしている場合、再作成または再フォーマットは行われません。
ディスク レイアウトが変更されていない場合、または追加の変更のみが加えられた場合、ベーシック ディスクは再作成されません。 次の条件に該当する場合、ディスク レイアウトはそのままです。
- ディスク署名、ディスク スタイル (GPT または MBR)、論理セクター サイズ、ボリューム開始オフセットは変更されません。
- ボリューム サイズが小さくない。
- GPT ディスクの場合、パーティション識別子は変更されません。
ディスク レイアウトが変更されていない場合、または追加の変更のみが加えられた場合、ダイナミック ディスクは再作成されません。 ダイナミック ディスクをそのまま使用するには、ベーシック ディスクのすべての条件を満たす必要があります。 さらに、ディスク パックのボリューム構造全体はそのままである必要があります。 ディスク パックのボリューム構造は、MBR ディスクと GPT ディスクの両方に適用される次の条件を満たしている場合、そのままです。
復元中に物理パックで使用できるボリュームの数は、バックアップ中に ASR ライター メタデータで指定されたボリュームの数以上である必要があります。
ボリュームあたりの プレックス 数は変更しない必要があります。
メンバーの数は変更しない必要があります。
物理ディスク・エクステントの数は、ASR ライター・メタデータで指定されたディスク・エクステントの数より大きくなければなりません。
追加のボリュームが追加された場合、またはパック内のボリュームが拡張された場合 (たとえば、単純なボリュームからスパンボリュームまで) は、無傷のパックはそのまま残ります。
注意
単純ボリュームがミラー化されている場合、パックはそのままではなく、復元後に BCD とブート ボリュームの状態が一貫していることを確認するために再作成されます。 ボリュームが削除されると、パックが再作成されます。
ダイナミック ディスク パックのボリューム構造がそのままで、追加の変更のみが加えられた場合、パック内のディスクは再作成されません。
Windows Vista: ダイナミック ディスクは常に再作成されます。 この動作は、Windows Server 2008 と Windows Vista Service Pack 1 (SP1) で変更されていることに注意してください。
リクエスターは、復元フェーズの開始前にいつでも、HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\ Windows NT CurrentVersion\ASR\RestoreSession レジストリ キーを設定することで、\ディスクをクイックフォーマットするように指定できます。 このキーの下には、データ型がREG_DWORDされた QuickFormat という名前の値があります。 この値が存在しない場合は、作成する必要があります。 クイック書式設定の場合は QuickFormat 値のデータを 1 に、低速書式設定の場合は 0 に設定します。
QuickFormat 値が存在しない場合、ディスクのフォーマットが遅くなります。
クイック書式設定は、低速の書式設定 (完全な書式設定とも呼ばれます) よりも大幅に高速です。 ただし、クイック書式設定では、ボリューム上の各セクターは検証されません。
復元フェーズ タスクの概要
復元時に、リクエスターは次の手順を実行します。
注意
特に指定がない限り、すべての手順が必要です。
CreateVssBackupComponents 関数を呼び出して IVssBackupComponents インターフェイスのインスタンスを作成し、IVssBackupComponents::InitializeForRestore メソッドを呼び出して、リクエスターのバックアップ コンポーネント ドキュメントをインスタンスに読み込んで、復元するインスタンスを初期化します。
[この手順は、要求者が 1 つ以上のディスクに対して "IncludeDisk" または "ExcludeDisk" を指定するかどうかを変更する必要がある場合にのみ必要です。 ASR ライター コンポーネントの復元オプションを設定するには、 IVssBackupComponents::SetRestoreOptions を呼び出します。 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\" ") );
指定したボリュームのすべてのディスクを除外するには、次の「ボリュームのすべてのディスクを除外する」を参照してください。
IVssBackupComponents::P rerestore を呼び出して、復元操作の準備を ASR ライターに通知します。 pHrResult パラメーターで返された状態値がVSS_S_ASYNC_PENDINGされないまで、必要な回数だけ IVssAsync::QueryStatus を呼び出します。
データを復元します。 復元フェーズでは、ASR は各ボリュームのボリューム GUID パス (\\?\Volume{GUID}) を、バックアップ フェーズ中に使用されたボリューム GUID パスと一致するように再構成します。 ただし、ドライブ文字は保持されません。これは、回復環境で自動的に割り当てられるドライブ文字と競合するためです。 したがって、データを復元する場合、リクエスターはドライブ文字ではなくボリューム GUID パスを使用してボリュームにアクセスする必要があります。
HKLM\SOFTWARE\Microsoft\Windows NT\CurrentVersion\ASR\RestoreSession レジストリ キーを設定して、復元または再フォーマットされたボリュームのセットを示します。
このキーの下には、データ型がREG_MULTI_SZ された RestoredVolumes という名前の値があります。 この値が存在しない場合は、作成する必要があります。 この値の下に、リクエスターは復元された各ボリュームのボリューム GUID エントリを作成する必要があります。 このエントリは、\\?\Volume{78618c8f-aefd-11da-a898-806e6f6e6963} の形式にする必要があります。 ベア メタル回復が実行されるたびに、ASR は RestoredVolumes 値を ASR が復元したボリュームのセットに設定します。 リクエスターが追加のボリュームを復元した場合は、この値を、リクエスターが復元したボリュームのセットと ASR が復元したボリュームのセットの和集合に設定する必要があります。 リクエスターが ASR を使用しなかった場合は、ボリュームのリストを置き換える必要があります。
また、データ型REG_SZを使用して LastInstance という名前の値を作成する必要があります。 このキーには、現在の復元操作を一意に識別するランダムな Cookie が含まれている必要があります。 このような Cookie は、 UuidCreate 関数と UuidToString 関数を使用して作成できます。 ベア メタル復旧が実行されるたびに、ASR は、このレジストリ値をリセットして、回復が発生したことを要求者と VSS 以外のバックアップ アプリケーションに通知します。
IVssBackupComponents::P ostRestore を呼び出して、復元操作の終了を示します。 pHrResult パラメーターで返された状態値がVSS_S_ASYNC_PENDINGされないまで、必要な回数だけ IVssAsync::QueryStatus を呼び出します。
復元フェーズでは、ASR でパーティションを作成または削除して、コンピューターを以前の状態に復元できます。 要求者は、バックアップ フェーズから復元フェーズにディスク番号をマップしようとしないでください。
復元時に、リクエスターはリクエスターのバックアップ セットを含むディスクを除外する必要があります。 それ以外の場合は、復元操作によってバックアップ セットを上書きできます。
復元時にディスクがコンポーネントとして選択されていない場合、または復元中に "ExcludeDisk" オプションを指定して IVssBackupComponents::SetRestoreOptions を呼び出して明示的に除外された場合、ディスクは除外されます。
WinPE ディザスター リカバリー中は、ASR ライター機能は存在しますが、他のライターは使用できなくなり、VSS サービスは実行されていないことに注意してください。 WinPE ディザスター リカバリーが完了すると、コンピューターが再起動され、Windows オペレーティング システムが正常に実行され、VSS サービスを開始でき、要求元は ASR ライター以外のライターの参加を必要とする追加の復元操作を実行できます。
復元セッション中に、バックアップ アプリケーションがボリューム固有 ID が変更されていないことを検出し、バックアップ時のすべてのボリュームが WinPE に存在し、そのままである場合、バックアップ アプリケーションは ASR を使用せずに、ボリュームの内容のみを復元できます。 この場合、バックアップ アプリケーションは、復元されたオペレーティング システムで次のレジストリ キーを設定して、コンピューターが復元されたことを示す必要があります。 HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\ASR\RestoreSession
このキーの下で、値の名前に LastInstance を指定し、値の種類にREG_SZし、値データのランダム Cookie ( UuidCreate 関数によって作成された GUID など) を指定します。
復元セッション中に、バックアップ アプリケーションが 1 つ以上のボリュームが変更または不足していることを検出した場合、バックアップ アプリケーションは 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 );
}