【Hyper-V】仮想マシンのバックアップを取得する方法3選

サーバーラックのイメージ画像

サーバ仮想化の大きな利点のひとつとして、マシン全体のバックアップ・リストアが容易という点があります。

Microsoft製の仮想化ソリューションである、Hyper-Vの仮想マシンのバックアップの概要や、バックアップ取得の方法についてまとめてみました。

Hyper-Vのバックアップ機能概要

エクスポート

Hyper-Vでは、仮想マシンのバックアップにエクスポートという機能を使います。

エクスポートを実行することによって、仮想マシンのデータや状態を、ファイルとして取得することができます。エクスポートされたファイルは、任意のHyper-Vホストにインポートすることで、仮想マシンとしてリストアすることが可能です。

基本的には、仮想マシンの起動中にもエクスポートを実行することができ、条件を満たせばオンライン(無停止)のままバックアップが可能です。

エクスポートによってバックアップできるデータは下記です。

仮想マシンのハードウェアの設定

Hyper-Vマネージャのプロセッサ数やメモリ容量などの、ハードウェアに関する設定です。

Hyper-Vの仮想マシン設定画面

仮想マシンに接続された仮想ディスク

仮想マシンのデータを格納している仮想ディスク(.vhd or .vhdxファイル)です。

仮想マシンのデバイスの状態とメモリの内容

デバイスの状態(メモリ容量やDVDドライブの中身など)や、仮想マシンが実行中であった場合はエクスポート実行時のメモリの内容をファイルにダンプします。

インポート時にこのファイルが読み込まれることで、起動中の仮想マシンの状態をリストアすることができます。稼働中の仮想マシンをエクスポートすることで、任意の時点でのマシンのクローンを作成することができるので、システムのデバッグに有用な機能です。

オンラインでエクスポートを実行する条件

下記記事を参考にする限り、Hyper-VホストがWindows Server 2012 R2以降であれば、前述のようにオンラインでエクスポートを実行できるようです。(クライアント用Windowsについては、調査未実施のため不明です)

Hyper-Vのバックアップで仮想マシンは止まらない:その知識、ホントに正しい? Windowsにまつわる都市伝説(34) – @IT

チェックポイント

Hyper-Vのチェックポイント表示画面

Hyper-Vにはエクスポートとは別に、チェックポイントという機能もあります。

チェックポイントは、仮想マシンの特定の時点を保存する機能です。エクスポートと同じく、マシンの停止中はもちろん、起動中に取得することが可能です。マシン起動中にチェックポイントを作成すると、仮想ディスクのデータ+メモリの内容が保存されます。

チェックポイントで取得できるデータと、エクスポートで取得できるデータには、あまり違いはありません。エクスポートとの違いは、エクスポートがバックアップ・移行が主な目的であるのに対し、チェックポイントは純粋に取得時の仮想マシンの静止点を取ることを目的としている点です。Hyper-Vのチェックポイントは、ほかで言うところのスナップショットに当たります。

そのため、エクスポートとチェックポイントでは、下記のような差があります。

エクスポート

  • エクスポートしたデータは、別のマシンにコピー・移動することが可能です。
  • エクスポートした仮想マシンを同じ物理ホストにインポートすることも可能ですが、エクスポート元の仮想マシンとは別の仮想マシンとしてリストアされます。
  • エクスポートした仮想マシンは、何台でも、何回でもインポートさせることができます。(※ただし、インポート時の設定によっては1度きりしかインポートできません。こちらは後述します。)

チェックポイント

  • チェックポイントは、取得しただけでは別のマシンにコピー・移動することはできません。そのため、単純にチェックポイント取得しただけでは、操作ミスやアプリケーションのバグ等によるデータ消失は防ぐことができますが、ホストの物理故障などによるデータ消失は防ぐことができません。(※ただし、任意のチェックポイントを指定し、「チェックポイントをエクスポート」することで、チェックポイント取得時の状態をひとつの仮想マシンとして扱い、コピー・移動することが可能になります。)
  • チェックポイントは、チェックポイントを取得した仮想マシンに紐づけられ、その仮想マシンのチェックポイント取得時点の静止点を保持しています。
  • 取得したチェックポイントには、何回でも戻ることが可能です。チェックポイントから起動した仮想マシンから、再度新しくチェックポイントを作成することができます。この二つの特性を利用して、チェックポイントの分岐を作成し、管理することができます

チェックポイントの作りすぎには要注意

Hyper-Vのチェックポイントは、差分仮想ハードディスク(AVHDXファイル)を利用して作成されます。具体的には、チェックポイントを取得したとき、下記のような動作をします。

  1. チェックポイントを作成した時点で、仮想ハードディスクの内容が読み取り専用になる。
  2. 以後、仮想マシンに対して行った変更は、1で読み取り専用となった仮想ハードディスクとの差分として、差分仮想ハードディスクに記録される。
  3. この状態から、さらにチェックポイントを作成すると、1→2が再度実行され、差分仮想ハードディスクが1台増える。

チェックポイントの作成を何度も実施し、チェックポイントの階層が深くなればなるほど、ディスクアクセス時に多くの差分仮想ハードディスクを読まなければいけなくなるため、ストレージ性能が落ちます。チェックポイントの階層を増やしすぎないように注意するべきです。

差分ハードディスクファイル

仮想マシンのバックアップ方法

それでは、仮想マシンのバックアップ方法について見ていきます。

前述の通り、仮想マシンのバックアップをするには「エクスポート」を利用することが第一選択となります。そして、エクスポートを実施するにも、下記3つの方法があります。どれも一長一短ありますので、以下で比較していきます。

方法1. Hyper-V マネージャー を利用してエクスポートする

Hyper-Vを有効化すると付いてくるGUI管理ツールの、Hyper-Vマネージャーから仮想マシンをエクスポートする方法です。最も簡単なエクスポート方法です。

エクスポート手順

①対象の仮想マシンを右クリックし、エクスポートを選択する。

Hyper-Vマネージャーからのエクスポート手順

 

②ダイアログが開くので、バックアップを出力したいパスを選択し、「エクスポート」を選択。

Hyper-Vマネージャーからのエクスポート手順

 

③図のように進捗状況が表示されるので、100%になるまで待つ。

Hyper-Vマネージャーからのエクスポート手順

 

④エクスポートが完了すると、仮想マシンと同じ名前のフォルダができている。このフォルダとその配下のファイルがあれば、エクスポートした仮想マシンをリストアすることができる。

エクスポートされたフォルダには、仮想マシンの設定・ハードウェアの状態・仮想ディスクファイル(.vhd or .vhdx)・取得したチェックポイントなどの情報が含まれる。

仮想マシン名
┃
┣ Snapshots  # 仮想マシンに紐づけられたチェックポイントの構成情報
┃ ┣ VMCXファイル(.vmcx) # チェックポイントに紐づけられているファイルと仮想マシン構成情報
┃ ┣ VMGSファイル(.vmgs) # チェックポイント取得時のデバイスの状態(Windows Server 2012 R2 以前ではVMRSファイルに含まれる)
┃ ┗ VMRSファイル(.vmrs) # チェックポイント取得時の仮想マシンのメモリの内容(マシン停止中でも生成される)
┃
┣ Virtual Hard Disks # 仮想マシンに紐づけられた仮想ハードディスクの情報
┃ ┣ VHDXファイル(.vhdx) # 仮想ハードディスクファイル
┃ ┗ AVHDXファイル(.avhdx) # 差分仮想ハードディスクファイル
┃
┗ Virtual Machines # 仮想マシンの構成情報(内容はSnapshots配下と同様)
  ┣ VMCXファイル(.vmcx)
  ┣ VMGSファイル(.vmgs)
  ┗ VMRSファイル(.vmrs)

方法2. Windows Server バックアップ を利用してエクスポートする

Windows Server バックアップを利用して、仮想マシンをエクスポートすることもできます。既にWindows Serverバックアップを利用している場合や、簡単な操作で定期的に仮想マシンのバックアップを取得したい場合に便利です。

デメリットとしては、バックアップを世代管理することができないため、柔軟性に欠けます。また、Windows Serverを使っていれば漏れなく使用することができますが、当然、クライアント版Windowsを使っている場合はこの手順は使えません。

Windows Serverバックアップを利用したエクスポート手順は、ここでは割愛します。

方法3. PowerShell を利用してエクスポートする

PowerShellに用意されている、Hyper-Vの管理・操作用のコマンドを利用してコマンドライン上からエクスポートすることも可能です。コマンドの使い方を覚えないといけないのが少し面倒ですが、PowerShellスクリプトとWindows標準のタスクスケジューラを組み合わせることで、思い通りのバックアップ管理をすることができます。

Export-VM コマンド

Export-VM -Name <仮想マシン名> -Path <エクスポート先のパス> -CaptureLiveState <オンラインバックアップ時のオプション>

Hyper-Vの仮想マシンをエクスポートするPowerShellコマンドです。

-CaptureLiveState オプションは、仮想マシン起動時に行われるオンラインでのエクスポートの挙動を制御します。下記が指定可能です。

オプション 説明
CaptureSavedState エクスポート実行時のメモリの状態を保存します。
CaptureDataConsistentState 運用チェックポイント機能を利用して、整合性の取れたファイルシステムのバックアップを取得します。(メモリの状態は保存しません
CaptureCrashConsistentState エクスポート実行時の仮想マシンの状態に関する情報を保存しません。

運用チェックポイントとは

運用チェックポイントとは、アプリケーション整合性のあるバックアップを取得するための機能です。

仮想マシンが起動中の場合、エクスポートやチェックポイントのデフォルトの挙動は、エクスポート/チェックポイントの取得時のメモリの状態をそのまま保存します。この挙動だと、取得のタイミングによってはデータの不整合が発生する可能性があります。そのため、通常のチェックポイントは運用環境においては非推奨とされていました。

運用チェックポイントでは、メモリの状態を保存せず、仮想マシン自身が持つ機能を利用して、アプリケーション整合性を担保してチェックポイントを取得します。Windowsではボリュームシャドウコピーサービス(VSS)、Linuxではfsfreezeが使用されます。

PowerShellスクリプトを利用する

PowerShellスクリプトを作成することで、より柔軟なバックアップを取得することができます。

スクリプトの実装例として、私が作成し、実際に利用しているものをGitHubに上げていますので、参考にどうぞ。

https://github.com/haxyier/ps-export-vm

スクリプトの実行ポリシーに注意

スクリプト実行ポリシーエラー

PowerShellには、スクリプトの実行ポリシー(ExecutionPolicy)という設定があります。これは、信頼できないソースからのスクリプトの実行をブロックするという、セキュリティのための設定です。ただし、デフォルトの状態では実行ポリシーによって、全くPowerShellスクリプトが実行できない設定になっている環境もあるので、確認のうえ必要に応じて設定を変更する必要があります。

ひとまず、実行ポリシーはRemoteSigned(リモートホストのスクリプトを実行する場合のみ署名が必須)にしておけば基本困らないかと思います。

# 実行ポリシーの確認
PS C:\WINDOWS\system32 > Get-ExecutionPolicy
Restricted

# 実行ポリシーをRemoteSignedに変更する
PS C:\WINDOWS\system32 > Set-ExecutionPolicy RemoteSigned

実行ポリシーは、信頼されていないスクリプトからの保護に役立ちます。実行ポリシーを変更すると、about_Execution_Policies
のヘルプ トピック (https://go.microsoft.com/fwlink/?LinkID=135170)
で説明されているセキュリティ上の危険にさらされる可能性があります。実行ポリシーを変更しますか?
[Y] はい(Y)  [A] すべて続行(A)  [N] いいえ(N)  [L] すべて無視(L)  [S] 中断(S)  [?] ヘルプ (既定値は "N"): y

実行ポリシーについて詳しくは下記を参照のこと。

WindowsでPowerShellスクリプトの実行セキュリティポリシーを変更する

タスクスケジューラと組み合わせて自動エクスポート

WindowsのタスクスケジューラとPowerShellスクリプトを組み合わせると、日次や週次など、任意のタイミングでエクスポートを自動実行することができます。

タスクスケジューラの詳細な使用方法はここでは割愛しますが、1つ注意点を紹介しておきます。

PowerShellスクリプトを自動起動するタスクでは、プロパティのうち、「操作」の指定方法に少し癖があります。具体的には、下記のように指定する必要があります。

タスクスケジューラの操作の編集画面

設定項目 説明 設定例
プログラム/スクリプト PowerShell.exe本体のファイルパスを指定する。 C:\Windows\System32\WindowsPowerShell\v1.0\powershell.exe
引数の追加(オプション) 起動するスクリプトのファイルパスを指定する。 -NonInteractive -NoProfile -ExecutionPolicy RemoteSigned -c “<スクリプトのパス>”
開始(オプション) 起動するスクリプトが格納されているフォルダのパスを指定する。 <スクリプトの格納先フォルダのパス>

仮想マシンのインポート方法

エクスポートした仮想マシンは、下記の手順でリストアします。

 

①Hyper-Vマネージャーの「仮想マシンのインポート」を選択する。

Hyper-Vマネージャーからのエクスポート手順

 

②開いたダイアログに、エクスポートした仮想マシンが格納されているフォルダを指定します。

仮想マシンのインポート画面

 

③自動で仮想マシンを認識するので、対象の仮想マシンを選択する。

仮想マシンのインポート画面

 

④インポートの種類を選択します。3種類の方法で仮想マシンをリストアすることが可能です。

仮想マシンのインポート画面

 

⑤④で、「仮想マシンをインプレースで登録する」以外を選択した場合、仮想マシンを構成する各フォルダのリストア先を指定します。

仮想マシンのインポート画面

 

⑥仮想ハードディスクをリストアする先を指定します。

仮想マシンのインポート画面

 

⑦最後に、これまでの選択の内容が一覧表示されるので、「完了」を押下すると仮想マシンのインポートが開始されます。

仮想マシンのインポート画面

 

⑧インポートが完了すると、Hyper-Vマネージャーの画面に仮想マシンが追加されます。

Hyper-Vマネージャーからのエクスポート手順

インポートの種類とは

上記インポート手順④の、「インポートの種類」について、それぞれを選択した場合どのようにインポートが実行されるかを表にまとめました。

インポートの種類 説明

仮想マシンをインプレースで登録する

(既存の一意なIDを使用する)

エクスポートした仮想マシンが格納されているファイルパスにそのまま仮想マシンをリストアします。

この方法でインポートを実行すると、インポートに使用したエクスポート済みの仮想マシンファイルを使いまわして再度エクスポートを実行することが不可能になります

仮想マシンを復元する

(既存の一意なIDを使用する)

エクスポートした仮想マシンが持っていた一意なIDを引き継いで、任意のファイルパスに仮想マシンをリストアします。

一意なIDは、同一物理ホストの仮想マシン間で重複させることができないという制限があります。(※一意なIDは、仮想マシンの名前とは異なります。)

この方法でインポートを実行すると、インポートに使用したエクスポート済みの仮想マシンファイルはそのまま残るので、使いまわして再度インポートを実行することができます。ただし、同一物理ホストにインポートする場合は、「同じ一意なIDを持つ仮想マシンが存在しないこと」が条件となります。

仮想マシンをコピーする

(新しい一意なID作成する)

エクスポートした仮想マシンが持っていた一意なIDを引き継がず、新しいIDを採番して任意のファイルパスに仮想マシンをリストアします。

この方法でインポートを実行すると、インポートに使用したエクスポート済みの仮想マシンファイルはそのまま残り、同一物理ホストに複数回インポートすることが可能です。

まとめ

今回取り上げた内容は、どれもHyper-Vの仮想マシンを扱う上で重要な知識ではありますが、紛らわしい概念があったり、OSがアップデートされる度に変更点があったりと、(昔はチェックポイントのことをスナップショットと言っていた気がします)理解しづらい知識ではあります。このあたり、パブリッククラウドは上手くラップしているなぁと思ったりします。

参考

 

マスタリングWindows Server 2016 Hyper-V (マイクロソフト関連書)

あわせて読みたい

コメントを残す

質問・感想などお気軽にどうぞ。
*が付いている項目は入力必須です。メールアドレス以外の項目が公開されます。
スパム防止のため、コメント反映まで少々時間がかかります。