Red Hat Training

A Red Hat training course is available for Red Hat Enterprise Linux

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

以下のセクションでは、ゲスト仮想マシンのスナップショットを操作するために実行できるアクションを説明します。Snapshots は、指定した時点でゲスト仮想マシンのディスク、メモリー、およびデバイス状態を取得して、将来使用できるように保存します。スナップショットには、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 は、スナップショットを現在のものとして扱いません。また、メタデータに関するlibvirtを教えるために --redefine を使用しない限り、スナップショットに戻ることはできません)。
  • --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 を使用すると、チェックポイントが内外のどちらにあるかを制御できます。このフラグは必須で、その後に[file=]name[,snapshot=type] 形式のmemspecが続きます。type は、none、internal、または external のいずれかになります。file=name にリテラルのコンマを含める場合は、2 番目のコンマでエスケープします。
  • --diskspec オプションを使用して、--disk-only および外部チェックポイントによる外部ファイルの作成方法を制御できます。このオプションは、ドメイン XML 内の<disk>要素の数に従って、複数回指定できます。それぞれの<diskspec>は、ディスク [,snapshot=type][,driver=type][,file=name] の形式になります。特定のディスクについて --diskspec を省略すると、仮想マシン設定のデフォルトの動作が使用されます。ディスクまたはfile=nameにリテラルのコンマを含める場合は、2 番目のコンマでエスケープします。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 は、外部スナップショットを使用することを推奨します。外部スナップショットは、他の仮想化ツールで処理する場合、より柔軟で信頼性が高いためです。外部スナップショットを作成する場合は、--diskspec vda,snapshot=externalvirsh-create-as を実行します。
    この項目を使用しないと、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 は、Red Hat ではサポートされていないことに注意してください。

20.39.3. 現在使用しているスナップショットの表示

virsh snapshot-current コマンドを使用して、現在使用中のスナップショットを照会します。
# virsh snapshot-current domain {[--name] | [--security-info] | [snapshotname]}
snapshotname を使用しない場合は、ゲスト仮想マシンの現在のスナップショット (存在する場合) の snapshot 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 を指定してスナップショット名を変更すると、スナップショットメタデータのクローンが作成されます。いずれも指定されていない場合、編集によりスナップショット名は変更されません。スナップショット名の変更には十分な注意が必要です。1 つの 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 コマンドは、スナップショットという名前のゲスト仮想マシンのスナップショット XML を出力します。使用するには、以下を実行します
# virsh snapshot-dumpxml domain snapshot [--security-info]
--security-info オプションには、セキュリティーの機密情報も含まれます。virsh snapshot-current を使用すると、現行スナップショットの XML に簡単にアクセスできます。

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に追加の危険が伴う場合が 2 つあり、その場合は--force を使用して続行する必要があります。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 が管理するスナップショットのメタデータが削除されます。外部ツールによるアクセス用に、スナップショットのコンテンツはそのまま残されます。それ以外の場合は、スナップショットを削除すると、その時点のデータコンテンツも削除されます。