适用于:✔️ Linux 虚拟机 ✔️ Windows 虚拟机 ✔️ 灵活规模集
本文介绍如何使用 AzCopy 将 VHD 从本地计算机上传到Azure托管磁盘或将托管磁盘复制到另一个区域。 此过程(直接上传)允许你将最大大小为 32 TiB 的 VHD 直接上传到托管磁盘。 目前,超级磁盘、高级 SSD v2、高级 SSD、标准 SSD 和标准 HDD 支持直接上传。
如果要为 Azure 中的 IaaS 虚拟机提供备份解决方案,则应使用直接上传将客户备份还原到托管磁盘。 将 VHD 从外部的源上传到Azure时,速度取决于本地带宽。 从Azure VM 上传或复制时,带宽与标准 HDD 相同。
如果使用 Microsoft Entra ID 来控制资源访问,则可以用它来限制上传 Azure 托管磁盘。 有关详细信息,请参阅 Azure 托管磁盘的安全下载和上传。
开始使用
如果想要通过 GUI 上传磁盘,可以使用Azure Storage Explorer执行此作。 有关详细信息,请参阅:使用 Azure Storage Explorer 来管理 Azure managed disks
先决条件
- 下载最新版本的 AzCopy v10。
- 安装 Azure CLI。
- 如果打算从本地上传 VHD:固定大小的 VHD 已准备好用于 Azure,并存储在本地。
- 或者,您打算执行复制操作时,可以在Azure中使用托管磁盘。
若要将 VHD 上传到Azure,需要创建为此上传过程配置的空托管磁盘。 在您创建一个磁盘之前,您应了解有关这些磁盘的一些附加信息。
这种托管磁盘有两种独特的状态:
- ReadyToUpload,这意味着磁盘已准备好接收上传,但尚未生成安全访问签名(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 Azure AD 来保护磁盘上传,则需要分配 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 天,请取消对其的访问权限,并生成一个新的 SAS,请求访问权限为 60 天(5,184,000 秒)或更少。 通过使用有效期更短的 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 模块,并将access持续时间设置为 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。
如果还有其他问题,请参阅常见问题解答中的上传托管磁盘部分。