「[[マイクロソフト系技術情報 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]
-管理ディスクの方が、高額になりがち。
-リソースIDが、/subscriptions/xxxx で始まっていたら、管理ディスク

**unManage Disk (非管理ディスク) [#d523f0d5]
-Azure Storageのディスク形式のAzure Disk Storage。
-使った(書き込んで専有した) 容量だけ課金される。
-VM作成時に、管理ディスクを使用 [いいえ] を選択。
-VM作成時に、管理ディスクを使用 [いいえ] を選択する。
-IDは、URLで、「https://・・・.windows.net/・・・」などとなる。

**Managed Disk (管理用ディスク) [#pc0c50ba]
-Azure Storageではない容量確保型、確保容量で課金される。
-VM作成時に、管理ディスクを使用 [はい] を選択。
-VM作成時に、管理ディスクを使用 [はい] を選択する。
-IDは、リソースIDで、「/subscriptions/・・・」となる。

**切り替え [#g0ed0026]
VMからでたッチしたインストールディスクをvhd化、~
vhdを非管理ディスクへ変換して、VMへアタッチ。
**VMの管理用ディスクを切り替える。 [#g0ed0026]
VMで使用している[[管理用ディスク>#pc0c50ba]]を[[非管理ディスク>#d523f0d5]]に切り替える。

***概要 [#p7b35cfa]
VMからデタッチした[[管理用ディスク>#pc0c50ba]](インストール・ディスク)をvhd化、~
vhdを[[非管理ディスク>#d523f0d5]](Azureのディスク ストレージ)に保存して、VMへアタッチ。

+管理ディスクからvhdを取り出す
++[[下を参考に>#mb98251e]]、管理ディスクをエクスポート。
++[[下を参考に>#mb98251e]]、[[管理用ディスク>#pc0c50ba]]をエクスポート。
++URLが表示されるので、仮想マシンと同じリソースグループに、~
新規にストレージアカウント & コンテナを作成して、vhd をコピー。
 # azcopy とか 
 # Start-AzureStorageBlobCopy とか 
 # az storage blob copy とか
+VMを削除して、vhdから作成
--vhdができたら、そのvhdから、新しいVMを作成。
--Azureポータルで、vhdから仮想マシンを作れないので、~
Azure PowerShell か Azure CLI で、[[スクリプト>#a7534001]]を少々走らせる必要がある。
+作成したVMに問題なかったら、もとの管理ディスクを削除
+作成したVMに問題なかったら、もとの[[管理用ディスク>#pc0c50ba]]を削除

***スクリプト [#de5dad7f]
&ref(rm-recreate-vm.ps1);
-以下の[[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 ScaleSet は無視するので、ScaleSet にあるVMには使用しないように。
   DataDisk は無視するので、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を停止
   $vm | Stop-AzureRmVM -Force
   # 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 $matches[1] -DiskName $matches[2] -Access Read -DurationInSecond 3600
   # 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
 
   # コピー先の vhd url
   $osvhd = "{0}{1}/{2}" -f $storage.Context.BlobEndPoint, "vhds", $osblob
   # 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を削除
   $vm | Remove-AzureRmVM -Force
   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]]


トップ   新規 一覧 単語検索 最終更新   ヘルプ   最終更新のRSS