将 VHD 上传到 Azure,或将托管磁盘复制到其他区域 - Azure CLI
适用于:✔️ Linux VM ✔️ Windows VM ✔️ 灵活规模集
本文介绍如何使用 AzCopy 将 VHD 从本地计算机上传到 Azure 托管磁盘,或将托管磁盘复制到其他区域。 此过程(直接上传)允许你将最大大小为 32 TiB 的 VHD 直接上传到托管磁盘。 目前,超级磁盘、高级 SSD v2、高级 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 托管磁盘
先决条件
- 下载最新版本 AzCopy v10。
- 安装 Azure CLI。
- 若要从本地上传 VHD:已为 Azure 准备了一个固定大小的 VHD,存储在本地。
- 若要执行复制操作,请使用 Azure 中的托管磁盘。
若要将 VHD 上传到 Azure,需要创建一个针对此上传过程配置的空托管磁盘。 在创建托管磁盘之前,应了解有关这些磁盘的一些附加信息。
这种托管磁盘有两种独特的状态:
- ReadToUpload,表示磁盘已做好上传准备,但尚未生成安全访问签名 (SAS)。
- ActiveUpload,表示磁盘已做好上传准备,并且已生成 SAS。
注意
在任一状态下,无论实际磁盘类型是什么,都会按标准 HDD 定价对托管磁盘计费。 例如,P10 将按 S10 计费。 在对托管磁盘调用 revoke-access
之前(将磁盘附加到 VM 需要执行此调用),都是如此。
创建空托管磁盘
在创建要上传的空标准 HDD 之前,需要获取要上传的 VHD 的文件大小(以字节为单位)。 为此,可以使用 wc -c <yourFileName>.vhd
或 ls -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'
。
上传到超级磁盘或高级 SSD v2 时,需要选择目标磁盘的正确扇区大小。 如果使用逻辑扇区大小为 4k 的 VHDX 文件,则必须将目标磁盘设置为 4k。 如果使用逻辑扇区大小为 512 的 VHD 文件,则必须将目标磁盘设置为 512。
不支持逻辑扇区大小为 512k 的 VHDX 文件。
##For Ultra Disk or Premium SSD v2, 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_lrs、premium_zrs、standardssd_lrs、standardssd_zrs、premiumv2_lrs 或 ultrassd_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,以便将此磁盘作为上传目标引用。
重要
2025 年 2 月 15 日,磁盘和快照的共享访问签名 (SAS) 访问时间将限制为最多 60 天。 尝试生成有效期超过 60 天的 SAS 会导致错误。 已创建的有效期超过 60 天的任何现有磁盘或快照 SAS 在创建日期过去 60 天后可能会停止工作,并且在授权过程中会导致 403 错误。
如果托管磁盘或快照 SAS 的有效期超过 60 天,请撤销其访问权限,并生成请求访问 60 天(5,184,000 秒)或更少时间的新 SAS。 通过使用有效期更短的 SAS 来提高整体安全性。 请在 2025 年 2 月 15 日之前进行这些更改,以防止服务中断。 以下链接可用于查找、撤销和请求新的 SAS。
- 若要检查磁盘是否具有活动的 SAS,可以使用 REST API、Azure CLI 或 Azure PowerShell 模块,并检查 DiskState 属性。
- 若要撤销 SAS,可以使用 REST API、Azure CLI 或 Azure PowerShell 模块。
- 若要创建 SAS,可以使用 REST API、Azure CLI 或 Azure PowerShell 模块,并将访问持续时间设置为 5,184,000 秒或更少。
若要生成空托管磁盘的可写 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。
如果还有其他问题,请参阅常见问题解答中的上传托管磁盘部分。