- 追加された行はこの色です。
- 削除された行はこの色です。
「[[マイクロソフト系技術情報 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。
-Azure Storage上のディスク形式
-使った(書き込んで専有した) 容量だけ課金される。
-トランザクション(I/O)の課金がある。
-VM作成時に、管理ディスクを使用 [いいえ] を選択する。
-IDは、URLで、「https://・・・.windows.net/・・・」などとなる。
**Managed Disk (管理用ディスク) [#pc0c50ba]
-Azure Storageではない容量確保型、確保容量で課金される。
-Azure Storage上でAzure Disk Storage
-容量確保型、確保容量で課金される。
-トランザクション(I/O)の課金はない。
-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]]を少々走らせる必要がある。
Azure PowerShell か Azure CLI で、[[スクリプト>#w3ec16df]]を少々走らせる必要がある。
+作成した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/
*スクリプト [#w3ec16df]
**概要 [#hd18dec9]
-以下のps1ファイルを
--[[アップロードしてAzure Cloud Shell>Azure Cloud Shell#e8410850]]で実行するか、
--[[ローカルにAzure PowerShellをインストール>Azure PowerShell#qe06516c]]して実行する。
-以下のように実行する。
**管理ディスクの実容量を確認する [#h3288689]
BLOB の SAS (Shared Access Signatures) URLを使用して管理ディスクの実容量を確認する。
***ps1ファイル [#oe2e25ac]
-&ref(Get-BlobBytes.ps1);
***使用方法 [#x9d35a73]
-Azureポータルで、管理ディスクをエクスポートして BLOB Urlを得る。~
>Azureポータル >>「ディスク」>>「ディスク名」>> [エクスポート] >> [URLの生成]
-生成されたURLを指定して、実行すると、
.\Get-BlobBytes.ps1 -url 'https://mdxxxxxxx.blob.core.windows.net/・・・'
-下の様な表示を確認できる。
BlobName : xxxxxxxxxxx
BlobLength : nnnnnnnnnnn <= 割り当てられたサイズ (GiB)
BlobGB : nn.nn
ActualBytes : nnnnnnnnnn <= 実容量のサイズ
ActualGB : nn.nn (GB表記)
-最後に、Azureポータルの [x エクスポートのキャンセル] を~
クリックして、SAS URL を取り消す(無駄な共有はしない)。
***補足説明 [#gf7379b4]
-Azureポータルのディスクの "サイズ(GB)" ( ≒ BlobLength (GiB) ) と比べ、~
ActualGB が半分以下程度であれば、vhdに変換して圧縮すれば効果が大きい。
-サイズに大差ない場合は、
--パフォーマンス・管理しやすさなどの管理ディスクの特長と相談。
--非管理ディスクはトランザクション課金がある。~
単価は、10,000 トランザクションあたり ¥0.04032(2018/02/08)。
**vhdに変換する [#g5d4dca6]
-管理ディスクのUrlを使用して、Azure Storage(BLOBストレージまたは汎用ストレージ) に vhdファイルとしてコピーする。
-既存のvhdファイルを使ったVM作成は、Azureポータルではできないので、スクリプトが必要。
***ps1ファイル [#w79c3bf7]
-&ref(rm-convert-vm-manageddisk-to-vhd.ps1);
***使用方法 [#ocf2a88d]
以下のように実行する。
-サブスクリプション名を確認
Get-AzureRmSubscription
-Azureポータルから、リソースグループ名、VM名を確認
-サブスクリプション名、リソースグループ名、VM名を指定して実行。
Select-AzureRmSubscription -SubscriptionName サブスクリプション名 .\rm-convert-vm-manageddisk-to-vhd.ps1 -ResourceGroupName リソースグループ名 -vmName VM名
***補足説明 [#vd602b8a]
得になし。
*参考 [#na13f61a]
**[[Azure PowerShell]] [#w32504af]
**[[Azure Cloud Shell]] [#j5b74671]
----
Tags: [[:インフラストラクチャ]], [[:クラウド]], [[:Azure]]