使用 Azure CLI 还原 VM
Azure 备份可创建恢复点,这些恢复点存储在异地冗余的恢复保管库中。 从恢复点还原时,可以还原整个 VM,也可以还原单个文件。 本文介绍如何使用 CLI 还原完整的 VM。 本教程介绍如何执行下列操作:
- 列出和选择恢复点
- 从恢复点还原磁盘
- 从还原的磁盘创建 VM
有关使用 PowerShell 还原磁盘并创建已恢复的 VM 的信息,请参阅使用 PowerShell 备份和还原 Azure VM。
现在,还可以使用 CLI 将备份内容直接还原到 VM(原始/新),而无需单独执行上述步骤。 有关详细信息,请参阅使用 CLI 将数据还原到虚拟机。
先决条件
如需在本地运行 CLI 参考命令,请安装 Azure CLI。 如果在 Windows 或 macOS 上运行,请考虑在 Docker 容器中运行 Azure CLI。 有关详细信息,请参阅如何在 Docker 容器中运行 Azure CLI。
如果使用的是本地安装,请使用 az login 命令登录 Azure CLI。 若要完成身份验证过程,请遵循终端中显示的步骤。 有关其他登录选项,请参阅使用 Azure CLI 登录。
出现提示时,请在首次使用时安装 Azure CLI 扩展。 有关扩展详细信息,请参阅使用 Azure CLI 的扩展。
运行 az version 以查找安装的版本和依赖库。 若要升级到最新版本,请运行 az upgrade。
本教程需要 Azure CLI 版本 2.0.18 或更高版本。
本教程需要使用 Azure 备份所保护的 Linux VM。 若要模拟意外的 VM 删除和恢复过程,请从恢复点中的磁盘创建 VM。 如果需要使用 Azure 备份所保护的 Linux VM,请参阅在 Azure 中使用 CLI 备份虚拟机。
备份概述
当 Azure 启动备份时,VM 上的备份扩展将获取时点快照。 请求第一个备份时,将在 VM 上安装备份扩展。 如果进行备份时 VM 未运行,则 Azure 备份可能还需要获取基础存储的快照。
默认情况下,Azure 备份采用文件系统一致的备份。 Azure 备份获取快照后,数据将传输到恢复服务保管库。 为最大限度地提高效率,Azure 备份仅标识和传输自上次备份以后已更改的数据块。
数据传输完成后,会删除快照并创建恢复点。
列出可用的恢复点
若要还原磁盘,请选择恢复点作为恢复数据的源。 由于默认策略每天创建一个恢复点并保留 30 天,因此,可以保留一组恢复点,以便可以选择一个特定的时点用于恢复。
若要查看可用恢复点的列表,请使用 az backup recoverypoint list 命令。 将使用恢复点名称恢复磁盘。 在本教程中,我们希望最近的恢复点可用。 --query [0].name
参数可选择最近的恢复点名称,如下所示:
az backup recoverypoint list \
--resource-group myResourceGroup \
--vault-name myRecoveryServicesVault \
--backup-management-type AzureIaasVM \
--container-name myVM \
--item-name myVM \
--query [0].name \
--output tsv
还原 VM 磁盘
重要
强烈建议使用 Az CLI version 2.0.74 或更高版本,以享受快速还原的所有益处,包括托管磁盘还原。 最好始终使用最新版本。
托管磁盘还原
如果备份 VM 具有托管磁盘,并且其目的是从恢复点还原托管磁盘,则首先需提供 Azure 存储帐户。 此存储帐户用于存储 VM 配置和部署模板,这两者稍后可用于从还原的磁盘部署 VM。 然后,还为要还原复到的托管磁盘提供一个目标资源组。
若要创建存储帐户,请使用 az storage account create 命令。 存储帐户名称必须全部为小写,且全局唯一。 将 mystorageaccount 替换为你自己唯一的名称:
az storage account create \ --resource-group myResourceGroup \ --name mystorageaccount \ --sku Standard_LRS
使用 az backup restore restore-disks 从你的恢复点还原磁盘。 将 mystorageaccount 替换为你在前一个命令中创建的存储帐户的名称。 将 myRecoveryPointName 替换为你在前面的 az backup recoverypoint list 命令输出中获得的恢复点名称: 还需提供将托管磁盘还原到的目标资源组。
az backup restore restore-disks \ --resource-group myResourceGroup \ --vault-name myRecoveryServicesVault \ --container-name myVM \ --item-name myVM \ --storage-account mystorageaccount \ --rp-name myRecoveryPointName \ --target-resource-group targetRG
警告
如果未提供目标资源组,则托管磁盘将作为非托管磁盘还原到给定的存储帐户。 这会对还原时间产生重大影响,因为还原磁盘所需的时间完全取决于给定的存储帐户。 只有指定了 target-resource-group 参数,才能获得即时还原的好处。 如果打算将托管磁盘作为非托管磁盘还原,则不提供 target-resource-group 参数,而是改为提供 restore-as-unmanaged-disk 参数,如下所示。 此参数从 Azure CLI 3.4.0 开始提供。
az backup restore restore-disks \ --resource-group myResourceGroup \ --vault-name myRecoveryServicesVault \ --container-name myVM \ --item-name myVM \ --storage-account mystorageaccount \ --rp-name myRecoveryPointName \ --restore-as-unmanaged-disk
这会将托管磁盘作为非托管磁盘还原到给定存储帐户,并且不会利用“即时”还原功能。 在将来的 CLI 版本中,必须提供 target-resource-group 参数或 restore-as-unmanaged-disk 参数 。
将磁盘还原到次要区域
当你在已保护 VM 的保管库上启用跨区域还原时,会将备份数据复制到次要区域。 可使用备份数据来执行还原操作。
若要将磁盘还原到次要区域,请在 az backup restore restore-disks 中使用 --use-secondary-region
标志。 确保指定位于次要区域的目标存储帐户。
az backup restore restore-disks \
--resource-group myResourceGroup \
--vault-name myRecoveryServicesVault \
--container-name myVM \
--item-name myVM \
--storage-account targetStorageAccountID \
--rp-name myRecoveryPointName \
--target-resource-group targetRG
--use-secondary-region
跨区域还原
可以在同一区域的任何可用性区域中还原 Azure 区域固定的 VM。
若要将 VM 还原到另一个区域,请在 az backup restore restore-disks 命令中指定 TargetZoneNumber
参数。
az backup restore restore-disks \
--resource-group myResourceGroup \
--vault-name myRecoveryServicesVault \
--container-name myVM \
--item-name myVM \
--storage-account targetStorageAccountID \
--rp-name myRecoveryPointName \
--target-resource-group targetRG
--target-zone 3
仅在以下情况下支持跨区域还原:
- 源 VM 已进行区域固定且未加密。
- 恢复点仅存在于保管库层中。 不支持仅快照或快照和保管库层。
- 恢复选项是创建新的 VM 或还原磁盘。 替换磁盘选项替换源数据;因此可用性区域选项不适用。
- 当保管库的存储冗余为 ZRS 时,在同一区域中创建 VM/磁盘。 请注意,如果保管库的存储冗余为 GRS,则将不起作用,即使源 VM 进行了区域固定。
- 如果为跨区域还原启用了保管库的存储冗余,并且配对区域支持区域,则在配对区域中创建 VM/磁盘。
非托管磁盘还原
如果备份 VM 具有非托管磁盘,并且其目的是从恢复点还原磁盘,则首先需提供 Azure 存储帐户。 此存储帐户用于存储 VM 配置和部署模板,这两者稍后可用于从还原的磁盘部署 VM。 默认情况下,非托管磁盘将还原到其原始存储帐户。 若要将所有非托管磁盘还原到同一个位置,则还可以将给定的存储帐户也用作这些磁盘的暂存位置。
在其他步骤中,将使用还原的磁盘创建 VM。
若要创建存储帐户,请使用 az storage account create 命令。 存储帐户名称必须全部为小写,且全局唯一。 将 mystorageaccount 替换为你自己唯一的名称:
az storage account create \ --resource-group myResourceGroup \ --name mystorageaccount \ --sku Standard_LRS
使用 az backup restore restore-disks 从你的恢复点还原磁盘。 将 mystorageaccount 替换为你在前一个命令中创建的存储帐户的名称。 将 myRecoveryPointName 替换为你在前面的 az backup recoverypoint list 命令输出中获得的恢复点名称:
az backup restore restore-disks \ --resource-group myResourceGroup \ --vault-name myRecoveryServicesVault \ --container-name myVM \ --item-name myVM \ --storage-account mystorageaccount \ --rp-name myRecoveryPointName
如上所述,非托管磁盘将还原到其原始存储帐户。 这可提供最佳的还原性能。 但是,如果所有非托管磁盘都需要还原到给定的存储帐户,请使用相关标志,如下所示。
az backup restore restore-disks \
--resource-group myResourceGroup \
--vault-name myRecoveryServicesVault \
--container-name myVM \
--item-name myVM \
--storage-account mystorageaccount \
--rp-name myRecoveryPointName \
--restore-to-staging-storage-account
```
## Monitor the restore job
To monitor the status of restore job, use [az backup job list](https://learn.microsoft.com/cli/azure/backup/job#az-backup-job-list):
```azurecli
az backup job list \
--resource-group myResourceGroup \
--vault-name myRecoveryServicesVault \
--output table
输出类似于以下示例,该示例显示还原作业处于“正在进行”状态:
Name Operation Status Item Name Start Time UTC Duration
-------- --------------- ---------- ----------- ------------------- --------------
7f2ad916 Restore InProgress myvm 2017-09-19T19:39:52 0:00:34.520850
a0a8e5e6 Backup Completed myvm 2017-09-19T03:09:21 0:15:26.155212
fe5d0414 ConfigureBackup Completed myvm 2017-09-19T03:03:57 0:00:31.191807
如果还原作业的“状态”报告为“完成”,则系统已将必要的信息(VM 配置和部署模板)还原到存储帐户 。
使用托管标识来还原磁盘
Azure 备份还允许在还原操作期间使用托管标识 (MSI) 来访问必须将磁盘还原到的存储帐户。 目前仅托管磁盘还原支持此选项。
如果要使用保管库的系统分配的托管标识来还原磁盘,请向 az backup restore restore-disks 命令传递附加标志 --mi-system-assigned。 如果要使用用户分配的托管标识,请传递参数 -UserAssignedIdentityId,并将保管库的托管标识的 Azure 资源管理器 ID 作为参数的值。 请参阅此文,了解如何为保管库启用托管标识。
从还原的磁盘创建 VM
最后一步是从还原的磁盘创建 VM。 可以使用下载到给定存储帐户的部署模板来创建 VM。
提取作业详细信息
生成的作业详细信息提供可以查询和部署的模板 URI。 使用 job show 命令可获取触发的已还原作业的更多详细信息。
az backup job show \
-v myRecoveryServicesVault \
-g myResourceGroup \
-n 1fc2d55d-f0dc-4ca6-ad48-aca0fe5d0414
此查询的输出将提供所有详细信息,但我们只对存储帐户内容感兴趣。 可以使用 Azure CLI 的查询功能提取相关详细信息
az backup job show \
-v myRecoveryServicesVault \
-g myResourceGroup \
-n 1fc2d55d-f0dc-4ca6-ad48-aca0fe5d0414 \
--query properties.extendedInfo.propertyBag
{
"Config Blob Container Name": "myVM-daa1931199fd4a22ae601f46d8812276",
"Config Blob Name": "config-myVM-1fc2d55d-f0dc-4ca6-ad48-aca0fe5d0414.json",
"Config Blob Uri": "https://mystorageaccount.blob.core.chinacloudapi.cn/myVM-daa1931199fd4a22ae601f46d8812276/config-appvm8-1fc2d55d-f0dc-4ca6-ad48-aca0519c0232.json",
"Job Type": "Recover disks",
"Recovery point time ": "12/25/2019 10:07:11 PM",
"Target Storage Account Name": "mystorageaccount",
"Target resource group": "mystorageaccountRG",
"Template Blob Uri": "https://mystorageaccount.blob.core.chinacloudapi.cn/myVM-daa1931199fd4a22ae601f46d8812276/azuredeploy1fc2d55d-f0dc-4ca6-ad48-aca0519c0232.json"
}
提取部署模板
模板不能直接访问,因为它在客户的存储帐户和给定容器下。 需要完整的 URL(以及临时 SAS 令牌)才能访问此模板。
首先,从作业详细信息中提取模板 blob URI
az backup job show \
-v myRecoveryServicesVault \
-g myResourceGroup \
-n 1fc2d55d-f0dc-4ca6-ad48-aca0fe5d0414 \
--query properties.extendedInfo.propertyBag."""Template Blob Uri"""
"https://mystorageaccount.blob.core.chinacloudapi.cn/myVM-daa1931199fd4a22ae601f46d8812276/azuredeploy1fc2d55d-f0dc-4ca6-ad48-aca0519c0232.json"
模板 blob URI 将采用此格式并提取模板名称
https://<storageAccountName.blob.core.chinacloudapi.cn>/<containerName>/<templateName>
因此,以上示例中的模板名称将是 azuredeploy1fc2d55d-f0dc-4ca6-ad48-aca0519c0232.json
,而容器名称为 myVM-daa1931199fd4a22ae601f46d8812276
现在,请获取此容器和模板的 SAS 令牌(参阅此处了解详细信息)
expiretime=$(date -u -d '30 minutes' +%Y-%m-%dT%H:%MZ)
connection=$(az storage account show-connection-string \
--resource-group mystorageaccountRG \
--name mystorageaccount \
--query connectionString)
token=$(az storage blob generate-sas \
--container-name myVM-daa1931199fd4a22ae601f46d8812276 \
--name azuredeploy1fc2d55d-f0dc-4ca6-ad48-aca0519c0232.json \
--expiry $expiretime \
--permissions r \
--output tsv \
--connection-string $connection)
url=$(az storage blob url \
--container-name myVM-daa1931199fd4a22ae601f46d8812276 \
--name azuredeploy1fc2d55d-f0dc-4ca6-ad48-aca0519c0232.json \
--output tsv \
--connection-string $connection)
部署模板以创建 VM
现在部署模板来创建 VM,如此处所述。
az deployment group create \
--resource-group ExampleGroup \
--template-uri $url?$token
若要确认已从恢复的磁盘创建了 VM,请使用 az vm list 列出资源组中的 VM,如下所示:
az vm list --resource-group myResourceGroup --output table
使用 CLI 将数据还原到虚拟机
现在,无需执行多个步骤即可将数据直接还原到原始/备用 VM。
将数据还原到原始 VM
az backup restore restore-disks \
--resource-group myResourceGroup \
--vault-name myRecoveryServicesVault \
--container-name myVM \
--item-name myVM \
--restore-mode OriginalLocation
--storage-account mystorageaccount \
--rp-name myRecoveryPointName \
Name Operation Status Item Name Start Time UTC Duration
-------- --------------- ---------- ----------- ------------------- --------------
7f2ad916 Restore InProgress myVM 2017-09-19T19:39:52 0:00:34.520850
最后一个命令触发原始位置还原操作,以还原现有 VM 中的数据。
将数据还原到新创建的 VM
az backup restore restore-disks \
--resource-group myResourceGroup \
--vault-name myRecoveryServicesVault \
--container-name myVM \
--item-name myVM \
--restore-mode AlternateLocation \
--storage-account mystorageaccount \
--target-resource-group "Target_RG" \
--rp-name myRecoveryPointName \
--target-vm-name "TargetVirtualMachineName" \
--target-vnet-name "Target_VNet" \
--target-vnet-resource-group "Target_VNet_RG" \
--target-subnet-name "targetSubNet"
Name Operation Status Item Name Start Time UTC Duration
-------- --------------- ---------- ----------- ------------------- --------------
7f2ad916 Restore InProgress myVM 2017-09-19T19:39:52 0:00:34.520850
最后一个命令会触发备用位置还原操作,根据参数 TargetVMName、TargetVNetName、TargetVNetResourceGroup、TargetSubnetName 在 Target_RG 资源组中创建新 VM。 这可确保数据在所需的 VM、虚拟网络和子网中还原。
后续步骤
在本教程中,你从恢复点还原了一个磁盘,然后从该磁盘创建了一个 VM。 你已了解如何:
- 列出和选择恢复点
- 从恢复点还原磁盘
- 从还原的磁盘创建 VM
请进入下一个教程了解如何从恢复点还原单个文件。