將 VHD 上傳至 Azure,或將受控磁碟複製到另一個區域 - Azure PowerShell

適用於:✔️ Windows VM

本文說明如何使用 Azure PowerShell 模組,將 VHD 從本機電腦上傳至 Azure 受控磁碟,或將受控磁碟複製到另一個區域。 上傳受控磁碟的流程也稱為直接上傳,可讓您直接將高達 32 TiB 的 VHD 大小上傳至受控磁碟。 Ultra 磁碟、進階 SSD v2、進階 SSD、標準 SSD 和標準 HDD 目前支援直接上傳。

如果您要為 Azure 中的 IaaS VM 提供備份解決方案,您應該使用直接上傳將客戶備份還原至受控磁碟。 從外部來源上傳 VHD 至 Azure 時,速度取決於您的本機頻寬。 從 Azure VM 上傳或複製時,您的頻寬會與標準 HDD 相同。

使用 Microsoft Entra ID 保護上傳作業

如果您使用 Microsoft Entra ID 來控制資源存取,您現可使用此項目來限制 Azure 受控磁碟的上傳作業。 此功能可在所有區域中以 GA 供應項目的形式提供。 當使用者嘗試上傳磁碟時,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 PowerShell 指派 Azure 角色。 若要建立或更新自訂角色,請參閱使用 Azure PowerShell 建立或更新 Azure 自訂角色

開始使用

使用 Azure PowerShell 模組上傳 VHD 的方式有兩種:您可以使用 Add-AzVHD 命令,以自動執行大部分的流程,或者您可以使用 AzCopy 手動執行上傳。

針對進階 SSD、標準 SSD 和標準 HDD,您通常應該使用 Add-AzVHD。 不過,如果您要上傳至 Ultra 磁碟或進階 SSD v2,或需要上傳大於 50 GiB 的 VHD,則必須使用 AzCopy 手動上傳 VHD 或 VHDX。 使用 AzCopy 和 Add-AzVhd 可較快上傳大於 50 GiB 的 VHD,但目前不支援上傳至 Ultra 磁碟或進階 SSD v2。

如需如何將受控磁碟從某個區域複製到另一個區域的指導,請參閱《複製受控磁碟》。

使用 Add-AzVHD

必要條件

  • 安裝 Azure PowerShell 模組
  • 已針對 Azure 準備 VHD,儲存於本機。
    • 在 Windows 上:您不需要將 VHD 轉換成 VHDx、將它轉換成固定大小,或調整大小以包括 512 位元組位移。 Add-AZVHD 為您執行這些函式。
      • 必須啟用 Hyper-V,Add-AzVHD 才能執行這些函式。
    • 使用 Linux:您必須手動執行這些動作。 如需詳細資訊,請參閱《調整 VHD 大小》。

上傳 VHD

(選擇性) 授與磁碟的存取權

如果 Microsoft Entra ID 用於在訂用帳戶或帳戶層級強制執行上傳限制,則只有在具有適當 RBAC 角色或所需權限的使用者嘗試時,Add-AzVHD 才會成功。 您必須指派 RBAC 權限,以授與磁碟的存取權並產生可寫入的 SAS。

New-AzRoleAssignment -SignInName <emailOrUserprincipalname> `
-RoleDefinitionName "Data Operator for Managed Disks" `
-Scope /subscriptions/<subscriptionId>

使用 Add-AzVHD

下列範例會使用 Add-AzVHD,將 VHD 從本機電腦上傳至新的 Azure 受控磁碟。 使用您的參數取代 <your-filepath-here><your-resource-group-name><desired-region><desired-managed-disk-name>

注意

如果您要使用 Microsoft Entra ID 來強制執行上傳限制,請將 DataAccessAuthMode 'AzureActiveDirectory' 新增至 Add-AzVhd 命令結尾。

# Required parameters
$path = <your-filepath-here>.vhd
$resourceGroup = <your-resource-group-name>
$location = <desired-region>
$name = <desired-managed-disk-name>

# Optional parameters
# $Zone = <desired-zone>
# $sku=<desired-SKU>
# -DataAccessAuthMode 'AzureActiveDirectory'
# -DiskHyperVGeneration = V1 or V2. This applies only to OS disks.

# To use $Zone or #sku, add -Zone or -DiskSKU parameters to the command
Add-AzVhd -LocalFilePath $path -ResourceGroupName $resourceGroup -Location $location -DiskName $name

手動上傳

必要條件

若要將 VHD 上傳至 Azure,您必須建立針對此上傳流程設定的空白受控磁碟。 建立磁碟之前,您應該先了解這些磁碟的一些其他資訊。

這種受控磁碟有兩個唯一狀態:

  • ReadyToUpload,這表示磁碟已準備好接收上傳,但尚未產生 安全存取簽章 (SAS)。
  • ActiveUpload,這表示磁碟已準備好接收上傳,並已產生 SAS。

注意

在這兩種狀態中,不論磁碟的實際類型為何,受控磁碟都會以標準 HDD 定價計費。 例如,P10 會以 S10 計費。 這將為真,直到在受控磁碟上呼叫 revoke-access 為止,這是將磁碟連結至 VM 的必要流程。

建立空白的受控磁碟

您必須先掌握想上傳 VHD 的檔案大小 (以位元組為單位),才能建立用於上傳的空白標準 HDD。 範例程式碼會為您取得,但若要自行執行,您可以使用:$vhdSizeBytes = (Get-Item "<fullFilePathHere>").length。 指定 -UploadSizeInBytes 參數時,會使用此值。

現在,在您的本機殼層上,在 -CreateOption 參數中指定 Upload 設定 以及在 New-AzDiskConfig Cmdlet 中指定 -UploadSizeInBytes 參數,以建立用於上傳的空白標準 HDD。 然後呼叫 New-AzDisk 來建立磁碟。

取代 <yourdiskname><yourresourcegroupname><yourregion>,然後執行下列命令:

重要

如果您要建立 OS 磁碟,請將 -HyperVGeneration '<yourGeneration>' 新增至 New-AzDiskConfig

如果您要使用 Microsoft Entra ID 來保護上傳作業,請將 -dataAccessAuthMode 'AzureActiveDirectory' 新增至 New-AzDiskConfig
上傳至 Ultra 磁碟或進階 SSD v2 時,您必須選取目標磁碟的正確磁區大小。 如果您使用具有 4k 邏輯磁區大小的 VHDX 檔案,目標磁碟必須設定為 4k。 如果您使用具有 512 邏輯磁區大小的 VHD 檔案,目標磁碟必須設定為 512。

不支援邏輯磁區大小為 512k 的 VHDX 檔案。

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

## For Ultra Disks or Premium SSD v2, add -LogicalSectorSize and specify either 4096 or 512, depending on if you're using a VHDX or a VHD

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

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

如果您要上傳不同的磁碟類型,請將 Standard_LRS 取代為 Premium_LRSPremium_ZRSStandardSSD_ZRSStandardSSD_LRSUltraSSD_LRS

產生可寫入的 SAS

既然您已建立設定好上傳流程的空白受控磁碟,您就可以將 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 或 VHDX

既然您有空白受控磁碟的 SAS,就可以使用它將受控磁碟設定為上傳命令的目的地。

使用 AzCopy v10,藉由指定您產生的 SAS URI,將本機 VHD 或 VHDX 檔案上傳至受控磁碟。

此上傳的輸送量與標準 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> (位置值的範例是 uswest2),然後執行下列指令碼以複製受控磁碟。

提示

如果您要建立 OS 磁碟,請將 -HyperVGeneration '<yourGeneration>' 新增至 New-AzDiskConfig


$sourceRG = <sourceResourceGroupHere>
$sourceDiskName = <sourceDiskNameHere>
$targetDiskName = <targetDiskNameHere>
$targetRG = <targetResourceGroupHere>
$targetLocate = <yourTargetLocationHere>
$targetVmGeneration = "V1" # either V1 or V2
#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' -HyperVGeneration $targetVmGeneration

$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》。

如果您有其他問題,請參閱常見問題中的上傳受控磁碟一節。