『Hyper-Vの仮想マシン(vhd(第2世代))をAzureへOS移行の仕方』をピックアップ!
いつもの爽やか青空系ブログから、IT技術に特化した記事になるがご了承願いたい。
Microsoft Azureはマイクロソフトのクラウド プラットフォーム。
最近ではアマゾンのクラウドサービス・AWSの大規模障害が話題になったが、今回はマイクロソフトのクラウドサービス・アジュールに関しての記事です。
一般的なデータドライブならネットで調べて、Azureポータルでちょちょいと出来てしまうが、マネジメントディスクともなると難しい(ましてやクラウドサーバー初体験の私にとってはなおさら、物理サーバーだってノータッチに近い)。
困ったことに、本屋でAzure移行の書籍って出回ってないんです(^-^;
だから各国のネット情報を翻訳を理解して進めるしかない。
まずは『移行元(Hyper-V)の準備・設定』から見ていこう(^^)/
※AZUREポータルは日ごとに進化しており、画面上のデザインおよび情報が変更になっている可能性もあるので注意(本記事は2019年9月時点の内容)。
また、本記事ではザックリとしたポイントを掲載しているので、詳細を知りたい方はMicrosoftのマニュアルを読むのが最適だ(最終的な理解は絶対マニュアル読むべき)。
◆私がOS移行の際に参考にしたマニュアル。
Azure にアップロードする Windows VHD または VHDX を準備する
PowerShell を使用して特殊化されたディスクから Windows VM を作成する
Azure Portal を使用して VHD から VM を作成する
Azure で一般化された VM の管理対象イメージを作成する
移行元(Hyper-V)の準備・設定。
基本的には『Azure にアップロードする Windows VHD または VHDX を準備する』を参照ですが、PowerShellのコマンドエラーとなる部分もあるのでポイントを解説していきます。
Azure用のWindows構成を設定する
Azure にアップロードする予定のVMで、管理者特権でのコマンド プロンプト ウィンドウから、次のコマンドを実行。
1. ルーティング テーブルの静的な固定ルートを削除。
ルート テーブルを表示するには、コマンド プロンプト ウィンドウで route print を実行。
Persistence Routes セクションを確認。 固定ルートがある場合は、route delete コマンドを使って削除。

「固定ルート:なし」を確認
2. WinHTTP プロキシを削除。
◆PowerShellコマンド
VM で特定のプロキシを使用する必要がある場合は、Azure の IP アドレス(168.63.129.16) にプロキシ例外追加。これにより VM は Azure に接続可能。
$proxyBypassList=”;168.63.129.16″
netsh winhttp set proxy $proxyAddress
3. ディスク SAN ポリシーを Onlineall に設定。
◆PowerShellコマンド
開いているコマンド プロンプト ウィンドウに、次のコマンドを入力。
◆DISKPARTコマンド
exit
4. Windows の協定世界時 (UTC) の時刻を設定。 また、Windows Time サービス (w32time) の起動の種類を Automatic に設定。
◆PowerShellコマンド
5. 電源プロファイルを高パフォーマンスに設定。
◆PowerShellコマンド
6. 環境変数の TEMP と TMP が既定値に設定されていることを確認。
◆PowerShellコマンド
Windows サービスの確認
◆PowerShellコマンド
Set-Service -Name dhcp -StartupType Automatic
Set-Service -Name dnscache -StartupType Automatic
Set-Service -Name IKEEXT -StartupType Automatic
Set-Service -Name iphlpsvc -StartupType Automatic
Set-Service -Name netlogon -StartupType Manual
Set-Service -Name netman -StartupType Manual
Set-Service -Name nsi -StartupType Automatic
Set-Service -Name termService -StartupType Manual
Set-Service -Name MpsSvc -StartupType Automatic
Set-Service -Name RemoteRegistry -StartupType Automatic
リモート デスクトップのレジストリ設定を更新する
リモート アクセスに関して次の設定が正しく構成されていることを確認。
1. リモート デスクトップ プロトコル (RDP) が有効になっていることを確認。
◆PowerShellコマンド
2. RDP ポートが正しくセットアップされています。 既定のポートは 3389 。
◆PowerShellコマンド
VM をデプロイすると、ポート 3389 に対する既定の規則が作成。
ポート番号を変更する場合は、VM が Azure にデプロイされた後で行う。
3. リスナーがすべてのネットワーク インターフェイスでリッスンしていることを確認。
◆PowerShellコマンド
4. RDP 接続のネットワーク レベル認証 (NLA) モードを構成。
◆PowerShellコマンド
5. キープアライブ値を設定。
◆PowerShellコマンド
6. 再接続。
◆PowerShellコマンド
7. コンカレント接続数を制限。
◆PowerShellコマンド
8. RDP リスナーに関連付けられている自己署名証明書をすべて削除。
◆PowerShellコマンド
以下のようなエラーメッセージが出るかもしれないが、その場合は「ファイル名を指定して実行」⇒「regedit」でレジストリエディタを開き、”SSLCertificateSHA1Hash” が存在していないことを確認しよう。
このコードは、VM のデプロイ時に最初から接続できるように。 これを後で確認する必要がある場合は、VM が Azure にデプロイされた後に行うことが可能。
9. VM がドメインの一部になる場合は、次のポリシーをチェックして、前の設定が元に戻されていないことを確認。
ポリシーの設定は「ファイル名を指定して実行」⇒「gpedit.msc」でローカルグループポリシーエディタを開き確認すること。

この画像はマニュアルから引用したが、ポリシーのネスト順序が若干間違っているので注意。
Windowsファイアウォール規則の構成
1. 3つのプロファイル (ドメイン、標準、パブリック) で Windowsファイアウォールを有効に。
◆PowerShellコマンド
2. WinRM に 3 つのファイアウォール プロファイル (ドメイン、プライベート、パブリック) の通過を許可し、PowerShellリモート サービスを有効に。
◆PowerShellコマンド
Set-NetFirewallRule -DisplayName “WindowsRemote Management (HTTP-In)” -Enabled True
3. RDP トラフィックを許可するために、ファイアウォール規則を有効に。
◆PowerShellコマンド
4. VM が仮想ネットワーク内部の ping コマンドに応答できるように、”ファイルとプリンターの共有” 規則を有効に。
◆PowerShellコマンド
5. VM がドメインの一部になる場合、次の Azure AD ポリシーをチェック。前の設定が元に戻されていないことを確認。
ポリシーの設定は「ファイル名を指定して実行」⇒「gpedit.msc」でローカルグループポリシーエディタを開き確認すること。
上記のような設定をしていく際に、「ICMP の例外を許可する」を有効にしたのに自動的に無効に設定される場合がある。
原因はよくわからないが、私はその場合「未構成」のままにしました。
VM の確認
VM が正常であり、セキュリティで保護されており、RDP アクセス可能であることを確認(ここ重要!)。
1. ディスクが正常で一貫性があることを確認するには、次回の VM 再起動時にディスクをチェック。
◆PowerShellコマンド
クリーンで正常なディスクがレポートに示されていることを確認してください。
2. ブート構成データ (BCD) を設定。
◆PowerShellコマンド
bcdedit /set “{default}” device partition=C:
bcdedit /set “{default}” integrityservices enable
bcdedit /set “{default}” recoveryenabled Off
bcdedit /set “{default}” osdevice partition=C:
bcdedit /set “{default}” bootstatuspolicy IgnoreAllFailures
bcdedit /set “{bootmgr}” timeout 5
bcdedit /set “{bootmgr}” bootems yes
bcdedit /ems “{current}” ON
bcdedit /emssettings EMSPORT:1 EMSBAUDRATE:115200
3. Dump ログは、Windowsのクラッシュの問題をトラブルシューティングするのに役立つ場合があります。 Dump ログ コレクションを有効に。
◆PowerShellコマンド
Set-ItemProperty -Path ‘HKLM:\SYSTEM\CurrentControlSet\Control\CrashControl’ -name CrashDumpEnabled -Type DWord -force -Value 2
Set-ItemProperty -Path ‘HKLM:\SYSTEM\CurrentControlSet\Control\CrashControl’ -name DumpFile -Type ExpandString -force -Value “%SystemRoot%\MEMORY.DMP”
Set-ItemProperty -Path ‘HKLM:\SYSTEM\CurrentControlSet\Control\CrashControl’ -name NMICrashDump -Type DWord -force -Value 1# Set up the guest OS to collect user mode dumps on a service crash event
$key = ‘HKLM:\SOFTWARE\Microsoft\Windows\WindowsError Reporting\LocalDumps’
if ((Test-Path -Path $key) -eq $false) {(New-Item -Path ‘HKLM:\SOFTWARE\Microsoft\Windows\WindowsError Reporting’ -Name LocalDumps)}
New-ItemProperty -Path $key -name DumpFolder -Type ExpandString -force -Value “c:\CrashDumps”
New-ItemProperty -Path $key -name CrashCount -Type DWord -force -Value 10
New-ItemProperty -Path $key -name DumpType -Type DWord -force -Value 2
Set-Service -Name WerSvc -StartupType Manual
4. WindowsManagement Instrumentation (WMI) リポジトリに一貫性があることを確認。
◆PowerShellコマンド
リポジトリが破損している場合は、「WMI:リポジトリが破損しているかどうか」を参照。
5. 他にポート 3389 を使用しているアプリケーションがないことを確認。
このポートは、Azure の RDP サービスに使用。 VM で使用されているポートを確認するには、netstat -anob を実行。
◆PowerShellコマンド
6. ドメイン コントローラーである WindowsVHD をアップロードするには、次のように。
ドメインコントローラとは、LANなどのネットワーク環境におけるドメイン内で、ユーザアカウントのログオン認証や集中管理するソフトウェア(サーバ)であり、更にはそれを稼働させるコンピュータである。
いわゆる「ドメインサーバー」ってことかな。
以下の手順に従って、ディスクを準備。
ある時点で Directory Services Restore Mode (DSRM) の VM を起動しなければならない場合に備えて、DSRM パスワードを把握していることを確認。 詳細については、「DSRM パスワードの設定」を参照してください。
7. あらかじめ登録された Administrator アカウントとパスワードを把握していることを確認。
現在のローカル Administrator パスワードをリセットし、このアカウントを使用して RDP 接続を介して Windowsにサインイン可能であることを確認することも可能。
このアクセス許可は、”リモート デスクトップ サービスを使ったログオンを許可” グループ ポリシー オブジェクトによって制御されています。 このオブジェクトは、次の場所からローカル グループ ポリシー エディターで表示。
8. 次の Azure AD ポリシーで、RDP 経由とネットワークからの自分の RDP アクセスをブロックしていないことを確認。
[コンピューターの構成][Windowsの設定][セキュリティ設定][ローカル ポリシー][ユーザー権利の割り当て][ネットワーク経由のアクセスを拒否]
[コンピューターの構成][Windowsの設定][セキュリティ設定][ローカル ポリシー][ユーザー権利の割り当て][リモート デスクトップ サービスを使ったログオンを拒否]
9. 次の Azure AD ポリシーで、必要なアクセス アカウントのいずれも削除していないことを確認。
[コンピューターの構成][Windowsの設定][セキュリティ設定][ローカル ポリシー][ユーザー権利の割り当て][ネットワーク経由でコンピューターへアクセス]
ポリシーには次のグループが一覧表示されるはずです。
管理者(administrator)、Backup Operators、Everyone、ユーザー
10. VM を再起動。Windowsが正常であり、RDP接続を介してアクセス可能を確認。
この時点で、ローカル Hyper-V に VM を作成して、VM が完全に起動することを確認可能。
次に、RDP を介して VM に到達できることを確認するためのテストを実行。
11. 余分な Transport Driver Interface (TDI) フィルターはすべて削除。
たとえば、TCP パケットや追加のファイアウォールを分析するソフトウェアは削除。
これを後で確認する必要がある場合は、VM が Azure にデプロイされた後に行うことが可能。
12. 物理コンポーネントまたはその他の仮想化テクノロジに関連する、その他のサードパーティ ソフトウェアまたはドライバーをアンインストール。
Windows更新プログラムのインストール状況を確認。
Sysprep を使用する状況の判断
私のケース(OS移行)の場合、Sysprepは実行していません。
Sysprepを実行してVM作成しても、VMが起動しませんでした。
システム準備ツール (Sysprep) は、Windowsインストールをリセットするために使用できるプロセスです。 Sysprep は、個人データをすべて削除し、コンポーネントをいくつかリセットすることによって、”すぐに使用できる” エクスペリエンスを提供。
Sysprep は通常、特定の構成を持つ他の複数の VM のデプロイ元となるテンプレートを作成するために実行。 このテンプレートは、一般化されたイメージと呼ばれます。
1 つのディスクから 1 つの VM のみを作成する場合は、Sysprep を使用する必要はありません。 代わりに、特殊化されたイメージから VM を作成することが可能。 特殊化されたディスクから VM を作成する方法については、以下を参照してください。
特殊化されたディスクからの VM の作成
特殊化された VHD ディスクからの VM の作成一般化されたイメージを作成する場合は、Sysprep を実行する必要があります。 詳しくは、「How to use Sysprep: An Introduction」 (Sysprep の使用方法: 概要) をご覧ください。
vhdx(第2世代)からvhdに変換。
ポイントは対象の仮想マシンをシャットダウンし、「容量固定」でvhd変換すること。
① Hyper-V マネージャーを開いて、左側のローカル コンピューターを選択。
② コンピューター リストの上にあるメニューで、 [アクション] > [ディスクの編集] の順に選択。
③[仮想ハード ディスクの場所] ページで、対象の仮想ディスクを選択。
④[アクションの選択] ページで、 [変換] > [次へ] の順に選択。
⑤VHDX から変換する必要がある場合は、 [VHD] > [次へ] の順に選択。
⑥容量可変ディスクから変換する必要がある場合は、 [容量固定] > [次へ] の順に選択。
⑦新しい VHD ファイルの保存先となるパスを見つけて選択。
⑧[完了] を選択
AZCOOPYでAzureポータルにアップロード。
AzCopy は、ストレージ アカウント間の BLOB(※)またはファイル コピーに利用できるコマンドライン ユーティリティです。
まぁ簡単に言うとアップロードコマンドだ。
※Azureポータル(GUI)でもストレージにアップロードできるが、私の場合、転送速度が遅い&デプロイエラー(404)になったのでAzcopyコマンドを使用。
※BLOBとは、 データベースシステムで用いられるデータ型のひとつ。
一般的に、画像や音声などの大きなバイナリデータそのままメモリに格納することが可能。
転送先のストレージを作成後、
まずはAzCopy を使ってみるでAZCOPYをダウンロードしよう。
AZCOPYのコマンド説明。
AzCopy.exeが格納されているディレクトリにcdコマンドやpushdで移動。
コマンドは…
「azcopy 【移送元フォルダ】 【移送先ストレージURL】 【アクセスKEY】 【移送ファイルvhd】 【BLOBタイプ】 【スレッド数】」
※詳細はAzcopyの引数参照。

ストレージURLの確認
アクセスキーの確認
VM作成のパターンを抑えよう。
Azureポータルをいじくりまわすと分かるが、VM作成には大まかに以下の3パターンの作成方法がある(私が知っている限り)。
結論から言うと今回のケース「Hyper-Vの仮想マシン(vhd(第2世代))をAzureへOS移行」は③のイメージからVMを作成するのが適していた。
①Virtual Machines画面から新規作成。
Virtual Machines画面から新規作成は、一般的な仮想マシンの作成方法でしょうね。

Virtual Machines画面からVM新規作成。
私はサクッとVM作成して「OSディスクのスワップ」を実行すれば余裕で入れ替えられると思っていたが無理でした。
また既定のOSは、すべて英語版。
いちいち日本語化を設定するなんて時間の無駄で効率が悪い。
一応OS日本語化のリンクを張っておきます。
②ディスクからVM作成。
以下の2つの方法でVMを作成してもうまくいきませんでした。
Azure Portal を使用して VHD から VM を作成する
PowerShell を使用して特殊化されたディスクから Windows VM を作成する
特殊化されたディスクからVM作成する方法が一番しっくり来ていたんですが、
デプロイ時に以下のようにエラーになります。
VMに実行中のVMエージェントがあり、アウトバウンド接続を確立できることを確認してください。
ErrorCode:VMAgentStatusCommunicationError
ErrorMessage:VM ‘VM201909241752’は、VMエージェントまたは拡張機能のステータスを報告していません。 VMに実行中のVMエージェントがあり、Azureストレージへのアウトバウンド接続を確立できることを確認してください。
VM agent and can establish outbound connections to Azure storage.
エラーメッセージから解析し、中国語のQAサイトに行き着きましたが、結局VMはうまく起動しませんでした。
◆中国語のQAサイト
New-AzureRmVM:长时间运行操作失败,状态为“Failed”ErrorCode:VMAgentStatusCommunicationError
◆中国語のQAサイトからのリンク先
Azure VM から非管理対象 VM イメージを作成する方法
③イメージからVM作成。
で、行き着いたのがイメージからVMを作成する方法。
”イメージ”のイメージがわかないので、イメージの概要を押さえておきましょう。
~イメージの概要~
・Azure上に存在する仮想マシンをテンプレート化して簡単に複製を作成するためのサービス。
・仮想マシンのOSディスクのみでなく追加されたデータディスクもまとめて一つのイメージとしてテンプレート化できる。
・従来のカスタムイメージと違いBLOB上のVHDファイルでなく、一つのリソースとして見える。
・仮想マシンからのみでなく、BLOB上の既存VHDからもイメージの作成が可能。
・イメージに対して課金は一切発生しない。
まずはイメージを作成する。
イメージリソースのページを開き、「追加」を選択 。
必須項目、OSの種類入力後、「VMの生成」で世代を選択。

世代(GEN)選択を間違わないこと!BLOBも入力しよう。
ここで言っている世代とは、移行元となるVHDファイルの世代のこと。
Gen1(第1世代)、Gen2(第2世代)を間違うと、VMデプロイ時に「プロビジョニング失敗」となるので絶対間違わないこと(私はここでハマった…)。
プロビジョニングエラーとなる原因についてはこちらの記事がわかりやすい。
イメージからVM作成。
イメージの生成に成功したら、イメージからVMを作成しよう。
ネットワーク速度にもよるが、結構VM作成に時間がかかりました(3,40分くらい)。
私ははじめ「プロビジョニング失敗」と通知があったが、なぜかVMの状態は実行中だし、ブート診断でスクショを確認しても正常に起動しているように見えた。

ブート診断で画面確認。
というわけで、以下のVMのネットワーク設定をして、RDP接続後ログインができ、VM作成に成功した。
ネットワーク設定。
ネットワーク設定をしたら、VMの再起動でネットワークが適用されます。

ポート3389を追加する。
RDP接続確認。
いよいよVMにログインできるか確認するために、RDP接続しよう。

RDP接続しよう。
Hyper-Vの仮想マシン(vhd(第2世代))をAzureへOS移行する際のまとめ。
・移行元のWindows構成の設定時、Sysprepは行わない。
・vhdxからvhdに変換は「容量固定」で行う。
・VM作成はイメージから行う。(世代指定(Gen)をよく確認)
以上、『Hyper-Vの仮想マシン(vhd(第2世代))をAzureへOS移行の仕方』をピックアップしました!
Azureの理解を深めたい場合は専門の書籍を購入しよう。
今回行った作業は特殊なケースなのか、本屋でAZURE関連の本を立ち読みしても触れられていなかったです( ;∀;)。
今日も最後まで読んでいただきありがとうございました!
Hyper-Vで発生したエラーについてはこちらの記事参照。
スッキリしたデザイン&コンパクトUSBハブで生産性アップ!