将 VHD 上传到 Azure,或将托管磁盘复制到其他区域 - Azure CLI

适用于:✔️ Linux VM ✔️ Windows VM ✔️ 灵活规模集

本文介绍如何使用 AzCopy 将 VHD 从本地计算机上传到 Azure 托管磁盘,或将托管磁盘复制到其他区域。 此过程(直接上传)允许你将最大大小为 32 TiB 的 VHD 直接上传到托管磁盘。 目前,超级磁盘、高级 SSD、标准 SSD 和标准 HDD 都支持直接上传。

若要为 Azure 中的 IaaS VM 提供备份解决方案,你应该使用直接上传方法将客户备份还原到托管磁盘。 从 Azure 外部的源上传 VHD 时,速度取决于本地带宽。 从 Azure VM 上传或复制时,带宽将与标准 HDD 相同。

使用 Microsoft Entra ID 进行安全上传

如果使用 Microsoft Entra ID 来控制资源访问,现在可使用它来限制 Azure 托管磁盘的上传。 此功能在所有区域以正式版产品/服务的形式提供。 当用户尝试上传磁盘时,Azure 会在 Microsoft Entra ID 中验证发出请求的用户的标识,并确认该用户具有所需的权限。 在更高级别,系统管理员可在 Azure 帐户或订阅级别设置策略,确保 Microsoft Entra 标识在允许上传磁盘或磁盘快照之前具有上传所需的权限。 如果对使用 Microsoft Entra ID 进行安全上传有任何疑问,请联系此电子邮件地址:azuredisks@microsoft .com

先决条件

限制

  • 无法将 VHD 上传到空快照。
  • Azure 备份目前不支持使用 Microsoft Entra ID 保护的磁盘。
  • Azure Site Recovery 目前不支持使用 Microsoft Entra ID 保护的磁盘。

分配 RBAC 角色

若要访问受 Microsoft Entra ID 保护的托管磁盘,发出请求的用户必须具有托管磁盘角色的数据操作员角色,或者是具有以下权限的自定义角色

  • Microsoft.Compute/disks/download/action
  • Microsoft.Compute/disks/upload/action
  • Microsoft.Compute/snapshots/download/action
  • Microsoft.Compute/snapshots/upload/action

有关分配角色的详细步骤,请参阅使用 Azure CLI 分配 Azure 角色。 若要创建或更新自定义角色,请参阅使用 Azure CLI 创建或更新 Azure 自定义角色

入门

如果希望通过 GUI 上传磁盘,可以使用 Azure 存储资源管理器。 有关详细信息,请参阅:使用 Azure 存储资源管理器管理 Azure 托管磁盘

先决条件

若要将 VHD 上传到 Azure,需要创建一个针对此上传过程配置的空托管磁盘。 在创建托管磁盘之前,应了解有关这些磁盘的一些附加信息。

这种托管磁盘有两种独特的状态:

  • ReadToUpload,表示磁盘已做好上传准备,但尚未生成安全访问签名 (SAS)。
  • ActiveUpload,表示磁盘已做好上传准备,并且已生成 SAS。

注意

在任一状态下,无论实际磁盘类型是什么,都会按标准 HDD 定价对托管磁盘计费。 例如,P10 将按 S10 计费。 在对托管磁盘调用 revoke-access 之前(将磁盘附加到 VM 需要执行此调用),都是如此。

创建空托管磁盘

在创建要上传的空标准 HDD 之前,需要获取要上传的 VHD 的文件大小(以字节为单位)。 为此,可以使用 wc -c <yourFileName>.vhdls -al <yourFileName>.vhd。 指定 --upload-size-bytes 参数时将使用此值。

disk create cmdlet 中同时指定 --for-upload 参数和 --upload-size-bytes 参数,创建要上传的空标准 HDD:

<yourdiskname><yourresourcegroupname><yourregion> 替换为所选值。 --upload-size-bytes 参数包含示例值 34359738880,请将其替换为适合你的值。

重要

如果要创建 OS 磁盘,请将 --hyper-v-generation <yourGeneration> 添加到 az disk create

如果使用 Microsoft Entra ID 来保护磁盘上传,请添加 -dataAccessAuthmode 'AzureActiveDirectory'。 上传到超级磁盘时,需要选择目标磁盘的正确扇区大小。 如果使用逻辑扇区大小为 4k 的 VHDX 文件,则必须将目标磁盘设置为 4k。 如果使用逻辑扇区大小为 512 的 VHD 文件,则必须将目标磁盘设置为 512。

不支持逻辑扇区大小为 512k 的 VHDX 文件。

##For Ultra Disk, add --logical-sector-size and specify either 512 or 4096, depending on if you're using a VHD or VHDX

az disk create -n <yourdiskname> -g <yourresourcegroupname> -l <yourregion> --os-type Linux --for-upload --upload-size-bytes 34359738880 --sku standard_lrs

如果要上传其他磁盘类型,请将 standard_lrs 替换为 premium_lrspremium_zrsstandardssd_lrsstandardssd_zrsultrassd_lrs

(可选)授予对磁盘的访问权限

如果使用 Microsoft Entra ID 来进行安全上传,需要分配 RBAC 权限来授予对磁盘的访问权限并生成可写 SAS。

az role assignment create --assignee "{assignee}" \
--role "{Data Operator for Managed Disks}" \
--scope "/subscriptions/{subscriptionId}/resourcegroups/{resourceGroupName}/providers/{providerName}/{resourceType}/{resourceSubType}/{diskName}"

生成可写 SAS

现在,你已创建了一个针对上传过程配置的空托管磁盘,可以将 VHD 上传到其中了。 若要将 VHD 上传到磁盘,需要一个可写的 SAS,以便将此磁盘作为上传目标引用。

若要生成空托管磁盘的可写 SAS,请替换 <yourdiskname><yourresourcegroupname>,然后使用以下命令:

az disk grant-access -n <yourdiskname> -g <yourresourcegroupname> --access-level Write --duration-in-seconds 86400

示例返回值:

{
  "accessSas": "https://md-impexp-t0rdsfgsdfg4.blob.core.chinacloudapi.cn/w2c3mj0ksfgl/abcd?sv=2017-04-17&sr=b&si=600a9281-d39e-4cc3-91d2-923c4a696537&sig=xXaT6mFgf139ycT87CADyFxb%2BnPXBElYirYRlbnJZbs%3D"
}

上传 VHD 或 VHDX

生成空托管磁盘的 SAS 后,可以使用该 SAS 将托管磁盘设置为上传命令的目标。

使用 AzCopy v10,通过指定生成的 SAS URI 将本地 VHD 或 VHDX 文件上传到托管磁盘。

此上传过程的吞吐量与相应标准 HDD 的吞吐量相同。 例如,如果大小相当于 S4,则最高吞吐量为 60 MiB/秒。 但是,如果大小相当于 S70,则最高吞吐量为 500 MiB/秒。

AzCopy.exe copy "c:\somewhere\mydisk.vhd" "sas-URI" --blob-type PageBlob

上传完成后,如果你不再需要将更多数据写入磁盘,请吊销 SAS。 吊销 SAS 会更改托管磁盘的状态,使你可以将磁盘附加到 VM。

替换 <yourdiskname><yourresourcegroupname>,然后使用以下命令使磁盘可用:

az disk revoke-access -n <yourdiskname> -g <yourresourcegroupname>

复制托管磁盘

直接上传还能简化复制托管磁盘的过程。 可以在同一区域中进行复制,或者跨区域复制(复制到另一区域)。

以下脚本可自动完成此操作,此过程类似于前面所述的步骤,但由于处理的是现有磁盘,因此存在一些差异。

重要

提供 Azure 中托管磁盘的磁盘大小(以字节为单位)时,需要添加 512 偏移量。 这是因为,Azure 在返回磁盘大小时会省略脚注。 如果你不执行此操作,该副本将失败。 以下脚本中已添加此偏移量。

请将 <sourceResourceGroupHere><sourceDiskNameHere><targetDiskNameHere><targetResourceGroupHere><yourTargetLocationHere>(例如,位置值为 chinanorth2)替换为自己的值,然后运行以下脚本来复制托管磁盘。

提示

如果要创建 OS 磁盘,请将 --hyper-v-generation <yourGeneration> 添加到 az disk create

sourceDiskName=<sourceDiskNameHere>
sourceRG=<sourceResourceGroupHere>
targetDiskName=<targetDiskNameHere>
targetRG=<targetResourceGroupHere>
targetLocation=<yourTargetLocationHere>
#Expected value for OS is either "Windows" or "Linux"
targetOS=<yourOSTypeHere>

sourceDiskSizeBytes=$(az disk show -g $sourceRG -n $sourceDiskName --query '[diskSizeBytes]' -o tsv)

az disk create -g $targetRG -n $targetDiskName -l $targetLocation --os-type $targetOS --for-upload --upload-size-bytes $(($sourceDiskSizeBytes+512)) --sku standard_lrs

targetSASURI=$(az disk grant-access -n $targetDiskName -g $targetRG  --access-level Write --duration-in-seconds 86400 --query [accessSas] -o tsv)

sourceSASURI=$(az disk grant-access -n $sourceDiskName -g $sourceRG --duration-in-seconds 86400 --query [accessSas] -o tsv)

azcopy copy $sourceSASURI $targetSASURI --blob-type PageBlob

az disk revoke-access -n $sourceDiskName -g $sourceRG

az disk revoke-access -n $targetDiskName -g $targetRG

后续步骤

成功将 VHD 上传到托管磁盘后,可将该磁盘作为数据磁盘附加到现有的 VM,或者将该磁盘作为 OS 磁盘附加到 VM,以创建新的 VM。

如果还有其他问题,请参阅常见问题解答中的上传托管磁盘部分。