20.39. スナップショットの管理

以下のセクションでは、ゲスト仮想マシンのスナップショットを操作するために実行できるアクションについて説明します。スナップショット は、指定された時点のゲスト仮想マシンのディスク、メモリー、およびデバイスの状態を取得し、今後の使用に備えて保存します。スナップショットには、OS イメージの「クリーンな」コピーを保存することから、破壊的な操作となりかねない操作を実行する前のゲスト仮想マシンの状態を保存することに至るまで数多くの使用方法があります。スナップショットは固有の名前で識別されます。スナップショットのプロパティーを表すために使用される XML 形式のドキュメントについては、libvirt のアップストリームの web サイト を参照してください。

重要

Red Hat Enterprise Linux 7 は、ゲスト仮想マシンが一時停止または電源オフの状態でのスナップショットの作成のみをサポートしています。稼働中のゲストのスナップショット作成 (ライブスナップショット と呼ばれる) は、Red Hat Virtualization で実行できます。詳細については、サービス担当者にご連絡ください。

20.39.1. スナップショットの作成

virsh snapshot-create コマンドは、ゲスト仮想マシンの XML ファイルで指定されたプロパティーでゲスト仮想マシンのスナップショットを作成します (<name> および <description> 要素、および <disks>)。スナップショットを作成するには、以下を実行します。
# virsh snapshot-create domain XML file [--redefine [--current] [--no-metadata] [--halt] [--disk-only] [--reuse-external] [--quiesce] [--atomic]
ゲスト仮想マシン名、ID、または UID は、ゲスト仮想マシン要件として使用することができます。XML 要件は、少なくとも namedescription、および disks 要素を含む文字列です。
残りのオプションの引数は以下のようになります。
  • --disk-only - ゲスト仮想マシンのメモリー状態はスナップショットに含まれません。
  • XML ファイル文字列が完全に省略されると、libvirt はすべてのフィールドの値を選択します。新規のスナップショットは snapshot-current に記載されるように現行のスナップショットになります。さらに、スナップショットには、ゲスト仮想マシンの状態を含む通常のシステムチェックポイントではなく、ディスクの状態のみが含まれます。ディスクスナップショットは完全なシステムチェックポイントよりも高速ですが、ディスクスナップショットに戻すには、fsck またはジャーナルの再生が必要になる場合があります。ディスクスナップショットは電源コードが不意に引き抜かれる場合のようなディスク状態になるためです。--halt および --disk-only を混在させると、ディスクにフラッシュされていなかったすべてのデータが失われることに注意してください。
  • --halt - スナップショットの作成後にゲスト仮想マシンを非アクティブな状態のままにします。--halt および --disk-only を混在させると、その時点でディスクにフラッシュされていないすべてのデータとメモリー状態が失われます。
  • --redefine は、virsh snapshot-dumpxml で生成されるすべての XML 要素が有効な場合、スナップショットを以下の目的で使用できるように指定します。あるマシンから別のマシンにスナップショットの階層を移行する。一時的 なゲスト仮想マシンが途中でなくなり、後で同じ名前および UUID で再作成する際に階層を再作成する。スナップショットのメタデータに若干の変更を加える (例: スナップショットに組み込まれるゲスト仮想マシン XML のホスト固有の部分など)。このフラグが指定されると、xmlfile 引数は必須となり、ゲスト仮想マシンの現在のスナップショットは、--current フラグも指定されない限り変更されることがありません。
  • --no-metadata はスナップショットを作成しますが、すべてのメタデータはただちに破棄されます (つまり、libvirt はスナップショットを現在の状態で処理せず、--redefine が後に使用されて libvirt にメタデータについて再度指示しない限り、スナップショットには戻りません)。
  • --reuse-external を使用して、スナップショット XML が既存ファイルの移行先を含む外部スナップショットを要求する場合、移行先が存在している必要があり、再利用されます。それ以外の場合には、スナップショットは、既存ファイルのコンテンツが失われるのを回避するために拒否されます。
  • --quiesce が指定されると、libvirt はゲストエージェントを使用してゲスト仮想マシンのマウントされたファイルシステムをフリーズおよびフリーズ解除するよう試行します。ただし、ゲスト仮想マシンにゲストエージェントがない場合、スナップショットの作成は失敗します。スナップショットにはゲスト仮想マシンのメモリー状態が格納されます。スナップショットは外部である必要があります。
  • --atomic を指定すると、スナップショットが成功するか、または変更なしに失敗することを libvirt が保証します。すべてのハイパーバイザーがこの機能をサポートしている訳ではないことに注意してください。このフラグが指定されていない場合、一部のスーパーバイザーは部分的にこのアクションを実行した後に失敗する可能性があります。部分的な変更が生じたかどうかを確認するには、virsh dumpxml を使用する必要があります。
スナップショットのメタデータがあると、永続的なゲスト仮想マシンの定義解除の試行が回避されます。ただし、一時的なゲスト仮想マシンの場合、ゲスト仮想マシンが実行を停止すると、スナップショットのメタデータは通知なしに失われます (destroy などのコマンドによるか、または内部ゲストアクションによる)。

20.39.2. 現在のゲスト仮想マシンのスナップショットの作成

virsh snapshot-create-as コマンドは、ゲスト仮想マシンのスナップショットを、ゲスト仮想マシン XML ファイルで指定されたプロパティーを使って作成します ( (name および description 要素など)。これらの値が XML 文字列に含まれない場合、libvirt が値を選択します。スナップショットを作成するには、以下を実行します。
# snapshot-create-as domain {[--print-xml] | [--no-metadata] [--halt] [--reuse-external]} [name] [description] [--disk-only [--quiesce]] [--atomic] [[--memspec memspec]] [--diskspec] diskspec]
残りのオプションの引数は以下のようになります。
  • --print-xml は、実際にスナップショットを作成するのではなく、出力として snapshot-create の適切な XML を作成します。
  • --halt は、スナップショットの作成後にゲスト仮想マシンを非アクティブな状態に維持します。
  • --disk-only は、ゲスト仮想マシンの状態が含まれないスナップショットを作成します。
  • --memspec を使用してチェックポイントを内部または外部にするかどうかを制御できます。このフラグは必須であり、この後に、memspec 形式の [file=]name[,snapshot=type] が続きます。ここでタイプは、「none」、「internal」または「external」にすることができます。file=name にリテラルコンマを組み込むには、2 番目のコンマでこれをエスケープします。
  • --diskspec オプションは、--disk-only および外部チェックポイントが外部ファイルを作成する方法を制御するために使用できます。このオプションは、ドメイン XML の <disk> 要素の番号に基づいて複数回使用される可能性があります。それぞれの <diskspec> は disk[,snapshot=type][,driver=type][,file=name] 形式で表わされます。特定ディスクで --diskspec を省略すると、仮想マシン設定のデフォルトの動作が使用されます。リテラルコンマを disk または file=name に組み込むには、2 番目のコンマでそれをエスケープします。リテラルの --diskspec は、domainname、および description の 3 つすべてがない限り、それぞれのディスク仕様の前に置かれる必要があります。たとえば、diskspec が vda,snapshot=external,file=/path/to,,new の場合、以下の XML が生成されます。
    
    <disk name=’vda’ snapshot=’external’>
       <source file=’/path/to,new’/>
    </disk>
    

    重要

    Red Hat では、他の仮想化ツールで処理されると柔軟性や信頼性が高くなるため、外部スナップショットの使用を推奨しています。外部スナップショットを作成するには、virsh-create-as コマンドで --diskspec vda,snapshot=external オプションを使用します。
    このオプションを使用しないと virsh は内部スナップショットを作成しますが、これは安定性と最適化の面から推奨されません。詳細は、「libvirt による外部スナップショット作成の回避策」 を参照してください。
  • --reuse-external が指定され、ドメイン XML または diskspec オプションが既存ファイルの移行先を含む外部スナップショットを要求する場合、移行先が存在している必要があり、再利用されます。そうでない場合には、スナップショットは既存ファイルのコンテンツが失われるのを回避するために拒否されます。
  • --quiesce が指定されると、libvirt はゲストエージェントを使用してゲスト仮想マシンのマウントされたファイルシステムをフリーズおよびフリーズ解除するよう試行します。ただし、ドメインにゲストエージェントがない場合、スナップショットの作成は失敗します。現在、これには --disk-only を渡すことも必要です。
  • --no-metadata はスナップショットデータを作成しますが、すべてのメタデータはただちに破棄されます (つまり、libvirt は、snapshot-create が後に使用され、libvirt に対してメタデータについて再び指示がなされない限り、スナップショットを現状の状態で処理せず、スナップショットには戻りません)。このフラグには --print-xml との互換性はありません。
  • --atomic を指定すると、スナップショットが成功するか、または変更なしに失敗することを libvirt が保証します。すべてのハイパーバイザーがこの機能をサポートしている訳ではないことに注意してください。このフラグが指定されていない場合、一部のスーパーバイザーは部分的にこのアクションを実行した後に失敗する可能性があります。部分的な変更が生じたかどうかを確認するには、virsh dumpxml を使用する必要があります。

警告

現在、64 ビット ARM プラットフォーム 上で稼働中の KVM ゲストのスナップショットを作成することはできません。64 ビット ARM 上の KVM は開発プレビューとして提供されます。

20.39.3. 現在使用中のスナップショットの表示

virsh snapshot-current コマンドは、現在使用されているスナップショットをクエリーするために使用されます。
# virsh snapshot-current domain {[--name] | [--security-info] | [snapshotname]}
snapshotname が使用されていない場合、ゲスト仮想マシンの現行スナップショットのスナップショット XML (ある場合) は出力として表示されます。--name が指定されている場合、完全な XML ではなく、現在のスナップショット名のみが出力として送信されます。--security-info が指定される場合、セキュリティー上の機密情報が XML に組み込まれます。snapshotname を使用する場合、ゲスト仮想マシンに戻さずに、既存の指定されたスナップショットを現在のスナップショットにする要求が生成されます。

20.39.4. snapshot-edit

このコマンドは、現在使用されているスナップショットを編集するために使用されます。
# virsh snapshot-edit domain [snapshotname] [--current] {[--rename] [--clone]}
snapshotname--current の両方が指定される場合、編集されたスナップショットを現在のスナップショットにするように強制します。snapshotname が省略されている場合、現在のスナップショットを編集するために --current を指定する必要があります。
これは、以下のコマンドシーケンスと同等ですが、エラーチェック機能が一部含まれます。
# virsh snapshot-dumpxml dom name > snapshot.xml 
# vi snapshot.xml [note - this can be any editor] 
# virsh snapshot-create dom snapshot.xml --redefine [--current] 
--rename を指定すると、スナップショットの名前が変更されます。--clone を指定すると、スナップショット名の変更により、スナップショットのメタデータのクローンが作成されます。いずれも指定されていない場合、編集によりスナップショット名が変更されることはありません。単一の qcow2 ファイル内の内部スナップショットなど、一部のスナップショットのコンテンツは元のスナップショット名からしかアクセスできないため、スナップショット名は注意して変更する必要があります。

20.39.5. snapshot-info

snapshot-info domain コマンドは、スナップショットについての情報を表示します。
# snapshot-info domain {snapshot | --current}
指定された snapshot についての基本的な情報を出力するか、または --current で現在のスナップショットを出力します。

20.39.6. snapshot-list

所定のゲスト仮想マシンの利用可能なスナップショットすべてを一覧表示します。デフォルトでは、スナップショット名、作成時およびゲスト仮想マシンの状態の列が表示されます。これを使用するには、以下を実行します。
# virsh snapshot-list domain [{--parent | --roots | --tree}] [{[--from] snapshot | --current} [--descendants]] [--metadata] [--no-metadata] [--leaves] [--no-leaves] [--inactive] [--active] [--disk-only] [--internal] [--external]
オプションの引数は以下のものです。
  • --parent は、各スナップショットの親の名前を指定する出力テーブルに列を追加します。このオプションは、--roots または --tree と共に使用することはできません。
  • --roots は、親のないスナップショットのみを表示するために一覧をフィルターします。このオプションは、--parent または --tree と共に使用することはできません。
  • --tree は、出力をツリー形式で表示し、スナップショット名のみを一覧表示します。このオプションは、--roots または --parent と共に使用することはできません。
  • --from は、所定スナップショットの子であるスナップショットの一覧をフィルターします。または、--current が指定される場合、一覧から現在のスナップショットで開始させるようにします。一覧が分離してか、または --parent と共に使用される場合、--descendants も表示されない限り、直接の子に限定されます。--tree と共に使用される場合、--descendants の使用が暗黙的に示されます。このオプションには、--roots との互換性がありません。--from オプションも存在しない限り、--current の開始点または --tree はこの一覧に含まれません。
  • --leaves が指定されると、一覧は子のないスナップショットのみにフィルターされます。同様に、--no-leaves が指定されると、一覧は子を持つスナップショットのみにフィルターされます。(いずれのオプションも省略すると、フィルターは実行されず、両方を指定すると、サーバーがフラグを認識するかどうかによって、同じ一覧が生成されるか、またはエラーが出されます)。フィルターオプションには --tree との互換性がありません。
  • --metadata が指定されると、一覧が libvirt メタデータに関連するスナップショットのみにフィルターされるため、永続的なゲスト仮想マシンの定義解除が回避されるか、または一覧が 一時的 なゲスト仮想マシンの破棄によって失われます。同様に、--no-metadata が指定される場合、一覧は libvirt メタデータのなしに存在するスナップショットのみにフィルターされます。
  • --inactive が指定されると、一覧はゲスト仮想マシンの停止時に取られたスナップショットにフィルターされます。--active が指定される場合、一覧はゲスト仮想マシンの実行時に取られたスナップショットにフィルターされ、このスナップショットには、実行中の状態に戻るためのメモリー状態が含まれます。--disk-only が指定される場合、一覧はゲスト仮想マシンの実行中に取られたスナップショットにフィルターされますが、このスナップショットにはディスク状態のみが含まれます。
  • --internal が指定されると、一覧は既存のディスクイメージの内部ストレージを使用するスナップショットにフィルターされます。--external が指定される場合、一覧はディスクイメージの外部ファイルまたはメモリー状態を使用するスナップショットにフィルターされます。

20.39.7. snapshot-dumpxml

virsh snapshot-dumpxml domain snapshot コマンドは、snapshot という名前のゲスト仮想マシンのスナップショットのスナップショット XML を出力します。これを使用するには、以下を実行します。
# virsh snapshot-dumpxml domain snapshot [--security-info]
また、--security-info オプションには、セキュリティー上の機密情報も含まれます。現在のスナップショットの XML に簡単にアクセスするには、virsh snapshot-current を使用します。

20.39.8. snapshot-parent

所定スナップショット、または --current を使って現在のスナップショットの親スナップショット (ある場合) の名前を出力します。これを使用するには、以下を実行します。
# virsh snapshot-parent domain {snapshot | --current}

20.39.9. snapshot-revert

所定ドメインを snapshot で指定されるスナップショットか、または --current により現在のスナップショットに戻します。

警告

これは破壊的なアクションであることに注意してください。最後にスナップショットが取られてから加えられたドメインへの変更は失われます。さらに、snapshot-revert の完了後のドメインの状態が元のスナップショットが取られた時点のドメインの状態になることにも注意してください。
スナップショットを元に戻すには、以下を実行します。
# virsh snapshot-revert domain {snapshot | --current} [{--running | --paused}] [--force]
通常、スナップショットに戻すと、ドメインはスナップショットが取られた時点の状態に置かれます。ただし、例外として、ゲスト仮想マシンの状態が設定されていないディスクのスナップショットは、ドメインをアクティブでない状態にします。--running または --paused オプションのいずれかを渡すことにより、追加の状態変更が実行されます (アクティブでないドメインの起動、または実行中のドメインの一時停止など)。一時的なドメインはアクティブではないため、一時的なドメインのディスクスナップショットに戻る場合に、これらのフラグのいずれかを使用する必要があります。
snapshot revert--force の使用が必要になる追加のリスクの伴う場合として 2 つのケースがあります。1 つは、設定を戻すために必要な詳細なドメイン情報がスナップショットにない場合です。この場合、libvirt は現在の設定がスナップショットの作成時に使用された設定に一致することを証明できないため、--force を指定することにより、libvirt に対し、スナップショットには現在の設定との互換性がある (互換性がない場合はドメインの実行が失敗する可能性がある) ことを保証します。もう 1 つのケースは、実行中のドメインをアクティブな状態に戻す場合で、この場合、既存の VNC または Spice 接続を中断するなどの障害が暗示されるため、既存のハイパーバイザーを再利用するのではなく、新規のハイパーバイザーを作成する必要があります。この状態は、互換性がない可能性のある設定を使用するアクティブなスナップショットや、--start または --pause フラグで組み合わされたアクティブでないスナップショットについて発生します。

20.39.10. snapshot-delete

virsh snapshot-delete domain コマンドは、指定されたドメインのスナップショットを削除します。これを実行するには、以下を実行します。
# virsh snapshot-delete domain {snapshot | --current} [--metadata] [{--children | --children-only}]
このコマンドは、snapshot という名前のドメインのスナップショットを削除するか、または --current で現在のスナップショットを削除します。このスナップショットに子のスナップショットがある場合、このスナップショットの変更は子にマージされます。オプションの --children が使用される場合、このスナップショットとこのスナップショットのすべての子が削除されます。--children-only が使用される場合、このスナップショットの子が削除され、このスナップショットは元の状態のままにされます。これらの 2 つのフラグは相互排他的です。
--metadata が使用されると、libvirt で維持されるスナップショットのメタデータが削除され、一方でスナップショットのコンテンツは外部ツールがアクセスできるように元の状態にされます。そうしないと、スナップショットの削除により、その時点からのデータのコンテンツも削除されてしまいます。