21.14. virt-sparsify: 空のディスク領域の再要求

virt-sparsify コマンドラインツールは、仮想マシンディスク (またはすべてのディスクイメージ) をスパースにするために使用できます。これはシンプロビジョニングとしても知られています。ディスクイメージの空きディスク領域はホストの空き領域に変換されます。
virt-sparsify コマンドは、ext2、ext3、ext4、btrfs、NTFS などのほとんどのファイルシステムで使用できます。さらに、LVM 物理ボリュームでも使用できます。virt-sparsify は、仮想マシンのディスクイメージ上だけでなく、すべてのディスクイメージで機能します。

警告

実行中の仮想マシン上で virt-sparsify を使用したり、他のディスク編集ツールと同時に使用したりすると、ディスクが破損する恐れがあります。このコマンドを使用する前に、仮想マシンを シャットダウンしてください。また、ディスクイメージを同時に編集することはできません。
また、このコマンドは一部のディスク形式間の変換を実行できます。たとえば、virt-sparsify は Raw ディスクイメージをシンプロビジョニングされた qcow2 イメージに変換できます。

注記

仮想マシンに複数のディスクがあり、ボリューム管理を使用する場合に virt-sparsify は機能しますが、効果性においては十分ではありません。
入力が raw である場合、デフォルトの出力は raw sparse になります。出力イメージのサイズは、スパース状態を認識するツールで確認する必要があります。
$ ls -lh test1.img
-rw-rw-r--. 1 rjones rjones 100M Aug  8 08:08 test1.img
$ du -sh test1.img
3.6M   test1.img
ls コマンドはイメージサイズが 100M であることを示すことに注意してください。ただし、du コマンドはイメージサイズが 3.6M であると正しく表示します。

重要な制限事項

以下は重要な制限事項の一覧になります。
  • を使用する前に、仮想マシンを シャットダウンしている必要がありますvirt-sparsify
  • 最も悪いシナリオでは、virt-sparsify はソースディスクイメージの仮想サイズの 2 倍のサイズを要求する可能性があります。一時的なコピー分と移行先イメージ分が必要になる可能性があります。
    --in-place オプションを使用する場合、大規模な一時的な領域は不要になります。
  • virt-sparsify を使用してディスクイメージのサイズを変更することはできません。ディスクイメージのサイズを変更するには、virt-resize を使用します。virt-resize についての詳細は、「virt-resize: オフラインのゲスト仮想マシンのサイズ変更」 を参照してください。
  • virt-sparsify は、暗号化されたディスクをスパース化できないため、暗号化されたディスクには使用できません。
  • virt-sparsify はパーティション間の領域をスパースにすることができません。この領域はブートローダーなどの重要なアイテムに使用されることが多いため、これを未使用の領域と言うことはできません。
  • copy モードでは、qcow2 内部スナップショットは移行先イメージにコピーされません。

virt-sparsify をインストールするには、以下のコマンドのいずれかを実行します。
# yum install /usr/bin/virt-sparsify
または
# yum install libguestfs-tools-c
ディスクをスパース化するには、以下を実行します。
# virt-sparsify /dev/sda1 /dev/device
/dev/sda1 の内容を /dev/device にコピーし、出力をスパースにします。/dev/device がすでに存在する場合、これは上書きされます。/dev/sda1の形式は検出され、/dev/device の形式として使用されます。
形式間の変換を実行するには、以下を実行します。
# virt-sparsify disk.raw --convert qcow2 disk.qcow2
ソースディスクイメージ内で検索できるすべてのファイルシステムの空き領域のゼロ化およびスパース化を試行する。
特定のファイルシステムで空き領域がゼロで上書きされるのを防ぐには、以下を実行します。
# virt-sparsify --ignore /dev/device /dev/sda1 /dev/device
ファイルシステムの空き領域をゼロで上書きせずに、ディスクイメージのすべてのファイルシステムのスパース化されたディスクイメージを作成する。
一時的なコピーを作成せずにディスクイメージをスパースにするには、以下を実行します。
# virt-sparsify --in-place disk.img
指定されたディスクイメージをスパースにし、イメージファイルを上書きする。

virt-sparsify オプション

以下のコマンドオプションは、virt-sparsify で使用できます。

表21.4 virt-sparsify オプション

コマンド説明
--help特定のコマンドまたは virt-sparsify ユーティリティーについての簡単な help エントリーを表示します。ヘルプの詳細は、virt-sparsify の man ページを参照してください。$ virt-sparsify --help
--check-tmpdir ignore|continue|warn|failtmpdir に操作を完了するのに十分な領域があるかどうかを推定します。指定したオプションは、操作の完了に必要な領域が十分にない場合の動作を決定します。
  • ignore: 問題は無視され、操作を継続します。
  • continue: エラーを報告し、操作を継続します。
  • warn: エラーを報告し、ユーザーが Enter を押すのを待機します。
  • fail: エラーを報告し、操作を中止します。
このオプションは ‑‑in-place オプションと併用できません。
$ virt-sparsify --check-tmpdir ignore /dev/sda1 /dev/device
$ virt-sparsify --check-tmpdir continue /dev/sda1 /dev/device
$ virt-sparsify --check-tmpdir warn /dev/sda1 /dev/device
$ virt-sparsify --check-tmpdir fail /dev/sda1 /dev/device
--compress出力ファイルを圧縮します。これは出力形式が qcow2 の場合に のみ 機能します。このオプションは ‑‑in-place オプションと併用できません。$ virt-sparsify --compress /dev/sda1 /dev/device
--convert
指定された形式を使用してスパースイメージを作成します。形式が指定されない場合、入力形式が使用されます。
raw、qcow、vdi の出力形式がサポートされ、機能することが確認されています。
QEMU エミュレーターによってサポートされるすべてのフォーマットを使用できます。
--convert オプションを使用することが推奨されます。これにより、virt-sparsify は入力形式を予測する必要がありません。
このオプションは ‑‑in-place オプションと併用できません。
$ virt-sparsify --convert raw /dev/sda1 /dev/device
$ virt-sparsify --convert qcow2 /dev/sda1 /dev/device
$ virt-sparsify --convert other_format indisk outdisk
--format入力ディスクイメージの形式を指定します。指定されていない場合、形式はイメージから検出されます。信頼されていない raw 形式のゲストディスクイメージが使用されている場合は、必ず形式を指定してください。
$ virt-sparsify --format raw /dev/sda1 /dev/device
$ virt-sparsify --format qcow2 /dev/sda1 /dev/device
--ignore
指定されたファイルシステムまたはボリュームグループを無視します。
ファイルシステムが指定されているが --in-place オプションが指定されていない場合、ファイルシステム上の空き領域はゼロ化されません。ただし、ゼロの既存ブロックはスパースになります。‑‑in-place オプションが指定されている場合、ファイルシステムは完全に無視されます。
ボリュームグループが指定されている場合、そのボリュームグループは無視されます。ボリュームグループ名は /dev/ プレフィックスのない状態で使用する必要があります。たとえば、‑‑ignore vg_foo のようになります。
--ignore オプションは、コマンドで複数回指定することができます。
$ virt-sparsify --ignore filesystem1 /dev/sda1 /dev/device
$ virt-sparsify --ignore volume_group/dev/sda1 /dev/device
--in-place
一時的なコピーを作成するのではなく、イメージをインプレースでスパースにします。インプレースのスパース化はスパースコピー操作よりも効率的ですが、スパースコピーの場合ほどディスク領域を回復することができません。インプレースのスパース化は、破棄 (またはトリムないしはマップ解除) サポートの使用により機能します。
インプレースのスパース化を使用するには、インプレースでスパース化されるディスクイメージを指定します。
インプレースのスパース化を指定する場合に、以下のオプションを使用することはできません。
  • --convert および --compress: 大規模なディスク形式の変更が必要になるため。
    --check-tmpdir: 大規模な一時的な領域が不要であるため。
$ virt-sparsify --in-place disk.img
-xlibguestfs API 呼び出しのトレースを有効にします。$ virt-sparsify -x filesystem1 /dev/sda1 /dev/device
追加のオプションを含む詳細は、libguestfs.org を参照してください。