將 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
必要條件
- 安裝最新的 Azure PowerShell 模組。
限制
- 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
必要條件
上傳 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
手動上傳
必要條件
- 下載最新版本的 AzCopy v10。
- 安裝 Azure PowerShell 模組。
- 已針對 Azure 準備好固定大小 VHD,儲存於本機。
若要將 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_LRS、 Premium_ZRS、 StandardSSD_ZRS、 StandardSSD_LRS 或 UltraSSD_LRS。
產生可寫入的 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>
,然後使用下列命令:
$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》。
如果您有其他問題,請參閱常見問題中的上傳受控磁碟一節。