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ò usare il writer di ripristino automatico del sistema (ASR) insieme a Windows Preinstallation Environment (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 Le applicazioni che usano ASR devono concedere in licenza Windows PE.

Windows Server 2003 e Windows XP: AsR non viene implementato come writer VSS.

Per informazioni sugli strumenti di traccia che è possibile usare con ASR, vedere Using Tracing Tools with VSS ASR Applications.For information about tracing tools that you can use with ASR Applications, see Using Tracing Tools with VSS ASR Applications.

Contenuto dell'articolo:

Panoramica delle attività di fase di backup

Al momento del backup, il richiedente esegue i passaggi seguenti.

Nota

Tutti i passaggi sono obbligatori, se non diversamente indicato.

 

  1. Chiamare la funzione CreateVssBackupComponents per creare un'istanza dell'interfaccia IVssBackupComponents e chiamare il metodo IVssBackupComponents::InitializeForBackup per inizializzare l'istanza per gestire un backup.

  2. Chiamare IVssBackupComponents::SetContext per impostare il contesto per l'operazione di copia shadow.

  3. Chiamare IVssBackupComponents::SetBackupState per configurare il backup. Impostare il parametro bBackupBootableSystemStatesu true per indicare che il backup includerà uno stato del sistema di avvio.

  4. Scegliere quali componenti critici nel documento di metadati writer di ASR writer eseguire il backup e chiamare IVssBackupComponents::AddComponent per ognuno di essi.

  5. Chiamare IVssBackupComponents::StartSnapshotSet per creare un nuovo set di copie shadow vuoto.

  6. Chiamare IVssBackupComponents::GatherWriterMetadata per avviare un contatto asincrono con i writer.

  7. Chiamare IVssBackupComponents::GetWriterMetadata per recuperare il documento di metadati writer di ASR. L'ID writer per il writer ASR è BE000CBE-11FE-4426-9C58-531AA6355FC4 e la stringa del nome del writer è "ASR Writer".

  8. Chiamare IVssExamineWriterMetadata::SaveAsXML per salvare una copia del documento metadati writer di ASR writer.

  9. Chiamare IVssBackupComponents::AddToSnapshotSet per ogni volume che può partecipare alle copie shadow per aggiungere il volume al set di copie shadow.

  10. Chiamare IVssBackupComponents::P repareForBackup per notificare ai writer di preparare un'operazione di backup.

  11. Chiamare IVssBackupComponents::GatherWriterStatus e IVssBackupComponents::GetWriterStatus (o IVssBackupComponentsEx3::GetWriterStatus) per verificare lo stato del writer ASR.

  12. 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 mostra come visualizzare questi messaggi, vedere IVssComponentEx::GetPrepareForBackupFailureMsg.

  13. Chiamare IVssBackupComponents::D oSnapshotSet per creare una copia shadow del volume.

  14. Chiamare IVssBackupComponents::GatherWriterStatus e IVssBackupComponents::GetWriterStatus per verificare lo stato del writer ASR.

  15. Eseguire il backup dei dati.

  16. Indica se l'operazione di backup è riuscita chiamando IVssBackupComponents::SetBackupSucceeded.

  17. Chiamare IVssBackupComponents::BackupComplete per indicare che l'operazione di backup è stata completata.

  18. Chiamare IVssBackupComponents::GatherWriterStatus e IVssBackupComponents::GetWriterStatus. La memoria dello stato della sessione writer è una risorsa limitata e i writer devono infine riutilizzare gli stati della sessione. Questo passaggio contrassegna lo stato della sessione di backup del writer come completato e notifica a VSS 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.

     

  19. Chiamare IVssBackupComponents::SaveAsXML per salvare una copia del documento componenti di backup del richiedente. Le informazioni contenute nel documento Componenti di backup vengono utilizzate 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 di metadati writer:

  • Volumi critici, ad esempio i volumi boot, system 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 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 è necessario per 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 è un componente critico del sistema segnalato dal writer ASR.

     

  • Dischi. Ogni disco fisso nel computer viene esposto come componente in AsR. Se un disco non è stato escluso durante il backup, verrà assegnato durante il ripristino e potrà 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 viene 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 contenente informazioni sullo stato del sistema, è necessario selezionare anche ogni disco che contiene un extent per tale volume. Per trovare gli extent per un volume, usare 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 contenente 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 impedire che venga sovrascritto.

     

    In un ambiente di clustering 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 ( 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 altre informazioni su EFI ed ESP, vedere Guida introduttiva.

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 del disco. Per ottenere il numero del disco, usare il codice di controllo IOCTL_STORAGE_GET_DEVICE_NUMBER .

  • Per i componenti del volume, il formato è

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

    dove GUID è il GUID del volume.

  • Per il componente dell'archivio BCD, il formato è

    <COMPONENT logicalPath="BCD" componentName="BCD" componentType="filegroup" ComponentCaption = "This is the path to the boot BCD store and the boot managers... È 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 seguente chiave del Registro di sistema: HKEY_LOCAL_MACHINE\ SystemSetup\SystemPartition\

     

Nel ripristino, tutti i componenti contrassegnati come volumi critici devono essere ripristinati. Se non è possibile ripristinare uno o più volumi critici, l'operazione di ripristino ha esito negativo.

Nella fase 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 ridotte.
    • 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, tutte le condizioni per un disco di base devono essere soddisfatte. Inoltre, l'intera struttura del volume del pacchetto disco deve essere intatta. La struttura del volume del pacchetto disco è intatta se soddisfa le condizioni seguenti, che si applicano sia ai dischi MBR che 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 di membri deve essere invariato.

    • Il numero di extent del disco fisico deve essere maggiore del numero di extent di 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 pacchetto non è intatto e verrà ricreato per assicurarsi che lo stato del volume di avvio e BCD rimanga coerente dopo il ripristino. Se i volumi vengono eliminati, il pacchetto viene ricreato.

       

  • Se la struttura del volume del pacchetto dinamico è intatta e sono state apportate solo modifiche aggiuntive, 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 HKEY_LOCAL_MACHINE\ la chiave del Registro di sistemaSoftware\Microsoft\Windows NT\CurrentVersion\ASR\RestoreSession. 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 è significativamente più veloce rispetto alla formattazione lenta (denominata anche formattazione completa). Tuttavia, la formattazione rapida non verifica ogni settore nel volume.

Panoramica delle attività di fase di ripristino

Al momento del ripristino, il richiedente esegue la procedura seguente:

Nota

Tutti i passaggi sono necessari se non diversamente indicato.

 

  1. 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 Componenti backup del richiedente nell'istanza.

  2. [Questo passaggio è necessario 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 da considerare per il ripristino, anche se non è stato selezionato durante la fase di backup. "ExcludeDisk" consente al richiedente di impedire la creazione di un disco nel sistema di destinazione. Si noti che se viene specificato "ExcludeDisk" per un disco contenente un volume critico, la chiamata successiva a IVssBackupComponents::P reRestore avrà esito negativo.

    Nell'esempio seguente viene illustrato come usare SetRestoreOptions per impedire la creazione e il disco 1 del disco 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.

    L'esempio 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 la seguente sezione "Esclusione di tutti i dischi per un volume".

  3. Chiamare IVssBackupComponents::P reRestore per inviare una notifica al writer del servizio app per preparare un'operazione di ripristino. Chiamare IVssAsync::QueryStatus quante volte necessario finché il valore di stato restituito nel parametro pHrResult non è VSS_S_ASYNC_PENDING.

  4. 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 collisioni 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.

  5. 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 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 dall'asr. Se il richiedente non ha usato ASR, deve sostituire l'elenco di 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. Tale cookie può essere creato usando le funzioni 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.

  6. Chiamare IVssBackupComponents::P ostRestore per indicare la fine dell'operazione di ripristino. Chiamare IVssAsync::QueryStatus quante volte necessario finché il valore di stato restituito nel parametro pHrResult non è VSS_S_ASYNC_PENDING.

Nella fase di ripristino, il servizio app può creare o rimuovere partizioni per ripristinare il computer allo stato precedente. I richiedenti non devono tentare di eseguire il mapping dei numeri di disco dalla fase di backup alla fase di ripristino.

Nel 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.

Nel ripristino, un disco viene escluso se non è stato selezionato come componente durante il backup o se è esplicitamente escluso chiamando IVssBackupComponents::SetRestoreOptions con l'opzione "ExcludeDisk" durante il ripristino.

È importante notare che durante il ripristino di emergenza WinPE la funzionalità del writer ASR è presente, ma non sono disponibili altri writer e il servizio VSS non è in esecuzione. Dopo aver completato il 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 quindi tutti i volumi dal momento del backup sono presenti e intatti 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 vengono 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 imposta la chiave del Registro di sistema RestoreSession .

Esclusione di tutti i dischi per 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 );
}