Resource Explorer を使用して Windows OS をキャプチャーする

※ 4/11 一般化した VM についての注意事項を追記。それに伴いレイアウトを少し変更しました。

 

こんにちは、Azure サポートチーム 佐藤です。

ひとつ前の投稿では、Linux OS のキャプチャーの取り方をご紹介しましたが、今回は Windows OS 編をご紹介します。
以下の公開情報を参考に、
・一般化した Windows 仮想マシンイメージのキャプチャー
・キャプチャーイメージから新たな仮想マシンの作成
を実際に行いました。
イメージのキャプチャーには Azure Resource Explorer 、仮想マシンの作成には、Azure PowerShell を使用しています。

 

参考 :
リソース マネージャー デプロイメント モデルで Windows 仮想マシンをキャプチャする方法
https://azure.microsoft.com/ja-jp/documentation/articles/virtual-machines-windows-capture-image-resource-manager/
Azure Resource Manager で作成した仮想マシンをキャプチャーする
https://blogs.technet.com/b/junichia/archive/2015/11/25/3657462.aspx

 

※ご注意ください※

一般化 (Sysprep) の処理は切り戻しが行えません。また、一度、一般化してしまうと、同じ VM を今後起動することはできず、展開の処理を経る必要があります。
このため、一般化を行う前にバックアップを実施することをお勧めします。

  バックアップおよびリストアの方法については、下記の記事でご紹介しておりますのでご参考ください。

Azure VM のバックアップ – 新ポータルでの VM のバックアップ方法について
https://blogs.technet.microsoft.com/jpaztech/2016/02/18/azure-vm-backup-0218/

 

 

*********************************
作業の流れ
1. リソースマネージャーモデルの VM を Sysprep し、一般化を行う
2.Azure Resource Explorer を使用して、VM をキャプチャーする
3. キャプチャーしたイメージから新しい VM を作成する
*********************************

 

 

1. リソースマネージャーモデルの VM を Sysprep し、一般化を行う

1-1.OS のカスタマイズ作業を実施します。

 

1-2. 管理者権限でコマンド プロンプトを起動し、以下のパスより Sysprep.exe を実行します。

 C:\Windows\System32\Sysprep\Sysprep.exe

 

1-3.[Generalize] にチェックを入れ、[シャットダウンオプション] の [Shutdown] を選択、[OK] をクリックします。
generalize9

 

1-4. 仮想マシンがシャットダウンされ、ポータルで状態が [停止済み] に変わります。
generalize1

 

 

2.Azure Resource Explorer を使用して VM をキャプチャーする

2-1.Azure Resource Explorer から、Azure アカウントにログインします。

 

2-2. 右上にある [Read/Write] を選択します。既定では [Read Only] に設定されています。

generalize10

 

2-3. 上部の検索ボックスに名前を入力、または、左側のメニューから [subscriptions] -> [resourceGroups] -> [対象のリソースグループ] -> [Microsoft.Compute] の順に展開し
一般化した仮想マシンを選択します。右側に、対応するテンプレートが表示されます。
generalize2

 

2-4.[Actions(POST,DELETE)] タブをクリックします。

 

2-5.[deallocate] ボタンをクリックします。
仮想マシン名の横にチェックマークが表示され、VM の状態が [停止済み(割り当て解除)] に変わります。
generalize3 generalize4

 

2-6.[generalize] ボタンをクリックします。
手順 2-5 と同様にチェックマークが表示され、仮想マシンが一般化済みとしてマークされます。
この generalize は、Azure 上から本 VM が一般化されたというフラグを立てるものであり、Windows や Linux OS としての一般化を実行するわけではありません。
(今回の手順 1 にて実行するように、Windows であれば、Sysprep の generalize をあらかじめ実行しておく必要があるということです。)

※一般化済みとしてマークされることで、仮想マシンの起動ができなくなります(次の起動はイメージを再展開した後となります。)

 

2-7.[capture] ボタンの下で、イメージをキャプチャーするための値を設定し、ボタンをクリックします。

 {
"vhdPrefix": "xxxxx", #保存されるイメージ名(任意)
"destinationContainerName": "xxxxx", #保存先コンテナー名
"overwriteVhds": "true" または "false" #同じ VHD ファイルがあった場合に上書きするかどうか
}

generalize5

 

2-8. キャプチャーされた VHD ファイルは、仮想マシンと同じストレージアカウントに保存されます。
画面から確認する場合、ポータルから [ストレージ アカウント] メニューを選択し、キャプチャ元の VHD が存在するストレージ アカウントを開きます。
続いて、[BLOB] -> [system] -> [Microsoft.Compute] -> [Images] -> [2-7 で指定したコンテナー名] から確認できます。
generalize7 generalize8

 

 

3. キャプチャーしたイメージから新しい VM を作成する

※ Azure PowerShell とキャプチャーした VHD を使用して、新しい仮想ネットワークに VM を作成する方法です。
※キャプチャーした VHD が属していないリソースグループに、仮想マシンを作成することはできません。
VM イメージと、作成される仮想マシンが同じストレージアカウント内に存在する必要があります。

 #共通設定
$SubscriptionId = "xxxxxx" #使用したいサブスクリプション ID
$ResourceGroupName = "xxxxxx" #既存のリソースグループ名 (ストレージアカウントとの紐付けがあるもの)
$location = "Japan West" #リージョン名
$pipName = "myPIP" #パブリック IP アドレス名
$VnetName = "myVnet" #仮想ネットワーク名
$AddressPrefix = "192.168.3.0/25" #プレフィックス
$SubnetName = "mySubnet" #サブネット名
$subnetPrefix = "192.168.3.0/27" #プレフィックス
$storageAccName = "xxxxxx" #既存のストレージアカウント名 (VHD が配置されているもの)
$nicname = "mynic" #NIC名
$osDiskName = "OSDisk" #OSディスク名
$urlOfCapturedImageVhd = "https://xxxx.blob.core.windows.net/system/Microsoft.Compute/Images/xxxx/xxxx.vhd" #キャプチャした VHD ファイルパス

# VM の設定
$VmName1 = "xxxx" #仮想マシン名
$VmSize1 = "xxxx" #Standard_A1など仮想マシンのサイズ
 

# ログインおよびサブスクリプションの指定
Login-AzureRmAccount
Select-AzureRmSubscription -SubscriptionId $SubscriptionId

#パブリック IP アドレスの作成
$pip = New-AzureRmPublicIpAddress -Name $pipName -ResourceGroupName $ResourceGroupName -Location $location -AllocationMethod Static

#サブネットの作成
$subnetconfig = New-AzureRmVirtualNetworkSubnetConfig -Name $SubnetName -AddressPrefix $subnetPrefix

#仮想ネットワークの作成
$vnet = New-AzureRmVirtualNetwork -Name $VnetName -ResourceGroupName $ResourceGroupName -Location $location -AddressPrefix $AddressPrefix -Subnet $subnetconfig

#NIC の作成
$nic = New-AzureRmNetworkInterface -Name $nicname -ResourceGroupName $ResourceGroupName -Location $location -SubnetId $vnet.Subnets[0].Id -PublicIpAddressId $pip.Id


#ユーザー名・パスワードを設定
$cred = Get-Credential

#キャプチャーイメージが保存されたストレージアカウント情報を取得
$storageAcc = Get-AzureRmStorageAccount -ResourceGroupName $ResourceGroupName -AccountName $storageAccName

#仮想マシンの設定を定義
$vmConfig = New-AzureRmVMConfig -VMName $VmName1 -VMSize $VmSize1
$vm = Set-AzureRmVMOperatingSystem -VM $vmConfig -Windows -ComputerName $VmName1 -Credential $cred -ProvisionVMAgent -EnableAutoUpdate
$osDiskUri = '{0}vhds/{1}{2}.vhd' -f $storageAcc.PrimaryEndpoints.Blob.ToString(), $VmName1.ToLower(), $osDiskName
$vm = Set-AzureRmVMOSDisk -VM $vm -Name $osDiskName -VhdUri $osDiskUri -CreateOption fromImage -SourceImageUri $urlOfCapturedImageVhd -Windows

#NIC の追加
$vm = Add-AzureRmVMNetworkInterface -VM $vm -Id $nic.Id

#仮想マシンを作成
New-AzureRmVM -ResourceGroupName $ResourceGroupName -Location $location -VM $vm

 

作成された仮想マシン
generalize6

キャプチャーしたイメージからは、複数の仮想マシンを立ち上げることが可能です。