使用 PowerShell 备份和还原虚拟机

本文展示了如何使用 Azure PowerShell cmdlet 从恢复服务保管库备份和恢复 Azure 虚拟机 (VM)。 恢复服务保管库是一种 Azure 资源管理器资源,用于保护 Azure 备份和 Azure Site Recovery 服务中的数据与资产。

Note

Azure 有两种用于创建和使用资源的部署模型: Resource Manager 部署模型和经典部署模型。 本文针对使用 Resource Manager 模型创建的 VM。

本文逐步指导用户使用 PowerShell 来保护 VM,以及从恢复点还原数据。

概念

如果不熟悉 Azure 备份服务,请参阅什么是 Azure 备份?一文来大致了解该服务。 在开始之前,请确保已满足 Azure 备份所需的先决条件,并了解当前 VM 备份解决方案的限制。

若要有效地使用 PowerShell,必须了解对象的层次结构以及从何处开始。

恢复服务对象层次结构

若要查看 AzureRm.RecoveryServices.Backup PowerShell cmdlet 参考,请参阅 Azure 库中的 Azure Backup - Recovery Services Cmdlets(Azure 备份 - 恢复服务 Cmdlet)。

设置和注册

开始时,请执行以下操作:

  1. 下载最新版本的 PowerShell(所需的最低版本为 1.4.0)

  2. 键入以下命令查找可用的 Azure 备份 PowerShell cmdlet:

    Get-Command *azurermrecoveryservices*
    

    这将显示 Azure 备份、Azure Site Recovery 和恢复服务保管库的别名和 cmdlet。 下图是你将看到的内容的一个示例。 它不是完整的 cmdlet 列表。

    恢复服务的列表

  3. 使用 Connect-AzureRmAccount -Environment AzureChinaCloud 登录到 Azure 帐户。 此 cmdlet 打开一个网页,提示输入帐户凭据:

    • 也可使用 -Credential 参数将帐户凭据作为参数包含在 Connect-AzureRmAccount -Environment AzureChinaCloud cmdlet 中。
    • 如果是代表租户的 CSP 合作伙伴,则需使用 tenantID 或租户主域名将客户指定为一名租户。 例如:Connect-AzureRmAccount -Environment AzureChinaCloud -Tenant "fabrikam.com"
  4. 由于一个帐户可以有多个订阅,因此请将要使用的订阅与帐户关联在一起:

    Select-AzureRmSubscription -SubscriptionName $SubscriptionName
    
  5. 如果你是首次使用 Azure 备份,必须使用 Register-AzureRmResourceProvider cmdlet 将 Azure 恢复服务提供程序注册到订阅。

    Register-AzureRmResourceProvider -ProviderNamespace "Microsoft.RecoveryServices"
    
  6. 可使用以下命令验证提供程序是否已成功注册:

    Get-AzureRmResourceProvider -ProviderNamespace "Microsoft.RecoveryServices"
    

    在命令输出中,RegistrationState 应当会变为 Registered。 如果没有,只需重新运行 Register-AzureRmResourceProvider cmdlet 即可。

使用 PowerShell 可以自动化以下任务:

创建恢复服务保管库

以下步骤引导用户创建恢复服务保管库。 恢复服务保管库不同于备份保管库。

  1. 恢复服务保管库是一种 Resource Manager 资源,因此需要将它放在资源组中。 可以使用现有的资源组,也可以使用 New-AzureRmResourceGroup cmdlet 创建资源组。 创建资源组时,请指定资源组的名称和位置。

    New-AzureRmResourceGroup -Name "test-rg" -Location "China North"
    
  2. 使用 New-AzureRmRecoveryServicesVault cmdlet 创建恢复服务保管库。 确保为保管库指定的位置与用于资源组的位置是相同的。

    New-AzureRmRecoveryServicesVault -Name "testvault" -ResourceGroupName "test-rg" -Location "China North"
    
  3. 指定要使用的存储冗余类型;可以使用本地冗余存储 (LRS)异地冗余存储 (GRS)。 以下示例显示,testvault 的 -BackupStorageRedundancy 选项设置为 GeoRedundant。

    $vault1 = Get-AzureRmRecoveryServicesVault -Name "testvault"
    Set-AzureRmRecoveryServicesBackupProperties  -Vault $vault1 -BackupStorageRedundancy GeoRedundant
    

    Tip

    许多 Azure 备份 cmdlet 要求使用恢复服务保管库对象作为输入。 出于此原因,在变量中存储备份恢复服务保管库对象可提供方便。

查看订阅中的保管库

若要查看订阅中的所有保管库,请使用 Get-AzureRmRecoveryServicesVault

Get-AzureRmRecoveryServicesVault

输出类似于以下示例,请注意,提供了关联的 ResourceGroupName 和 Location。

Name              : Contoso-vault
ID                : /subscriptions/1234
Type              : Microsoft.RecoveryServices/vaults
Location          : ChinaNorth
ResourceGroupName : Contoso-docs-rg
SubscriptionId    : 1234-567f-8910-abc
Properties        : Microsoft.Azure.Commands.RecoveryServices.ARSVaultProperties

备份 Azure VM

使用恢复服务保管库保护虚拟机。 应用保护前,请先设置保管库上下文(保管库中受保护的数据类型)并验证保护策略。 保护策略是指备份作业运行时以及每个备份快照的保留时长的计划。

设置保管库上下文

在 VM 上启用保护之前,请使用 Set-AzureRmRecoveryServicesVaultContext 来设置保管库上下文。 设置保管库上下文后,它将应用于所有后续 cmdlet。 以下示例为保管库 testvault 设置保管库上下文。

Get-AzureRmRecoveryServicesVault -Name "testvault" | Set-AzureRmRecoveryServicesVaultContext

创建保护策略

在创建恢复服务保管库时,它附带了默认的保护和保留策略。 默认保护策略在每天的指定时间触发备份作业。 默认保留策略将每日恢复点保留 30 天。 可以使用默认策略快速保护 VM,以后再使用不同的详细信息编辑该策略。

若要查看保管库中可用的保护策略,请使用 Get-AzureRmRecoveryServicesBackupProtectionPolicy。 可以使用此 cmdlet 获取特定策略,或者查看与某个工作负荷类型关联的策略。 以下示例获取适用于工作负荷类型 AzureVM 的策略。

Get-AzureRmRecoveryServicesBackupProtectionPolicy -WorkloadType "AzureVM"

输出类似于以下示例:

Name                 WorkloadType       BackupManagementType BackupTime                DaysOfWeek
----                 ------------       -------------------- ----------                ----------
DefaultPolicy        AzureVM            AzureVM              4/14/2016 5:00:00 PM

Note

PowerShell 中 BackupTime 字段的时区是 UTC。 但是,在 Azure 门户中显示备份时间时,时间根据本地时区调整。

一个备份保护策略至少与一个保留策略相关联。 保留策略定义了在将恢复点删除之前将其保留多长时间。 可以使用 Get-AzureRmRecoveryServicesBackupRetentionPolicyObject 查看默认保留策略。 类似地,可以使用 Get-AzureRmRecoveryServicesBackupSchedulePolicyObject 获取默认计划策略。 New-AzureRmRecoveryServicesBackupProtectionPolicy cmdlet 创建用于保存备份策略信息的 PowerShell 对象。 计划和保留策略对象将用作 New-AzureRmRecoveryServicesBackupProtectionPolicy cmdlet 的输入。 以下示例将计划策略和保留策略存储在变量中。 此示例使用这些变量来定义在创建保护策略 NewPolicy 时要使用的参数。

$schPol = Get-AzureRmRecoveryServicesBackupSchedulePolicyObject -WorkloadType "AzureVM"
$retPol = Get-AzureRmRecoveryServicesBackupRetentionPolicyObject -WorkloadType "AzureVM"
New-AzureRmRecoveryServicesBackupProtectionPolicy -Name "NewPolicy" -WorkloadType "AzureVM" -RetentionPolicy $retPol -SchedulePolicy $schPol

输出类似于以下示例:

Name                 WorkloadType       BackupManagementType BackupTime                DaysOfWeek
----                 ------------       -------------------- ----------                ----------
NewPolicy           AzureVM            AzureVM              4/24/2016 1:30:00 AM

启用保护

在定义保护策略后,还必须为相应的项启用该策略。 可以使用 Enable-AzureRmRecoveryServicesBackupProtection 来启用保护。 启用保护需要两个对象 - 项和策略。 将策略与保管库关联之后,将在策略计划中定义的时间触发备份工作流。

以下示例使用策略 NewPolicy 为项 V2VM 启用保护。 根据 VM 是否已加密以及采用了何种加密类型,示例将有所不同。

非加密资源管理器 VM 上启用保护:

$pol = Get-AzureRmRecoveryServicesBackupProtectionPolicy -Name "NewPolicy"
Enable-AzureRmRecoveryServicesBackupProtection -Policy $pol -Name "V2VM" -ResourceGroupName "RGName1"

若要在加密 VM(使用 BEK 和 KEK 加密的) 上启用保护,必须向 Azure 备份服务授予权限来读取密钥保管库中的密钥和机密。

Set-AzureRmKeyVaultAccessPolicy -VaultName "KeyVaultName" -ResourceGroupName "RGNameOfKeyVault" -PermissionsToKeys backup,get,list -PermissionsToSecrets get,list -ServicePrincipalName 262044b1-e2ce-469f-a196-69ab7ada62d3
$pol = Get-AzureRmRecoveryServicesBackupProtectionPolicy -Name "NewPolicy"
Enable-AzureRmRecoveryServicesBackupProtection -Policy $pol -Name "V2VM" -ResourceGroupName "RGName1"

若要在加密 VM(仅使用 BEK 加密的) 上启用保护,必须向 Azure 备份服务授予权限来读取密钥保管库中的机密。

Set-AzureRmKeyVaultAccessPolicy -VaultName "KeyVaultName" -ResourceGroupName "RGNameOfKeyVault" -PermissionsToSecrets backup,get,list -ServicePrincipalName 262044b1-e2ce-469f-a196-69ab7ada62d3
$pol = Get-AzureRmRecoveryServicesBackupProtectionPolicy -Name "NewPolicy"
Enable-AzureRmRecoveryServicesBackupProtection -Policy $pol -Name "V2VM" -ResourceGroupName "RGName1"

Note

如果使用 Azure 政府云,请为 Set-AzureRmKeyVaultAccessPolicy cmdlet 中的参数 -ServicePrincipalName 使用值 ff281ffe-705c-4f53-9f37-a40e6f2c68f3。

在经典 VM 上启用保护:

$pol = Get-AzureRmRecoveryServicesBackupProtectionPolicy -Name "NewPolicy"
Enable-AzureRmRecoveryServicesBackupProtection -Policy $pol -Name "V1VM" -ServiceName "ServiceName1"

修改保护策略

若要修改保护策略,请使用 Set-AzureRmRecoveryServicesBackupProtectionPolicy 修改 SchedulePolicy 或 RetentionPolicy 对象。

以下示例将恢复点保留期更改为 365 天。

$retPol = Get-AzureRmRecoveryServicesBackupRetentionPolicyObject -WorkloadType "AzureVM"
$retPol.DailySchedule.DurationCountInDays = 365
$pol = Get-AzureRmRecoveryServicesBackupProtectionPolicy -Name "NewPolicy"
Set-AzureRmRecoveryServicesBackupProtectionPolicy -Policy $pol  -RetentionPolicy $RetPol

触发备份

可以使用 Backup-AzureRmRecoveryServicesBackupItem 来触发备份作业。 如果它是初始备份,则是一个完整备份。 后续备份将创建增量副本。 在触发备份作业之前,请确保使用 Set-AzureRmRecoveryServicesVaultContext 来设置保管库上下文。 以下示例假定已设置了保管库上下文。

$namedContainer = Get-AzureRmRecoveryServicesBackupContainer -ContainerType "AzureVM" -Status "Registered" -FriendlyName "V2VM"
$item = Get-AzureRmRecoveryServicesBackupItem -Container $namedContainer -WorkloadType "AzureVM"
$job = Backup-AzureRmRecoveryServicesBackupItem -Item $item

输出类似于以下示例:

WorkloadName     Operation            Status               StartTime                 EndTime                   JobID
------------     ---------            ------               ---------                 -------                   ----------
V2VM              Backup              InProgress          4/23/2016                  5:00:30 PM                cf4b3ef5-2fac-4c8e-a215-d2eba4124f27

Note

PowerShell 中 StartTime 和 EndTime 字段的时区是 UTC。 但是,在 Azure 门户中显示时间时,时间根据本地时区调整。

监视备份作业

可以在不使用 Azure 门户的情况下监视长时间运行的操作,例如备份作业。 若要获取正在进行的作业的状态,请使用 Get-AzureRmRecoveryservicesBackupJob cmdlet。 此 cmdlet 获取特定保管库的备份作业,并且该保管库是在保管库上下文中指定的。 以下示例将正在进行的作业的状态获取为数组,并将状态存储在 $joblist 变量中。

$joblist = Get-AzureRmRecoveryservicesBackupJob -Status "InProgress"
$joblist[0]

输出类似于以下示例:

WorkloadName     Operation            Status               StartTime                 EndTime                   JobID
------------     ---------            ------               ---------                 -------                   ----------
V2VM             Backup               InProgress            4/23/2016                5:00:30 PM                cf4b3ef5-2fac-4c8e-a215-d2eba4124f27

与其使用额外的不必要的代码来轮询这些作业的完成情况,不如使用 Wait-AzureRmRecoveryServicesBackupJob cmdlet。 该 cmdlet 暂停操作的执行,直到作业完成或达到了指定的超时值。

Wait-AzureRmRecoveryServicesBackupJob -Job $joblist[0] -Timeout 43200

还原 Azure VM

使用 Azure 门户还原 VM 与使用 PowerShell 还原 VM 存在重要区别。 如果使用 PowerShell,从恢复点创建磁盘和配置信息即可完成还原操作。 还原操作不会创建虚拟机。 若要通过磁盘创建虚拟机,请参阅通过存储磁盘创建 VM 部分。 如果不希望还原整个 VM,但希望从 Azure VM 备份还原或恢复几个文件,请参阅文件恢复部分

Tip

还原操作不会创建虚拟机。

下图显示了从 RecoveryServicesVault 到 BackupRecoveryPoint 的对象层次结构。

显示 BackupContainer 的恢复服务对象层次结构

若要还原备份数据,请确定已备份项目以及保留了时间点数据的恢复点。 可以使用 Restore-AzureRmRecoveryServicesBackupItem 将数据从保管库还原到你的帐户。

还原 Azure VM 的基本步骤是:

  • 选择 VM。
  • 选择恢复点。
  • 还原磁盘。
  • 基于还原后的磁盘创建 VM。

选择 VM

若要获取用于标识正确备份项的 PowerShell 对象,请从保管库中的容器开始,按对象层次结构进行操作。 要选择代表 VM 的容器,请使用 Get-AzureRmRecoveryServicesBackupContainer cmdlet,然后通过管道将其传递给 Get-AzureRmRecoveryServicesBackupItem cmdlet。

$namedContainer = Get-AzureRmRecoveryServicesBackupContainer  -ContainerType "AzureVM" -Status "Registered" -FriendlyName "V2VM"
$backupitem = Get-AzureRmRecoveryServicesBackupItem -Container $namedContainer  -WorkloadType "AzureVM"

选择恢复点

使用 Get-AzureRmRecoveryServicesBackupRecoveryPoint cmdlet 列出备份项的所有恢复点。 然后选择要还原的恢复点。 如果不确定要使用的恢复点,最好选择列表中最新的 RecoveryPointType = AppConsistent 恢复点。

在以下脚本中,变量 $rp 是一个数组,其中包含所选备份项在过去七天的恢复点。 该数组按时间进行反向排序,以最新的恢复点作为索引 0。 使用标准 PowerShell 数组索引选取恢复点。 在示例中,$rp[0] 选择最新的恢复点。

$startDate = (Get-Date).AddDays(-7)
$endDate = Get-Date
$rp = Get-AzureRmRecoveryServicesBackupRecoveryPoint -Item $backupitem -StartDate $startdate.ToUniversalTime() -EndDate $enddate.ToUniversalTime()
$rp[0]

输出类似于以下示例:

RecoveryPointAdditionalInfo :
SourceVMStorageType         : NormalStorage
Name                        : 15260861925810
ItemName                    : VM;iaasvmcontainer;RGName1;V2VM
RecoveryPointId             : /subscriptions/XX/resourceGroups/ RGName1/providers/Microsoft.RecoveryServices/vaults/testvault/backupFabrics/Azure/protectionContainers/IaasVMContainer;iaasvmcontainer;RGName1;V2VM/protectedItems/VM;iaasvmcontainer; RGName1;V2VM/recoveryPoints/15260861925810
RecoveryPointType           : AppConsistent
RecoveryPointTime           : 4/23/2016 5:02:04 PM
WorkloadType                : AzureVM
ContainerName               : IaasVMContainer;iaasvmcontainer; RGName1;V2VM
ContainerType               : AzureVM
BackupManagementType        : AzureVM

还原磁盘

使用 Restore-AzureRmRecoveryServicesBackupItem cmdlet 将备份项的数据和配置还原到某个恢复点。 确定某个恢复点后,即可使用它作为 -RecoveryPoint 参数的值。 在上面的示例中,$rp[0] 是要使用的恢复点。 在下面的示例代码中,$rp[0] 是还原磁盘时要使用的恢复点。

还原磁盘和配置信息:

$restorejob = Restore-AzureRmRecoveryServicesBackupItem -RecoveryPoint $rp[0] -StorageAccountName "DestAccount" -StorageAccountResourceGroupName "DestRG"
$restorejob

输出类似于以下示例:

WorkloadName     Operation          Status               StartTime                 EndTime            JobID
------------     ---------          ------               ---------                 -------          ----------
V2VM              Restore           InProgress           4/23/2016 5:00:30 PM                        cf4b3ef5-2fac-4c8e-a215-d2eba4124f27

使用 Wait-AzureRmRecoveryServicesBackupJob cmdlet 等待还原作业完成。

Wait-AzureRmRecoveryServicesBackupJob -Job $restorejob -Timeout 43200

还原作业完成后,可以使用 Get-AzureRmRecoveryServicesBackupJobDetails cmdlet 获取还原操作的详细信息。 JobDetails 属性提供重建 VM 所需的信息。

$restorejob = Get-AzureRmRecoveryServicesBackupJob -Job $restorejob
$details = Get-AzureRmRecoveryServicesBackupJobDetails -Job $restorejob

还原磁盘以后,转到下一部分来了解如何创建 VM。

从还原的磁盘创建 VM

还原磁盘以后,通过以下步骤从磁盘创建和配置虚拟机。

Note

若要使用已还原的磁盘创建加密 VM,则 Azure 角色必须有权执行 Microsoft.KeyVault/vaults/deploy/action 操作。 如果用户角色不具有此权限,请创建具有此操作的自定义角色。 有关详细信息,请参阅 Custom Roles in Azure RBAC(Azure RBAC 中的自定义角色)。

  1. 查询已还原磁盘属性以获取作业详细信息。

    $properties = $details.properties
    $storageAccountName = $properties["Target Storage Account Name"]
    $containerName = $properties["Config Blob Container Name"]
    $configBlobName = $properties["Config Blob Name"]
    
  2. 设置 Azure 存储上下文和还原 JSON 配置文件。

    Set-AzureRmCurrentStorageAccount -Name $storageaccountname -ResourceGroupName "testvault"
    $destination_path = "C:\vmconfig.json"
    Get-AzureStorageBlobContent -Container $containerName -Blob $configBlobName -Destination $destination_path
    $obj = ((Get-Content -Path $destination_path -Raw -Encoding Unicode)).TrimEnd([char]0x00) | ConvertFrom-Json
    
  3. 使用 JSON 配置文件来创建 VM 配置。

    $vm = New-AzureRmVMConfig -VMSize $obj.'properties.hardwareProfile'.vmSize -VMName "testrestore"
    
  4. 附加 OS 磁盘和数据磁盘。 此步骤提供了各种托管和加密的 VM 配置的示例。 请使用适合你的 VM 配置的示例。

    • 非托管且非加密 VM - 对于非托管的非加密 VM,请使用以下示例。

      Set-AzureRmVMOSDisk -VM $vm -Name "osdisk" -VhdUri $obj.'properties.StorageProfile'.osDisk.vhd.Uri -CreateOption "Attach"
      $vm.StorageProfile.OsDisk.OsType = $obj.'properties.StorageProfile'.OsDisk.OsType
      foreach($dd in $obj.'properties.StorageProfile'.DataDisks)
      {
       $vm = Add-AzureRmVMDataDisk -VM $vm -Name "datadisk1" -VhdUri $dd.vhd.Uri -DiskSizeInGB 127 -Lun $dd.Lun -CreateOption "Attach"
      }
      
    • 非托管的加密 VM(仅限 BEK)- 对于非托管的加密 VM(仅使用 BEK 加密的),需要先将密码还原到密钥保管库,然后才能附加磁盘。 有关详细信息,请参阅从 Azure 备份恢复点还原加密虚拟机一文。 以下示例展示了如何为加密的 VM 附加 OS 和数据磁盘。 设置 OS 磁盘时,请确保提及相关的 OS 类型。

      $dekUrl = "https://ContosoKeyVault.vault.azure.cn:443/secrets/ContosoSecret007/xx000000xx0849999f3xx30000003163"
      $dekUrl = "/subscriptions/abcdedf007-4xyz-1a2b-0000-12a2b345675c/resourceGroups/ContosoRG108/providers/Microsoft.KeyVault/vaults/ContosoKeyVault"
      Set-AzureRmVMOSDisk -VM $vm -Name "osdisk" -VhdUri $obj.'properties.storageProfile'.osDisk.vhd.uri -DiskEncryptionKeyUrl $dekUrl -DiskEncryptionKeyVaultId $keyVaultId -CreateOption "Attach" -Windows/Linux
      $vm.StorageProfile.OsDisk.OsType = $obj.'properties.storageProfile'.osDisk.osType
      foreach($dd in $obj.'properties.storageProfile'.dataDisks)
      {
       $vm = Add-AzureRmVMDataDisk -VM $vm -Name "datadisk1" -VhdUri $dd.vhd.Uri -DiskSizeInGB 127 -Lun $dd.Lun -CreateOption "Attach"
      }
      

      可以使用以下命令来手动启用数据磁盘的加密。

      Set-AzureRmVMDiskEncryptionExtension -ResourceGroupName $RG -VMName $vm -AadClientID $aadClientID -AadClientSecret $aadClientSecret -DiskEncryptionKeyVaultUrl $dekUrl -DiskEncryptionKeyVaultId $dekUrl -VolumeType Data
      
    • 非托管的加密 VM(BEK 和 KEK)- 对于非托管的加密 VM(使用 BEK 和 KEK 加密的),需要先将密钥和机密还原到密钥保管库,然后才能附加磁盘。 有关详细信息,请参阅从 Azure 备份恢复点还原加密虚拟机一文。 以下示例展示了如何为加密的 VM 附加 OS 和数据磁盘。

      $dekUrl = "https://ContosoKeyVault.vault.azure.cn:443/secrets/ContosoSecret007/xx000000xx0849999f3xx30000003163"
      $kekUrl = "https://ContosoKeyVault.vault.azure.cn:443/keys/ContosoKey007/x9xxx00000x0000x9b9949999xx0x006"
      $keyVaultId = "/subscriptions/abcdedf007-4xyz-1a2b-0000-12a2b345675c/resourceGroups/ContosoRG108/providers/Microsoft.KeyVault/vaults/ContosoKeyVault"
      Set-AzureRmVMOSDisk -VM $vm -Name "osdisk" -VhdUri $obj.'properties.storageProfile'.osDisk.vhd.uri -DiskEncryptionKeyUrl $dekUrl -DiskEncryptionKeyVaultId $keyVaultId -KeyEncryptionKeyUrl $kekUrl -KeyEncryptionKeyVaultId $keyVaultId -CreateOption "Attach" -Windows
      $vm.StorageProfile.OsDisk.OsType = $obj.'properties.storageProfile'.osDisk.osType
      foreach($dd in $obj.'properties.storageProfile'.dataDisks)
       {
       $vm = Add-AzureRmVMDataDisk -VM $vm -Name "datadisk1" -VhdUri $dd.vhd.Uri -DiskSizeInGB 127 -Lun $dd.Lun -CreateOption "Attach"
       }
      

      可以使用以下命令来手动启用数据磁盘的加密。

      Set-AzureRmVMDiskEncryptionExtension -ResourceGroupName $RG -VMName $vm -AadClientID $aadClientID -AadClientSecret $aadClientSecret -DiskEncryptionKeyVaultUrl $dekUrl -DiskEncryptionKeyVaultId $dekUrl -KeyEncryptionKeyUrl $kekUrl -KeyEncryptionKeyVaultId $keyVaultId -VolumeType Data
      
    • 托管的非加密 VM - 对于托管的非加密 VM,需要从 blob 存储创建托管磁盘,然后附加磁盘。 有关详细信息,请参阅使用 PowerShell 将数据磁盘附加到 Windows VM 一文。 以下示例代码展示了如何为托管非加密型 VM 附加数据磁盘。

      $storageType = "StandardLRS"
      $osDiskName = $vm.Name + "_osdisk"
      $osVhdUri = $obj.'properties.storageProfile'.osDisk.vhd.uri
      $diskConfig = New-AzureRmDiskConfig -AccountType $storageType -Location "China North" -CreateOption Import -SourceUri $osVhdUri
      $osDisk = New-AzureRmDisk -DiskName $osDiskName -Disk $diskConfig -ResourceGroupName "test"
      Set-AzureRmVMOSDisk -VM $vm -ManagedDiskId $osDisk.Id -CreateOption "Attach" -Windows
      foreach($dd in $obj.'properties.storageProfile'.dataDisks)
       {
       $dataDiskName = $vm.Name + $dd.name ;
       $dataVhdUri = $dd.vhd.uri ;
       $dataDiskConfig = New-AzureRmDiskConfig -AccountType $storageType -Location "China North" -CreateOption Import -SourceUri $dataVhdUri ;
       $dataDisk2 = New-AzureRmDisk -DiskName $dataDiskName -Disk $dataDiskConfig -ResourceGroupName "test" ;
       Add-AzureRmVMDataDisk -VM $vm -Name $dataDiskName -ManagedDiskId $dataDisk2.Id -Lun $dd.Lun -CreateOption "Attach"
       }
      
    • 托管的加密 VM(仅限 BEK)- 对于托管的加密 VM(仅使用 BEK 加密的),需要从 Blob 存储创建托管磁盘,然后附加磁盘。 有关详细信息,请参阅使用 PowerShell 将数据磁盘附加到 Windows VM 一文。 以下示例代码展示了如何为托管加密 VM 附加数据磁盘。

      $dekUrl = "https://ContosoKeyVault.vault.azure.cn:443/secrets/ContosoSecret007/xx000000xx0849999f3xx30000003163"
      $keyVaultId = "/subscriptions/abcdedf007-4xyz-1a2b-0000-12a2b345675c/resourceGroups/ContosoRG108/providers/Microsoft.KeyVault/vaults/ContosoKeyVault"
      $storageType = "StandardLRS"
      $osDiskName = $vm.Name + "_osdisk"
      $osVhdUri = $obj.'properties.storageProfile'.osDisk.vhd.uri
      $diskConfig = New-AzureRmDiskConfig -AccountType $storageType -Location "China North" -CreateOption Import -SourceUri $osVhdUri
      $osDisk = New-AzureRmDisk -DiskName $osDiskName -Disk $diskConfig -ResourceGroupName "test"
      Set-AzureRmVMOSDisk -VM $vm -ManagedDiskId $osDisk.Id -DiskEncryptionKeyUrl $dekUrl -DiskEncryptionKeyVaultId $keyVaultId -CreateOption "Attach" -Windows
      foreach($dd in $obj.'properties.storageProfile'.dataDisks)
       {
       $dataDiskName = $vm.Name + $dd.name ;
       $dataVhdUri = $dd.vhd.uri ;
       $dataDiskConfig = New-AzureRmDiskConfig -AccountType $storageType -Location "China North" -CreateOption Import -SourceUri $dataVhdUri ;
       $dataDisk2 = New-AzureRmDisk -DiskName $dataDiskName -Disk $dataDiskConfig -ResourceGroupName "test" ;
       Add-AzureRmVMDataDisk -VM $vm -Name $dataDiskName -ManagedDiskId $dataDisk2.Id -Lun $dd.Lun -CreateOption "Attach"
       }
      

      可以使用以下命令来手动启用数据磁盘的加密。

      Set-AzureRmVMDiskEncryptionExtension -ResourceGroupName $RG -VMName $vm -AadClientID $aadClientID -AadClientSecret $aadClientSecret -DiskEncryptionKeyVaultUrl $dekUrl -DiskEncryptionKeyVaultId $keyVaultId -VolumeType Data
      
    • 托管的加密 VM(BEK 和 KEK)- 对于托管的加密 VM(使用 BEK 和 KEK 加密的),需要从 Blob 存储创建托管磁盘,然后附加磁盘。 有关详细信息,请参阅使用 PowerShell 将数据磁盘附加到 Windows VM 一文。 以下示例代码展示了如何为托管加密 VM 附加数据磁盘。

      $dekUrl = "https://ContosoKeyVault.vault.azure.cn:443/secrets/ContosoSecret007/xx000000xx0849999f3xx30000003163"
      $kekUrl = "https://ContosoKeyVault.vault.azure.cn:443/keys/ContosoKey007/x9xxx00000x0000x9b9949999xx0x006"
      $keyVaultId = "/subscriptions/abcdedf007-4xyz-1a2b-0000-12a2b345675c/resourceGroups/ContosoRG108/providers/Microsoft.KeyVault/vaults/ContosoKeyVault"
      $storageType = "StandardLRS"
      $osDiskName = $vm.Name + "_osdisk"
      $osVhdUri = $obj.'properties.storageProfile'.osDisk.vhd.uri
      $diskConfig = New-AzureRmDiskConfig -AccountType $storageType -Location "China North" -CreateOption Import -SourceUri $osVhdUri
      $osDisk = New-AzureRmDisk -DiskName $osDiskName -Disk $diskConfig -ResourceGroupName "test"
      Set-AzureRmVMOSDisk -VM $vm -ManagedDiskId $osDisk.Id -DiskEncryptionKeyUrl $dekUrl -DiskEncryptionKeyVaultId $keyVaultId -KeyEncryptionKeyUrl $kekUrl -KeyEncryptionKeyVaultId $keyVaultId -CreateOption "Attach" -Windows
      foreach($dd in $obj.'properties.storageProfile'.dataDisks)
       {
       $dataDiskName = $vm.Name + $dd.name ;
       $dataVhdUri = $dd.vhd.uri ;
       $dataDiskConfig = New-AzureRmDiskConfig -AccountType $storageType -Location "China North" -CreateOption Import -SourceUri $dataVhdUri ;
       $dataDisk2 = New-AzureRmDisk -DiskName $dataDiskName -Disk $dataDiskConfig -ResourceGroupName "test" ;
       Add-AzureRmVMDataDisk -VM $vm -Name $dataDiskName -ManagedDiskId $dataDisk2.Id -Lun $dd.Lun -CreateOption "Attach"
       }
      

      可以使用以下命令来手动启用数据磁盘的加密。

      Set-AzureRmVMDiskEncryptionExtension -ResourceGroupName $RG -VMName $vm -AadClientID $aadClientID -AadClientSecret $aadClientSecret -DiskEncryptionKeyVaultUrl $dekUrl -DiskEncryptionKeyVaultId $dekUrl -KeyEncryptionKeyUrl $kekUrl -KeyEncryptionKeyVaultId $keyVaultId -VolumeType Data
      
  5. 设置网络设置。

    $nicName="p1234"
    $pip = New-AzureRmPublicIpAddress -Name $nicName -ResourceGroupName "test" -Location "ChinaNorth" -AllocationMethod Dynamic
    $virtualNetwork = New-AzureRmVirtualNetwork -ResourceGroupName "test" -Location "ChinaNorth" -Name "testvNET" -AddressPrefix 10.0.0.0/16
    $virtualNetwork | Set-AzureRmVirtualNetwork
    $vnet = Get-AzureRmVirtualNetwork -Name "testvNET" -ResourceGroupName "test"
    $subnetindex=0
    $nic = New-AzureRmNetworkInterface -Name $nicName -ResourceGroupName "test" -Location "ChinaNorth" -SubnetId $vnet.Subnets[$subnetindex].Id -PublicIpAddressId $pip.Id
    $vm=Add-AzureRmVMNetworkInterface -VM $vm -Id $nic.Id
    
  6. 创建虚拟机。

    New-AzureRmVM -ResourceGroupName "test" -Location "ChinaNorth" -VM $vm
    

从 Azure VM 备份还原文件

除了可以还原磁盘以外,还可以从 Azure VM 备份还原单个文件。 还原文件功能提供了对恢复点中的所有文件的访问权限。 可以像对普通文件那样通过文件资源管理器管理这些文件。

从 Azure VM 备份还原文件的基本步骤是:

  • 选择 VM
  • 选择恢复点
  • 装载恢复点的磁盘
  • 复制所需的文件
  • 卸载磁盘

选择 VM

若要获取用于标识正确备份项的 PowerShell 对象,请从保管库中的容器开始,按对象层次结构进行操作。 要选择代表 VM 的容器,请使用 Get-AzureRmRecoveryServicesBackupContainer cmdlet,然后通过管道将其传递给 Get-AzureRmRecoveryServicesBackupItem cmdlet。

$namedContainer = Get-AzureRmRecoveryServicesBackupContainer  -ContainerType "AzureVM" -Status "Registered" -FriendlyName "V2VM"
$backupitem = Get-AzureRmRecoveryServicesBackupItem -Container $namedContainer  -WorkloadType "AzureVM"

选择恢复点

使用 Get-AzureRmRecoveryServicesBackupRecoveryPoint cmdlet 列出备份项的所有恢复点。 然后选择要还原的恢复点。 如果不确定要使用的恢复点,最好选择列表中最新的 RecoveryPointType = AppConsistent 恢复点。

在以下脚本中,变量 $rp 是一个数组,其中包含所选备份项在过去七天的恢复点。 该数组按时间进行反向排序,以最新的恢复点作为索引 0。 使用标准 PowerShell 数组索引选取恢复点。 在示例中,$rp[0] 选择最新的恢复点。

$startDate = (Get-Date).AddDays(-7)
$endDate = Get-Date
$rp = Get-AzureRmRecoveryServicesBackupRecoveryPoint -Item $backupitem -StartDate $startdate.ToUniversalTime() -EndDate $enddate.ToUniversalTime()
$rp[0]

输出类似于以下示例:

RecoveryPointAdditionalInfo :
SourceVMStorageType         : NormalStorage
Name                        : 15260861925810
ItemName                    : VM;iaasvmcontainer;RGName1;V2VM
RecoveryPointId             : /subscriptions/XX/resourceGroups/ RGName1/providers/Microsoft.RecoveryServices/vaults/testvault/backupFabrics/Azure/protectionContainers/IaasVMContainer;iaasvmcontainer;RGName1;V2VM/protectedItems/VM;iaasvmcontainer; RGName1;V2VM/recoveryPoints/15260861925810
RecoveryPointType           : AppConsistent
RecoveryPointTime           : 4/23/2016 5:02:04 PM
WorkloadType                : AzureVM
ContainerName               : IaasVMContainer;iaasvmcontainer; RGName1;V2VM
ContainerType               : AzureVM
BackupManagementType        : AzureVM

装载恢复点的磁盘

使用 Get-AzureRmRecoveryServicesBackupRPMountScript cmdlet 获取用于装载恢复点的所有磁盘的脚本。

Note

这些磁盘作为 iSCSI 附加磁盘装载到运行此脚本的计算机中。 装载是即时发生的,并且不会产生任何费用。

Get-AzureRmRecoveryServicesBackupRPMountScript -RecoveryPoint $rp[0]

输出类似于以下示例:

OsType  Password        Filename
------  --------        --------
Windows e3632984e51f496 V2VM_wus2_8287309959960546283_451516692429_cbd6061f7fc543c489f1974d33659fed07a6e0c2e08740.exe

在要在它上面恢复文件的计算机上运行此脚本。 若要执行该脚本,必须输入所提供的密码。 附加磁盘后,使用 Windows 文件资源管理器浏览新的卷和文件。 有关详细信息,请参阅备份文章从 Azure 虚拟机备份恢复文件

卸载磁盘

复制所需的文件后,使用 Disable-AzureRmRecoveryServicesBackupRPMountScript 卸载磁盘。 请确保卸载磁盘,以便删除对恢复点的文件的访问权限。

Disable-AzureRmRecoveryServicesBackupRPMountScript -RecoveryPoint $rp[0]

后续步骤

如果你更愿意使用 PowerShell 来处理 Azure 资源,请参阅 PowerShell 文章:为 Windows Server 部署和管理备份。 如果管理 DPM 备份,请参阅为 DPM 部署和管理备份。 这两篇文章都为 Resource Manager 部署和经典部署提供了一个版本。