web-dev-qa-db-ja.com

kvm / qemu上のqcow2-image-fileの未使用スペースを解放する

仮想マシンのqcow2-imagesでkvm/qemuを使用しています。

qcow2には、画像ファイルが仮想マシンによって実際に必要なスペースのみを割り当てる、この素晴らしい機能があります。しかし、仮想マシンの割り当てられたスペースが小さくなると、イメージファイルをどのように縮小しますか?

例:

1.)私はqcow2形式、サイズ100GBで新しいイメージを作成します

2.)このイメージを使用してubuntuをインストールします。インストールには約10 GBが必要です。イメージファイルは最大で約10 GBになります。今のところ予期せぬことは何もありません。

3.)画像に約40 GBの追加データを入力します。画像ファイルは最大50GBまで増加します。私はそれで大丈夫です:-)

4.)これがおかしなところです:画像の40GBデータをすべて削除しますが、画像サイズはまだ50GBを消費します。

質問:その40 GBのデータを解放して、イメージを必要な10 GBに縮小するにはどうすればよいですか?

事前に感謝、バーニ

24
bmaeser

ファイルを削除しても実際にはデータは削除されないため、画像は自動的には縮小されません(これが、削除の取り消しが機能する理由です)。 Qemuにはqcow2イメージを縮小する機能がありますが、ユーティリティが行うのは、ディスクからゼロを重複排除して、他のすべての情報をそのまま残します。したがって、アイデアは次のようになります。

  1. ドライブをゼロで埋めます(スペースがなくなるまでdd if=/dev/zero of=/some/file
  2. / some/fileを削除する
  3. vMをシャットダウンする
  4. VMのイメージが保存されている場所に移動し、qemu-img convert -O qcow2 original_image.qcow2 deduplicated_image.qcow2を実行します。
  5. VM設定を変更して、新しいdeduplicated_image.qcow2を使用し、VMが機能していることをテストして、古いイメージを削除します

これはafaikで、qcow2イメージでのみ機能します。他のフォーマットはテストしていません。

27
dyasny

virt-sparsifyは、面倒な作業をせずにこれらすべてを実行できます。 http://libguestfs.org/virt-sparsify.1.html

18
Eric Blake

virt-sparsify --compress fileA fileBは画像のサイズを縮小しますが、qcow2画像を別のファイルとして作成するため、名前を変更して移動する必要があります。 --compress--in-placeを同時に使用することはできません。詳細については、次のリンクを参照してください。 http://libguestfs.org/virt-sparsify.1.html

1
cmyster

受け入れられた回答(qcow2ファイルを縮小するためのより一般的で一般的な方法を説明します)に加えて、libvirt/qemu/qcow2スタックの最新バージョン(RHEL7 +)は、virtio-scsiオプションをサポートするdiscard='unmap'ドライバーをサポートします。

仮想マシンがvirtio-scsiを使用し、libvirt定義にdiscard='unmap'が含まれている場合、ゲストファイルシステム上の単純なfstrimは、割り当てられているが未使用のホスト上の空き領域を解放します。これはホスト側のdu -hs <guestdisk>で確認できます(注:ls -al <guestdisk>notは実際に割り当てられたサイズを示し、論理的なサイズのみを示します)。

さらに新しいlibvirt/qemuインスタンス(例:RHEL8 +)の場合、ゲストOSがトリムをサポートしていない場合でも、ゲストファイルのサイズを小さくできます:bothdiscard='unmap'およびdiscard_zeroes='unmap'を有効にする(およびvirtio-scsiドライバーを使用する)ことにより、ゲスト側でゼロのシーケンシャルストリームを書き込む(つまり、dd if=/dev/zero of=/zero.img bs=1M count=1024を介して)と、影響を受けるLBA範囲のホストサイズのトリミングがトリガーされます。ただし、これはホストのCPUを集中的に使用する可能性があることに注意してください(ホストはゼロの繰り返しを検索するためにゲストの書き込みを「解析」する必要がありました)、特定の場合にのみ有効にする必要があります。

どちらの方法でも物理割り当てサイズが小さくなります(du -hsが示す内容)。論理サイズを縮小するには(単純なls -alが提供するもの)、(他の回答で説明されているように)virt-spasifyまたはqemu-imgを使用する必要があります。

1
shodanshok