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

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

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

先决条件

入门

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

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

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

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

备注

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

创建空托管磁盘

在创建要上传的空标准 HDD 之前,需要获取要上传的 VHD 的文件大小(以字节为单位)。 可以使用示例代码来这样做,但若要自己操作,可以使用 $vhdSizeBytes = (Get-Item "<fullFilePathHere>").length。 指定 -UploadSizeInBytes 参数时将使用此值。

现在,请在本地 shell 上创建一个要上传的空的标准 HDD,方法是:在 -CreateOption 参数中指定 Upload 设置,并在 New-AzDiskConfig cmdlet 中指定 -UploadSizeInBytes 参数。 然后调用 New-AzDisk 来创建磁盘。

替换 <yourdiskname><yourresourcegroupname><yourregion>,然后运行以下命令:

提示

如果要创建 OS 磁盘,请将 -HyperVGeneration '<yourGeneration>' 添加到 New-AzDiskConfig

$vhdSizeBytes = (Get-Item "<fullFilePathHere>").length

$diskconfig = New-AzDiskConfig -SkuName 'Standard_LRS' -OsType 'Windows' -UploadSizeInBytes $vhdSizeBytes -Location '<yourregion>' -CreateOption 'Upload'

New-AzDisk -ResourceGroupName '<yourresourcegroupname>' -DiskName '<yourdiskname>' -Disk $diskconfig

若要上传高级 SSD 或标准 SSD,请将 Standard_LRS 替换为 Premium_LRSStandardSSD_LRS

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

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

$diskSas = Grant-AzDiskAccess -ResourceGroupName '<yourresourcegroupname>' -DiskName '<yourdiskname>' -DurationInSecond 86400 -Access 'Write'

$disk = Get-AzDisk -ResourceGroupName '<yourresourcegroupname>' -DiskName '<yourdiskname>'

上传 VHD

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

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

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

AzCopy.exe copy "c:\somewhere\mydisk.vhd" $diskSas.AccessSAS --blob-type PageBlob

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

替换 <yourdiskname><yourresourcegroupname>,然后运行以下命令:

Revoke-AzDiskAccess -ResourceGroupName '<yourresourcegroupname>' -DiskName '<yourdiskname>'

复制托管磁盘

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

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

重要

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

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

提示

如果要创建 OS 磁盘,请将 -HyperVGeneration 添加到 New-AzDiskConfig


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

$sourceDisk = Get-AzDisk -ResourceGroupName $sourceRG -DiskName $sourceDiskName

# Adding the sizeInBytes with the 512 offset, and the -Upload flag
$targetDiskconfig = New-AzDiskConfig -SkuName 'Standard_LRS' -osType $targetOS -UploadSizeInBytes $($sourceDisk.DiskSizeBytes+512) -Location $targetLocate -CreateOption 'Upload'

$targetDisk = New-AzDisk -ResourceGroupName $targetRG -DiskName $targetDiskName -Disk $targetDiskconfig

$sourceDiskSas = Grant-AzDiskAccess -ResourceGroupName $sourceRG -DiskName $sourceDiskName -DurationInSecond 86400 -Access 'Read'

$targetDiskSas = Grant-AzDiskAccess -ResourceGroupName $targetRG -DiskName $targetDiskName -DurationInSecond 86400 -Access 'Write'

azcopy copy $sourceDiskSas.AccessSAS $targetDiskSas.AccessSAS --blob-type PageBlob

Revoke-AzDiskAccess -ResourceGroupName $sourceRG -DiskName $sourceDiskName

Revoke-AzDiskAccess -ResourceGroupName $targetRG -DiskName $targetDiskName 

后续步骤

成功将 VHD 上传到托管磁盘后,即可将磁盘附加到 VM 并开始使用它。

若要了解如何将数据磁盘附加到 VM,请参阅有关此主题的文章:使用 PowerShell 将数据磁盘附加到 Windows VM。 若要将磁盘用作 OS 磁盘,请参阅从专用磁盘创建 Windows VM