仮想マシンの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に縮小するにはどうすればよいですか?
事前に感謝、バーニ
ファイルを削除しても実際にはデータは削除されないため、画像は自動的には縮小されません(これが、削除の取り消しが機能する理由です)。 Qemuにはqcow2イメージを縮小する機能がありますが、ユーティリティが行うのは、ディスクからゼロを重複排除して、他のすべての情報をそのまま残します。したがって、アイデアは次のようになります。
dd if=/dev/zero of=/some/file
)qemu-img convert -O qcow2 original_image.qcow2 deduplicated_image.qcow2
を実行します。これはafaikで、qcow2イメージでのみ機能します。他のフォーマットはテストしていません。
virt-sparsifyは、面倒な作業をせずにこれらすべてを実行できます。 http://libguestfs.org/virt-sparsify.1.html
virt-sparsify --compress fileA fileB
は画像のサイズを縮小しますが、qcow2画像を別のファイルとして作成するため、名前を変更して移動する必要があります。 --compress
と--in-place
を同時に使用することはできません。詳細については、次のリンクを参照してください。 http://libguestfs.org/virt-sparsify.1.html
受け入れられた回答(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
を使用する必要があります。