「[[マイクロソフト系技術情報 Wiki>http://techinfoofmicrosofttech.osscons.jp/]]」は、「[[Open棟梁Project>https://github.com/OpenTouryoProject/]]」,「[[OSSコンソーシアム .NET開発基盤部会>https://www.osscons.jp/dotNetDevelopmentInfrastructure/]]」によって運営されています。 -[[戻る>Azureのストレージ]] * 目次 [#rcc29175] #contents *概要 [#s68ff9a2] Azureのディスク ストレージ **unManage Disk (非管理ディスク) [#l33fe1bb] -Disk Storage | Microsoft Azure~ https://azure.microsoft.com/ja-jp/services/storage/unmanaged-disks/ **Managed Disk (管理用ディスク) [#v086e7a2] -Managed Disks | Microsoft Azure~ https://azure.microsoft.com/ja-jp/services/managed-disks/ --Standard Managed Disks~ 費用対効果に優れたハード ディスク ドライブ (HDD) ベース --Premium Managed Disks~ スループットを高める、ソリッド ステート ドライブ (SSD) ベース *課金 [#y33e1d12] -管理ディスクの方が、高額になりがち。 **unManage Disk (非管理ディスク) [#d523f0d5] -Azure Storageのディスク形式のAzure Disk Storage。 -使った(書き込んで専有した) 容量だけ課金される。 -VM作成時に、管理ディスクを使用 [いいえ] を選択する。 -IDは、URLで、「https://・・・.windows.net/・・・」などとなる。 **Managed Disk (管理用ディスク) [#pc0c50ba] -Azure Storageではない容量確保型、確保容量で課金される。 -VM作成時に、管理ディスクを使用 [はい] を選択する。 -IDは、リソースIDで、「/subscriptions/・・・」となる。 **VMの管理用ディスクを切り替える。 [#g0ed0026] VMで使用している[[管理用ディスク>#pc0c50ba]]を[[非管理ディスク>#d523f0d5]]に切り替える。 ***概要 [#p7b35cfa] VMからデタッチした[[管理用ディスク>#pc0c50ba]](インストール・ディスク)をvhd化、~ vhdを[[非管理ディスク>#d523f0d5]](Azureのディスク ストレージ)に保存して、VMへアタッチ。 +管理ディスクからvhdを取り出す ++[[下を参考に>#mb98251e]]、[[管理用ディスク>#pc0c50ba]]をエクスポート。 ++URLが表示されるので、仮想マシンと同じリソースグループに、~ 新規にストレージアカウント & コンテナを作成して、vhd をコピー。 # azcopy とか # Start-AzureStorageBlobCopy とか # az storage blob copy とか +VMを削除して、vhdから作成 --vhdができたら、そのvhdから、新しいVMを作成。 --Azureポータルで、vhdから仮想マシンを作れないので、~ Azure PowerShell か Azure CLI で、[[スクリプト>#a7534001]]を少々走らせる必要がある。 +作成したVMに問題なかったら、もとの[[管理用ディスク>#pc0c50ba]]を削除 ***スクリプト [#de5dad7f] -以下の[[ps1ファイルをアップロードして>Azure Cloud Shell#e8410850]]、 -以下のように実行する。 .\rm-convert-vm-manageddisk_2_vhd.ps1 -ResourceGroupName [ResourceGroupName] -vmName [vmName] -&ref(rm-convert-vm-manageddisk_2_vhd.ps1); <# VM の Managed Disk をvhd に変換して、VM再作成。 VM Scale Set は感知しないので、VM Scale Set にあるVMには使用しないように。 DataDisk は無視するので、VM再作成後に、別途変換するなり、取り付けるなり。 参考: ・https://blogs.technet.microsoft.com/jpaztech/2017/08/17/export-managed-disks-to-vhd/ 管理ディスク (Managed Disks) のサブスクリプション間やリソース グループ間の移行について #> param( [parameter(Mandatory=$true)] [string] $ResourceGroupName, [parameter(Mandatory=$true)] [string] $vmname ) $ErrorActionPreference = 'stop' # 現在のVM $vm = Get-AzureRmVM -ResourceGroupName $ResourceGroupName -Name $vmname # VMが動作していたら、エラー $vmstatus = (Get-AzureRmVM -ResourceGroupName $vm.ResourceGroupName -Name $vm.Name -status).Statuses | ? Code -match Power if ( $vmstatus.Code -notmatch "deallocate" ) { write-error "vmが動作中です。シャットダウン/停止してから実行してください。" } # Managed Disk を取得 $vm.StorageProfile.OsDisk.ManagedDisk.Id -match 'resourceGroups/([^/]+)/providers/Microsoft.Compute/disks/(.+)' | out-null $osdisk = Get-AzureRmDisk -ResourceGroupName $matches[1] -Name $matches[2] # Managed Disk をエクスポートして vhd url を取得 $osdiskURL = Grant-AzureRmDiskAccess -ResourceGroupName $osdisk.ResourceGroupName -DiskName $osdisk.Name -Access Read -DurationInSecond 3600 write-host -foregroundcolor green "Managed Disk を export しました:" write-host -foregroundcolor green $osdiskURL.AccessSAS # Storage Account を作成 $storage_type = $osdisk.AccountType $storage_type = $storage_type -replace '(Standard|Premium)(_|)(\w+)', '$1_$3' $storage = New-AzureRmStorageAccount -ResourceGroupName $vm.ResourceGroupname -Name ("storage{0:yyyyMMddHHmmss}" -f (Get-Date)) -SkuName $storage_type -Location $osdisk.Location # Storage に Container を作成 New-AzureStorageContainer -Context $storage.Context -Name "vhds" | out-null write-host -foregroundcolor green "" # Managed Disk の vhd を Storage にコピー $osblob = "{0}-osdisk.vhd" -f $vm.Name # コピー先の vhd url $osvhd = "{0}{1}/{2}" -f $storage.Context.BlobEndPoint, "vhds", $osblob # コピー write-host -foregroundcolor green "vhd を copy します..." $job = Start-AzureStorageBlobCopy -AbsoluteUri $osdiskURL.AccessSAS -DestBlob $osblob -DestContainer "vhds" -DestContext $storage.Context write-host -foregroundcolor green "vhd copy の完了を待ちます..." $job | Get-AzureStorageBlobCopyState -WaitForComplete # Managed Disk のエクスポートを終了 Revoke-AzureRmDiskAccess -ResourceGroupName $osdisk.ResourceGroupName -DiskName $osdisk.Name | out-null # NICを取得 $vm.NetworkProfile.NetworkInterfaces.Id -match 'resourceGroups/([^/]+)/providers/Microsoft.Network/networkInterfaces/(.+)' | out-null $nic = Get-AzureRmNetworkInterface -ResourceGroupName $matches[1] -Name $matches[2] # 現在のVMを削除 write-host -foregroundcolor green "vm を削除します..." $vm | Remove-AzureRmVM -Force | out-null # 新しいvhdで、再作成 # サイズ $vmconfig = New-AzureRmVMConfig -VMName $vm.Name -VMSize $vm.HardwareProfile.VmSize # nic は現在のものを使用 Add-AzureRmVMNetworkInterface -VM $vmconfig -NetworkInterface $nic | out-null # vhd は、コピー先を使用 Set-AzureRmVMOSDisk -VM $vmconfig -Name $osblob -VhdUri $osvhd ` -Caching ReadWrite -CreateOption Attach -Windows | out-null # 仮想マシン作成 write-host -foregroundcolor green "vhdを使ってvmを作成します..." $newvm = New-AzureRmVM -Location $vm.Location ` -ResourceGroupName $vm.ResourceGroupName -VM $vmconfig # 作成した仮想マシンの情報 "" write-host -foregroundcolor green "VM再作成しました:" $newvm = Get-AzureRmVM -ResourceGroupName $vm.ResourceGroupName -Name $vm.Name "vmname : {0}" -f $newvm.Name if ( $newvm.StorageProfile.OSDisk.vhd ) { "OSdisk : {0}" -f $newvm.StorageProfile.OSDisk.vhd.Uri } if ( $newvm.DiagnosticsProfile.BootDiagnostics.StorageUri ) { "Diagnostics : {0}" -f $newvm.DiagnosticsProfile.BootDiagnostics.StorageUri } "" write-host -foregroundcolor green "動作確認できたら、元のManaged Diskを削除してください:" " Managed Disk : {0}" -f $osdisk.Name " ex: Remove-AzureRmDisk -ResourceGroupName {0} -Name {1}" -f $osdisk.ResourceGroupName, $osdisk.Name ***参考 [#pa74c672] -管理ディスク (Managed Disks) のサブスクリプション間やリソース グループ間の~ 移行について – Japan Azure Technical Support Engineers' Blog~ https://blogs.technet.microsoft.com/jpaztech/2017/08/17/export-managed-disks-to-vhd/ *参考 [#na13f61a] **[[Azure PowerShell]] [#w32504af] **[[Azure Cloud Shell]] [#j5b74671] ---- Tags: [[:インフラストラクチャ]], [[:クラウド]], [[:Azure]]