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] コマンドを使用して、バッキングチェーンを短縮する方法について説明します。コマンドには、ヘルプメニューまたは 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
引数に依存するファイルはベースを参照するようになったため、除きます)。これを回避するには、複数のゲストが共有するファイルに変更をコミットしないでください。--verbose
オプションでは、進行状況をスクリーンに表示できます。
20.13.2. イメージの平坦化によるバッキングチェーンの短縮
virsh blockpull は、以下のアプリケーションで使用できます。
- バッキングイメージチェーンからのデータをイメージに入力して、イメージをフラット化します。これにより、イメージファイルは自己完結型になり、背面イメージに依存しなくなり、以下のようになります。
- 前: base.img ← active
- 後: base.img がゲストで使用されなくなり、Active にすべてのデータが含まれるようになりました。
- バッキングイメージチェーンの一部を平坦化します。これを使用すると、スナップショットをトップレベルイメージに平坦化し、以下のようになります。
- 前: base ← sn1 ←sn2 ← active
- 後: base.img ← active.アクティブ には、sn1 および sn2 のすべてのデータが含まれるようになりました。また、ゲストでは sn1 も sn2 も使用されないことに注意してください。
- ディスクイメージを、ホストの新しいファイルシステムに移動します。これにより、ゲストの実行中にイメージファイルを移動できます。以下のようになります。
- 前 (元のイメージファイル) -
/fs1/base.vm.img
- 後:
/fs2/active.vm.qcow2
が新しいファイルシステムになり、/fs1/base.vm.img
が使用されなくなります。
- コピー後のストレージ移行を使用したライブマイグレーションに役立ちます。ディスクイメージは、ライブマイグレーションの完了後に、移行元ホストから移行先ホストにコピーされます。要するに、前:
/source-host/base.vm.img
後:/destination-host/active.vm.qcow2
となります。/source-host/base.vm.img
は使用されなくなりました。
手順20.2 データを平坦化してバッキングチェーンを短縮する方法
- virsh blockpull を実行する前にスナップショットを作成すると便利な場合があります。これを行うには、virsh snapshot-create-as コマンドを使用します。以下の例では、guest1 をゲスト仮想マシンの名前に置き換え、snap1 をスナップショットの名前に置き換えます。
# virsh snapshot-create-as guest1 snap1
--disk-only
- チェーンが base ← snap1 ← snap2 ← active のようになる場合は、以下のコマンドを入力し、guest1 をゲスト仮想マシンの名前に置き換え、path1 をディスクへのソースパス (
/home/username/VirtualMachines/*
) に置き換えます。# virsh blockpull guest1 path1
このコマンドは、snap2 からデータをアクティブにプルすることで、snap1 のバッキングファイルをアクティブな状態にします。その結果、base ← snap1 ← active になります。 - virsh blockpullが完了すると、チェーンに追加イメージを作成したスナップショットのlibvirt追跡は役に立ちなくなります。古いスナップショットのトラッキングを削除する場合は、次のコマンドを実行します。guest1 をゲスト仮想マシンの名前に置き換え、snap1 をスナップショットの名前に置き換えます。
# virsh snapshot-delete guest1 snap1 --metadata
virsh blockpull の追加アプリケーションは、以下のように実行できます。
例20.31 1 つのイメージを平坦化し、バッキングイメージチェーンのデータを取り込む方法
次の例では、ゲスト guest1 でvda 仮想ディスクを平坦化し、イメージをバッキングイメージチェーンのデータで取り込み、取り込み操作が完了するまで待機します。
# virsh blockpull guest1 vda --wait
例20.32 バッキングイメージチェーンの一部を平坦化する方法
次の例では、/path/to/base.img ディスクイメージに基づいて、ゲストguest1 のvda 仮想ディスクを平坦化します。
# 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"/>) にも対応します。ゲスト仮想マシンに接続されているディスクデバイスの 1 つに適用できます (コマンド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