Uso di VSS Automated System Recovery per il ripristino di emergenza
Un'applicazione di backup e ripristino VSS che esegue il ripristino di emergenza (detto anche ripristino bare metal) può utilizzare il Ripristino Automatico del Sistema (ASR) insieme all'Ambiente Preinstallazione di Windows (Windows PE) per eseguire il backup e il ripristino di volumi critici e altri componenti dello stato del sistema di avvio. L'applicazione di backup viene implementata come Richiedente VSS.
Nota Applicazioni che usano ASR devono concedere una licenza a Windows PE.
Windows Server 2003 e Windows XP: ASR non è implementato come scrittore VSS.
Per informazioni sugli strumenti di traccia che è possibile usare con ASR, vedere Using Tracing Tools with VSS ASR Applications.
In questo articolo:
- Panoramica delle attività di fase di backup
- scelta dei componenti critici di cui eseguire il backup
- Panoramica delle attività di fase di ripristino
- Esclusione di tutti i dischi per un volume
Panoramica delle attività della fase di backup
In fase di backup, il richiedente esegue i passaggi seguenti.
Nota
Tutti i passaggi sono necessari se non diversamente indicato.
Chiamare la funzioneCreateVssBackupComponentsper creare un'istanza dell'interfacciaIVssBackupComponentse chiamare il metodo IVssBackupComponents::InitializeForBackup per inizializzare l'istanza per gestire un backup.
Chiamare IVssBackupComponents::SetContext per impostare il contesto per l'operazione di copia istantanea.
Chiamare IVssBackupComponents::SetBackupState per configurare il backup. Impostare il parametro bBackupBootableSystemState su true per indicare che il backup includerà uno stato del sistema di avvio.
Scegliere quali componenti critici nel documento dei metadati del writer ASR eseguire il backup e chiamare IVssBackupComponents::AddComponent per ciascuno di essi.
Chiamare IVssBackupComponents::StartSnapshotSet per creare un nuovo set di copie shadow vuoto.
Chiamare IVssBackupComponents::GatherWriterMetadata per avviare una comunicazione asincrona con gli scrittori.
Chiamare IVssBackupComponents::GetWriterMetadata per recuperare il documento di metadati del writer ASR. L'ID writer per il writer ASR è BE000CBE-11FE-4426-9C58-531AA6355FC4 e la stringa del nome del writer è "ASR Writer".
Chiamare IVssExamineWriterMetadata::SaveAsXML per salvare una copia del documento di metadati dello scrittore ASR.
Chiamare IVssBackupComponents::AddToSnapshotSet per ogni volume che può partecipare alle copie ombra per aggiungere il volume al set di copie ombra.
Chiamare IVssBackupComponents::PrepareForBackup per notificare ai writer di prepararsi per un'operazione di backup.
Chiamare IVssBackupComponents::GatherWriterStatus e IVssBackupComponents::GetWriterStatus (o IVssBackupComponentsEx3::GetWriterStatus) per verificare lo stato del writer ASR.
A questo punto, è possibile eseguire una query per individuare i messaggi di errore impostati dal writer nel relativo metodo CVssWriter::OnPrepareBackup. Per un esempio di codice che illustra come visualizzare questi messaggi, vedere IVssComponentEx::GetPrepareForBackupFailureMsg.
Chiamare IVssBackupComponents::DoSnapshotSet per creare una copia shadow del volume.
Chiamare IVssBackupComponents::GatherWriterStatus e IVssBackupComponents::GetWriterStatus per verificare lo stato del writer ASR.
Eseguire il backup dei dati.
Indicare se l'operazione di backup è riuscita chiamando IVssBackupComponents::SetBackupSucceeded.
Chiamare IVssBackupComponents::BackupComplete per indicare che l'operazione di backup è stata completata.
Chiamare IVssBackupComponents::GatherWriterStatus e IVssBackupComponents::GetWriterStatus. La memoria dello stato della sessione del writer è una risorsa limitata, quindi i writer devono eventualmente riutilizzare gli stati di sessione. Questo passaggio contrassegna lo stato della sessione di backup del writer come completato e notifica al Servizio Copia Shadow che questo slot di sessione di backup può essere riutilizzato da un'operazione di backup successiva.
Nota
Questa operazione è necessaria solo in Windows Server 2008 con Service Pack 2 (SP2) e versioni precedenti.
Chiamare IVssBackupComponents::SaveAsXML per salvare una copia del documento dei componenti di backup del richiedente. Le informazioni contenute nel documento Componenti di backup vengono usate in fase di ripristino quando il richiedente chiama il metodo IVssBackupComponents::InitializeForRestore.
Scelta dei componenti critici di cui eseguire il backup
Nella fase di inizializzazione del backup, il writer ASR segnala i tipi di componenti seguenti nel documento dei metadati del writer:
Volumi critici, ad esempio volumi di avvio, sistema e Windows Recovery Environment (Windows RE) e la partizione RE di Windows associata all'istanza di Windows Vista o Windows Server 2008 attualmente in esecuzione. Un volume è un volume volume critico se contiene informazioni sullo stato del sistema. I volumi di avvio e di sistema vengono inclusi automaticamente. Il richiedente deve includere tutti i volumi che contengono componenti critici del sistema segnalati dai writer, ad esempio i volumi che contengono Active Directory. I componenti critici del sistema sono contrassegnati come "non selezionabili per il backup". In VSS, "non selezionabile" significa "non facoltativo". Pertanto, il richiedente deve eseguirne il backup come parte dello stato del sistema. Per altre informazioni, vedere Backup e ripristino dello stato del sistema. I componenti per i quali è impostato il flag di VSS_CF_NOT_SYSTEM_STATE non sono critici per il sistema.
Nota
Il componente ASR è critico per il sistema ed è riportato dal writer ASR.
Dischi. Ogni disco fisso nel computer viene visualizzato come componente in ASR. Se un disco non è stato escluso durante il backup, verrà assegnato durante il ripristino e può essere ricreato e riformattato. Si noti che durante il ripristino, il richiedente può comunque ricreare un disco escluso durante il backup chiamando il metodo IVssBackupComponents::SetRestoreOptions. Se è selezionato un disco in un pacchetto di disco dinamico, è necessario selezionare anche tutti gli altri dischi in tale pacchetto. Se viene selezionato un volume perché è un volume critico, ovvero un volume che contiene informazioni sullo stato del sistema, è necessario selezionare anche ogni disco che contiene un extent per tale volume. Per trovare le estensioni di un volume, utilizzare il codice di controllo IOCTL_VOLUME_GET_VOLUME_DISK_EXTENTS.
Nota
Durante il backup, il richiedente deve includere tutti i dischi fissi. Se il disco che contiene il set di backup del richiedente è un disco locale, questo disco deve essere incluso. Durante il ripristino, il richiedente deve escludere il disco che contiene il set di backup del richiedente per evitare che venga sovrascritto.
In un ambiente di clustering l'asr non ricrea il layout dei dischi condivisi del cluster. Questi dischi devono essere ripristinati online dopo il ripristino del sistema operativo in Windows RE.
Archivio dei dati di configurazione di avvio.Boot Configuration Data (BCD). Questo componente specifica il percorso della directory che contiene l'archivio BCD. Il richiedente deve specificare questo componente ed eseguire il backup di tutti i file nella directory dell'archivio BCD. Per altre informazioni sull'archivio BCD, vedere Informazioni su BCD.
Nota
Nei computer che usano l'interfaccia EFI (Extended Firmware Interface), la partizione di sistema EFI (ESP) è sempre nascosta e non può essere inclusa in una copia shadow del volume. Il richiedente deve eseguire il backup del contenuto di questa partizione. Poiché questa partizione non può essere inclusa in una copia shadow del volume, il backup può essere eseguito solo dal volume live, non dalla copia shadow. Per ulteriori informazioni su EFI ed ESP, consultare la guida all'avvio .
I nomi dei componenti usano i formati seguenti:
Per i componenti del disco, il formato è
<COMPONENT logicalPath="Disks" componentName="harddiskn" componentType="filegroup" />
dove n è il numero del disco. Viene registrato solo il numero di disco. Per ottenere il numero del disco, usare il codice di controllo IOCTL_STORAGE_GET_DEVICE_NUMBER.
Per i componenti del volume di archiviazione, il formato è
<COMPONENT logicalPath="Volumes" componentName="Volume{GUID}" componentType="filegroup" />
dove il GUID del volume è GUID.
Per il componente dell'archivio BCD, il formato è
<COMPONENT logicalPath="BCD" componentName="BCD" componentType="filegroup" componentCaption = "Questo è il percorso per l'archivio BCD di avvio e i gestori di avvio... È necessario eseguire il backup di tutti i file in questa directory...">
Se la partizione di sistema ha un nome GUID del volume, questo componente è selezionabile. In caso contrario, non è selezionabile.
Nota
AsR aggiunge i file al gruppo di file del componente dell'archivio BCD come indicato di seguito:
Per i dischi EFI, ASR aggiunge
SystemPartitionPath\EFI\Microsoft\Boot\*.*
dove SystemPartitionPath è il percorso della partizione di sistema.
Per i dischi GPT, ASR aggiunge
SystemPartitionPath\Boot\*.*
dove SystemPartitionPath è il percorso della partizione di sistema.
Il percorso della partizione di sistema è disponibile nella chiave del Registro di sistema seguente: HKEY_LOCAL_MACHINE\System\Setup\SystemPartition
Al ripristino, tutti i componenti contrassegnati come volumi critici devono essere ripristinati. Se non è possibile ripristinare uno o più volumi critici, l'operazione di ripristino non riesce.
Nella fase di PreRestore della sequenza di ripristino, i dischi non esclusi durante il backup vengono ricreati e riformattati per impostazione predefinita. Tuttavia, non vengono ricreati o riformattati se soddisfano le condizioni seguenti:
Un disco di base non viene ricreato se il layout del disco è intatto o sono state apportate solo modifiche aggiuntive. Il layout del disco è intatto se le condizioni seguenti sono vere:
- La firma del disco, lo stile del disco (GPT o MBR), le dimensioni del settore logico e l'offset di avvio del volume non vengono modificati.
- Le dimensioni del volume non sono diminuite.
- Per i dischi GPT, l'identificatore di partizione non viene modificato.
Un disco dinamico non viene ricreato se il layout del disco è intatto o sono state apportate solo modifiche aggiuntive. Affinché un disco dinamico sia intatto, è necessario soddisfare tutte le condizioni per un disco di base. Inoltre, la struttura del volume dell'intero pacchetto di dischi deve essere intatta. La struttura del volume del pacchetto di dischi è intatta se soddisfa le condizioni seguenti, che si applicano sia ai dischi MBR che ai dischi GPT:
Il numero di volumi disponibili nel pacchetto fisico durante il ripristino deve essere maggiore o uguale al numero di volumi specificati nei metadati del writer ASR durante il backup.
Il numero di plexes per volume deve essere invariato.
Il numero degli extent del disco fisico deve essere superiore al numero di extent del disco specificati nei metadati del writer ASR.
Un pacchetto intatto rimane intatto quando vengono aggiunti volumi aggiuntivi o se un volume nel pacchetto viene esteso (ad esempio, da un volume semplice a un volume esteso).
Nota
Se viene eseguito il mirroring di un volume semplice, il pack non è intatto e verrà ricreato per garantire che lo stato del BCD e del volume di avvio sia mantenuto coerente dopo il ripristino. Se i volumi vengono eliminati, il pacchetto viene ricreato.
Se la struttura del volume del pacchetto di disco dinamico è intatta e sono state apportate solo modifiche additive, i dischi nel pacchetto non vengono ricreati.
Windows Vista: i dischi dinamici vengono sempre ricreati. Si noti che questo comportamento è stato modificato con Windows Server 2008 e Windows Vista con Service Pack 1 (SP1).
In qualsiasi momento prima dell'inizio della fase di ripristino, il richiedente può specificare che i dischi devono essere formattati rapidamente impostando il HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\ASR\RestoreSession chiave del Registro di sistema. In questa chiave è presente un valore denominato QuickFormat con il tipo di dati REG_DWORD. Se questo valore non esiste, è necessario crearlo. Impostare i dati del valore QuickFormat su 1 per la formattazione rapida o 0 per la formattazione lenta.
Se il valore QuickFormat non esiste, i dischi verranno formattati lentamente.
La formattazione rapida è notevolmente più veloce rispetto alla formattazione lenta (detta anche formattazione completa). Tuttavia, la formattazione rapida non verifica ogni settore nel volume.
Panoramica delle attività di fase di ripristino
In fase di ripristino, il richiedente esegue i passaggi seguenti:
Nota
Tutti i passaggi sono necessari se non diversamente indicato.
Chiamare la funzione CreateVssBackupComponents per creare un'istanza dell'interfaccia IVssBackupComponents e chiamare il metodo IVssBackupComponents::InitializeForRestore per inizializzare l'istanza per il ripristino caricando il documento dei componenti di backup del richiedente nell'istanza.
[Questo passaggio è obbligatorio solo se il richiedente deve modificare se "IncludeDisk" o "ExcludeDisk" è specificato per uno o più dischi.] Chiamare IVssBackupComponents::SetRestoreOptions per impostare le opzioni di ripristino per i componenti del writer asr. Il writer ASR supporta le opzioni seguenti: "IncludeDisk" consente al richiedente di includere un disco nel sistema di destinazione per il ripristino, anche se non è stato selezionato durante la fase di backup. "ExcludeDisk" consente al richiedente di impedire la ricreazione di un disco nel sistema di destinazione. Si noti che se si specifica "ExcludeDisk" per un disco che contiene un volume critico, la chiamata successiva a IVssBackupComponents::PreRestore non riuscirà.
Nell'esempio seguente viene illustrato come usare SetRestoreOptions per impedire la ricreazione del disco 0 e del disco 1 e l'inserimento di driver di terze parti nel volume di avvio ripristinato.
Windows Server 2008, Windows Vista, Windows Server 2003 e Windows XP: l'inserimento di driver di terze parti non è supportato.
Nell'esempio si presuppone che il puntatore IVssBackupComponents, m_pBackupComponents, sia valido.
m_pBackupComponents->SetRestoreOptions( AsrWriterId, VSS_CT_FILEGROUP, NULL, TEXT("ASR"), TEXT("\"ExcludeDisk\"=\"0\", \"ExcludeDisk\"=\"1\" "), TEXT("\"InjectDrivers\"=\"1\" ") );
Per escludere tutti i dischi per un volume specificato, vedere "Esclusione di tutti i dischi per un volume" di seguito.
Chiamare IVssBackupComponents::PreRestore per notificare al writer ASR di prepararsi per un'operazione di ripristino. Chiamare IVssAsync::QueryStatus quante volte necessario fino a quando il valore di stato restituito nel parametro pHrResult non è VSS_S_ASYNC_PENDING.
Ripristinare i dati. Nella fase di ripristino, ASR riconfigura il percorso GUID del volume (\?\Volume{GUID}) per ogni volume in modo che corrisponda al percorso GUID del volume usato durante la fase di backup. Tuttavia, le lettere di unità non vengono mantenute, perché ciò causerebbe conflitti con le lettere di unità assegnate automaticamente nell'ambiente di ripristino. Pertanto, quando si ripristinano i dati, il richiedente deve usare percorsi GUID del volume, non lettere di unità, per accedere ai volumi.
Impostare la chiave del Registro di sistema HKLM\SOFTWARE\Microsoft\Windows NT\CurrentVersion\ASR\RestoreSession per indicare il set di volumi ripristinati o riformattati.
In questa chiave è presente un valore denominato RestoredVolumes con il tipo di dati REG_MULTI_SZ. Se questo valore non esiste, è necessario crearlo. In corrispondenza di questo valore, il richiedente deve creare una voce GUID del volume per ogni volume ripristinato. Questa voce deve essere nel formato seguente: \\?\Volume{78618c8f-aefd-11da-a898-806e6f6e6963}. Ogni volta che viene eseguito un ripristino bare metal, ASR imposta il valore RestoredVolumes sul set di volumi ripristinati. Se il richiedente ha ripristinato volumi aggiuntivi, deve impostare questo valore sull'unione del set di volumi ripristinati dal richiedente e sul set di volumi ripristinati da ASR. Se il richiedente non ha utilizzato ASR, dovrebbe sostituire l'elenco dei volumi.
È anche necessario creare un valore denominato LastInstance con il tipo di dati REG_SZ. Questa chiave deve contenere un cookie casuale che identifica in modo univoco l'operazione di ripristino corrente. È possibile creare un cookie di questo tipo usando le funzioni di UuidCreate e UuidToString. Ogni volta che viene eseguito un ripristino bare metal, asr reimposta questo valore del Registro di sistema per notificare ai richiedenti e alle applicazioni di backup non VSS che si è verificato il ripristino.
Chiamare IVssBackupComponents::PostRestore per indicare la fine dell'operazione di ripristino. Chiamare IVssAsync::QueryStatus quante volte necessario fino a quando il valore di stato restituito nel parametro pHrResult non è VSS_S_ASYNC_PENDING.
Nella fase di ripristino, l'asr può creare o rimuovere partizioni per ripristinare lo stato precedente del computer. I richiedenti non devono tentare di eseguire il mapping dei numeri di disco dalla fase di backup alla fase di ripristino.
Al ripristino, il richiedente deve escludere il disco che contiene il set di backup del richiedente. In caso contrario, il set di backup può essere sovrascritto dall'operazione di ripristino.
Durante il ripristino, un disco viene escluso se non è stato selezionato come componente durante il backup o se viene escluso in modo esplicito chiamando IVssBackupComponents::SetRestoreOptions con l'opzione "ExcludeDisk" durante il ripristino.
È importante notare che durante il ripristino di emergenza WinPE, la funzionalità ASR writer è presente, ma non sono disponibili altri writer e il servizio VSS non viene eseguito. Al termine del ripristino di emergenza WinPE, il computer è stato riavviato e il sistema operativo Windows è in esecuzione normalmente, il servizio VSS può essere avviato e il richiedente può eseguire eventuali operazioni di ripristino aggiuntive che richiedono la partecipazione di writer diversi dal writer ASR.
Se durante la sessione di ripristino l'applicazione di backup rileva che gli ID univoci del volume sono invariati e pertanto tutti i volumi dal momento in cui il backup è presente e intatto in WinPE, l'applicazione di backup può procedere a ripristinare solo il contenuto dei volumi, senza coinvolgere ASR. In questo caso, l'applicazione di backup deve indicare che il computer è stato ripristinato impostando la chiave del Registro di sistema seguente nel sistema operativo ripristinato: HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\ASR\RestoreSession
In questa chiave specificare LastInstance per il nome del valore, REG_SZ per il tipo di valore e un cookie casuale (ad esempio un GUID creato dalla funzione UuidCreate) per i dati del valore.
Se durante la sessione di ripristino l'applicazione di backup rileva che uno o più volumi sono stati modificati o mancanti, l'applicazione di backup deve usare ASR per eseguire il ripristino. ASR creerà nuovamente i volumi esattamente come erano al momento del backup e imposterà la chiave del Registro di sistema RestoreSession.
Escludere tutti i dischi da un volume
Nell'esempio seguente viene illustrato come escludere tutti i dischi per un volume specificato.
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 );
}