20.13. スナップショットの使用

20.13.1. データのコピーによるバッキングチェーンの短縮化

このセクションでは、virsh blockcommit domain <path> [<bandwidth>] [<base>] [--shallow] [<top>] [--active] [--delete] [--wait] [--verbose] [--timeout <number>] [--pivot] [--keep-overlay] [--async] [--keep-relative] コマンドを使用してバッキングチェーンを短縮する方法について説明します。このコマンドには数多くのオプションがあり、これらは help メニューまたは man ページに一覧表示されています。
virsh blockcommit コマンドは、チェーンの一部にあるデータをバッキングファイルにコピーし、コミットされた部分をバイパスするためにチェーンの残りの部分をピボットします。たとえば、以下が現在の状態であるとします。
      base ← snap1 ← snap2 ← active.
virsh blockcommit を使用して、snap2 のコンテンツを snap1 に移行します。これにより、チェーンから snap2 を削除でき、より迅速にバックアップを作成することができます。

手順20.1 バッキングチェーンの短縮化方法

  • 以下のコマンドで guest1 をゲスト仮想マシンの名前で、disk1 をディスク名で置き換えて実行します。
    virsh blockcommit guest1 disk1 --base snap1 --top snap2 --wait --verbose
    snap2 のコンテンツが snap1 に移行します。以下のようになります。
    base ← snap1 ← active。snap2 は無効になり、削除することができません。

    警告

    virsh blockcommit は、--base 引数に依存するすべてのファイルを破損させます (--top 引数に依存していたファイルを除く。これらは base を指すようになる)。これを防ぐには、複数のゲストが共有するファイルへの変更をコミットしないでください。--verbose オプションを使用すると、進捗が画面に出力されます。

20.13.2. イメージのフラット化によるバッキングチェーンの短縮化

virsh blockpull は、以下のように応用して使用することができます。
  1. イメージにそのバッキングイメージチェインのデータを設定することにより、イメージをフラット化します。これにより、イメージファイルはバッキングイメージやこれに類するものに依存しなくてすむような自己完結型のファイルになります。
    • 使用前: base.img ← active
    • 使用後: ゲストによる base.img の使用がなくなり、Active にすべてのデータが含まれます。
  2. バッキングイメージチェインの一部をフラット化します。これはスナップショットをトップレベルのイメージにフラット化するために使用でき、以下のようになります。
    • 使用前: base ← sn1 ←sn2 ← active
    • 使用後: base.img ← active。active には sn1 および sn2 からの全データが含まれ、ゲストは sn1 も sn2 も使用しません。
  3. ディスクのイメージをホスト上の新規ファイルシステムに移動します。これにより、ゲストの実行中にイメージファイルを移動できます。以下のようになります。
    • 使用前 (元のイメージファイル): /fs1/base.vm.img
    • 使用後: /fs2/active.vm.qcow2 が新規ファイルシステムで、/fs1/base.vm.img は使用されません。
  4. ポストコピー型ストレージ移行のライブマイグレーションで役立ちます。ディスクイメージは、ライブマイグレーションの完了後に移行元ホストから移行先ホストにコピーされます。
    つまり、以下のようになります。使用前の /source-host/base.vm.img から使用後の/destination-host/active.vm.qcow2 になります。/source-host/base.vm.img は使用されなくなります。

手順20.2 データのフラット化によるバッキングチェーンの短縮化

  1. virsh blockpull の実行前にスナップショットを実行すると便利です。スナップショットを作成するには、virsh snapshot-create-as コマンドを使用します。以下の例で guest1 をゲスト仮想マシンの名前に、snap1 をスナップショットの名前に置き換えます。
    virsh snapshot-create-as guest1 snap1 --disk-only
  2. チェーンが base ← snap1 ← snap2 ← active のようになる場合、以下のコマンドを入力し、guest1 をゲスト仮想マシンの名前に、path1 をディスクのソースパス (/home/username/VirtualMachines/* など) に置き換えます。
    virsh blockpull guest1 path1
    このコマンドは、データを snap1 から active にプルすることで snap2 となり、base ← snap1 ← active を active のバッキングファイルにします。
  3. virsh blockpull が完了すると、チェーン内の追加イメージを作成したスナップショットの libvirt 追跡は意味をなさなくなります。以下のコマンドを使って、古くなったスナップショットの追跡を削除します。この際、guest1 をゲスト仮想マシンの名前に、snap1 をスナップショットの名前に置き換えます。
    virsh snapshot-delete guest1 snap1 --metadata
virsh blockpull は他にも、以下の使い方ができます。

例20.31 単一イメージをフラット化し、バッキングイメージチェーンのデータを設定する方法

以下の例では、vda ゲスト上の guest1 仮想ディスクをフラット化し、バッキングイメージチェーンからデータのあるイメージを設定し、設定アクションの完了を待機します。
virsh blockpull guest1 vda --wait

例20.32 バッキングイメージチェーンの一部をフラット化する方法

以下の例では、vda ディスクイメージを基に、guest1 ゲスト上の /path/to/base.img 仮想ディスクをフラット化します。
virsh blockpull guest1 vda /path/to/base.img --base --wait

例20.33 ディスクイメージをホストの新規ファイルシステムに移動する方法

ディスクイメージをホストの新規ファイルシステムに移動するには、以下の 2 つのコマンドを実行します。各コマンドでは、guest1 をゲスト仮想マシンの名前に、disk1 を仮想ディスクの名前に置き換えます。また、XML ファイル名、ロケーションへのパスおよびスナップショットの名前も変更します。
virsh snapshot-create guest1 --xmlfile /path/to/snap1.xml --disk-only
virsh blockpull guest1 disk1 --wait

例20.34 ポストコピー型ストレージ移行のライブマイグレーションを使用する方法:

ポストコピー型ストレージ移行のライブマイグレーションを使用するには、以下のコマンドを入力します。
移行先で以下のコマンドを入力し、バッキングファイルをホスト上のバッキングファイルの名前およびロケーションで置き換えます。
qemu-img create -f qcow2 -o backing_file=/source-host/vm.img /destination-host/vm.qcow2
ソースで以下のコマンドを入力し、guest1 をゲスト仮想マシンの名前で置き換えます。
virsh migrate guest1
移行先で以下のコマンドを入力し、guest1 をゲスト仮想マシンの名前で、disk1 を仮想ディスク名で置き換えて実行します。
virsh blockpull guest1 disk1 --wait

20.13.3. ゲスト仮想マシンのブロックデバイスのサイズ変更

virsh blockresize コマンドを使用して、ゲスト仮想マシンの実行中にゲスト仮想マシンのブロックデバイスのサイズを変更することができます。この際、固有のターゲット名 (<target dev="name"/>) またはソースファイル (<source file="name"/>) にも対応するブロックデバイスの絶対パスを使用します。これは、ゲスト仮想マシンに割り当てられているディスクデバイスのいずれかに適用できます (コマンド virsh domblklist を使用して、所定のゲスト仮想マシンに関連付けられたすべてのブロックデバイスの簡単な情報を表示する表を出力できます)。

注記

ライブのイメージサイズの変更により、イメージのサイズは常に変更されますが、この変更はゲストによって即時に反映されない場合があります。最新のゲストカーネルでは、virtio-blk デバイスのサイズは自動的に更新されます (旧式のカーネルではゲストの再起動が必要です)。SCSI デバイスでは、コマンド echo > /sys/class/scsi_device/0:0:0:0/device/rescan を使って、ゲスト内の再スキャンを手動でトリガーすることが求められます。さらに IDE の場合、ゲストが新たなサイズを認識する前にゲストを再起動しておく必要があります。

例20.35 ゲスト仮想マシンのブロックデバイスのサイズを変更する方法

以下の例では、仮想マシン guest1 のブロックデバイスが 90 バイトに変更されます。
virsh blockresize guest1 90 B