KVM仮想ディスクイメージ、特にWindowsゲストの場合、運が悪かったため、縮小方法についてウェブを検索するのに何時間も費やしてきました。
私が見つけたのは、VM空き領域をゼロ化し、仮想ディスクを(Windowsから)デフラグして)qemu-img convert -c ...
(-c
フラグで圧縮)。
私は100 GBの仮想ドライブサイズのWindows 7 VMを持っています。最初、このVDDはホストストレージに40 GBを費やしていました。ゼロ化されると、VDDはホスト上で実際の100 GBを消費します。そしてqemu-img -c ...
は91 GBを作成しますが、私が期待したものとはまったく異なります。
Modernie Webサイトで、10 GB未満のW7 VMをダウンロードできますが、これはどのようにして可能ですか? VM画像を「本当に」圧縮する方法はありますか?
@dyasnyのおかげで、virt-sparsity
。 W7 VM=ディスクをクリーンアップし、休止状態を無効にして、VDDが20 GBしか消費しないようにしました。ディスクを再度劣化させ、再度実行しましたsdelete -z
。ランニング virt-sparsity
とともに --compress
フラグは、80 GBの仮想ドライブを提供します。私が望んでいたことからはほど遠い。
EDIT-2016-02-16:ここで説明したVM=を縮小する方法は非常に効率的ですが、大きな欠点があります。すべてのVMスナップショット。スナップショットを保持しながら、誰かがVMを縮小する方法を知っている場合は、自由に共有してください!
VMスペースを実際に縮小することができました。最初は、W7 VMがホストストレージで107 GBを消費しました。仮想HDDのサイズは100 GBです。現在、VMは18 GBの仮想ストレージしか消費しません。
これが私がしたことです:
sdelete -c c:
を実行しますsdelete -z c:
を実行しますqemu-img convert -c -f qcow2 w7-64.qcow2 -O qcow2 w7-64-compressed.qcow2
を実行しますこのようにして、qcow2ファイルは107 GBから... 7 GBに縮小されました。
WindowsゲストOSを縮小するには、ゲスト内のパーティションを縮小し、VMをシャットダウンし、目的のサイズの新しい小さいディスクを作成し、古いディスクから新しい小さいディスクにデータをコピーし、ディスク名を交換して再起動する必要がありますVM。
簡単ですが、不適切に行うと、データの損失や髪の毛が失われる可能性があります。
KVM 100 GBのWindows Server 2012ゲストで、QCOW2形式を使用して35 GBに縮小したい場合)の手順は次のとおりです。
[〜#〜]重要[〜#〜]:この方法では、仮想マシンを変更しません定義。代わりに、ディスクイメージの操作のみが必要です。
ゲストの前提条件:
ホストの前提条件:
ステップ1:Windowsゲストの準備、メインC:パーティションの縮小
このステップでは、Windowsから直接Windowsパーティションを削減します。この手順の最後に作成されるディスクイメージは、ブートパーティション、C:ドライブ(縮小)、および(新しいディスクにコピーしないことによって)削除する残りの未使用領域の合計になります。
「Shrink C:」ダイアログウィンドウが表示されたら、「Amount of space toshrink」にスペースの量を入力します。これにより、「MB単位のシュリンク後の合計サイズ」の値が目的の35 GBに近づきます。次に、「縮小」をクリックします。
[〜#〜]注[〜#〜]:新しいスペースが小さすぎる場合、エラーメッセージが表示されることがあります。エラーがなくなり、縮小が行われるまで、「縮小する容量」を1GBずつ増やします。実際には、10 GBの空き領域を確保したいと考えています。
C:パーティションを34 GBに縮小できたとしましょう。
完了したら、VMコマンドプロンプトを開き、次のように入力してシャットダウンします:shutdown /s /t 0
ステップ2:VM Host上のディスクの収縮
手順は実際には縮小ではありませんが、代わりに(最終サイズの)新しいディスクを作成し、元のディスクから2つのパーティションをコピーして、未使用のスペースの引き継ぎをスキップします。
目標は、合計サイズ=ブートパーティション+ C:パーティションのディスクを作成することです。最後のステップで処理するので、心配する必要のない小さな余剰スペースができます(計算が完璧でなかった場合)。
Sudo su
cd /var/lib/libvirt/images
ls -l
バックアップを作成します。
mkdir backup
cp windows.qcow2 backup/windows.qcow2.bak
(これは大きなディスクの場合は時間がかかるため、コーヒーを飲みます)
不足している可能性があるguestfsパッケージをインストールします。
apt-get install libguestfs-tools
さて、virt-filesystems
でWindowsイメージを調べて、Windowsディスクを再確認しましょう。
virt-filesystems --long --parts --blkdevs -h -a windows.qcow2
これはこれを出力します:
Name Type MBR Size Parent
/dev/sda1 partition 07 350M /dev/sda
/dev/sda2 partition 07 34G /dev/sda
/dev/sda device - 100G -
350 MBのWindowsブートパーティションである/dev/sda1
、C:パーティションである/dev/sda2
があり、ディスクイメージの合計/dev/sda/
が100 Gであることに注意してください。トリミングするスペースをたくさん用意してください。
だからここに重要なステップがあります:あなたの計算をしてください:34 G + 350Mは35 Gに収まるので、35 GBのイメージを作成します。計算が完全でない限り、必然的に余剰スペースができてしまいますが、心配しないで、以下で扱います。
合計サイズ35 GBのnewdisk.qcow2
と呼ぶ新しい仮想QCOW2ディスクを作成してみましょう。
qemu-img create -f qcow2 -o preallocation=metadata newdisk.qcow2 35G
出力:
Formatting 'newdisk.qcow2', fmt=qcow2 size=37580963840 encryption=off cluster_size=65536 preallocation=metadata lazy_refcounts=off refcount_bits=16`
古いディスクを新しく割り当てられたディスクにコピーして、ディスクのサイズを変更してみましょう。これは絶対に素晴らしいビットです。他のほとんどのガイドは、非常に複雑なものを示しています。これは、次のコマンドで簡単に実行できます。その後、コーヒーを飲みに行く必要があります。時間がかかる可能性があります。
virt-resize windows.qcow2 newdisk.qcow2`
これはこれを出力します:
[ 0.0] Examining windows.qcow2
100% ?¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦? --:--
**********
Summary of changes:
/dev/sda1: This partition will be left alone.
/dev/sda2: This partition will be left alone.
There is a surplus of 439.8M. An extra partition will be created for the surplus.
**********
[ 8.8] Setting up initial partition table on newdisk.qcow2
[ 9.9] Copying /dev/sda1
100% ?¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦? 00:00
[ 15.1] Copying /dev/sda2
100% ?¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦? 00:00
Resize operation completed with no errors. Before deleting the old disk, carefully check that the resized disk boots and works correctly.
ツールがスペースの余剰を見つけたことに注意してください... Mathに関するコメントを思い出してください...それをキャンセルしてディスクを再作成するか、ここで行うように先に進んで、STEPで実行されているようにsda2
パーティションを拡張します。 3。
完了したら。結果の画像を検査します。
virt-filesystems --long --parts --blkdevs -h -a newdisk.qcow2
これはこれを出力します:
Name Type MBR Size Parent
/dev/sda1 partition 07 350M /dev/sda
/dev/sda2 partition 07 34G /dev/sda
/dev/sda3 partition 83 439.8M /dev/sda
/dev/sda device - 35G -
残りのスペースに対して、/dev/sda3
のタイプがlinuxであることに注意してください。計算を正確に行わない限り、残りのスペースは問題ありません。以下のWindowsゲストからのこの追加のパーティションを扱います。今は無視してください。
ディスクイメージをスワップします。
mv windows.qcow2 backup/
mv newdisk.qcow2 windows.qcow2
VMを起動します。
ステップ3:ウィンドウゲストでのディスク操作のファイナライズ
このステップでは、Windowsが正常に起動することを確認し、Cパーティションを追加のスペースに拡張します。
Windowsゲストにログイン
スタートメニューの検索機能を使用して検索し、「コンピューターの管理」ユーティリティを開きます。
左側で、「ストレージ->ディスクの管理」をクリックします。
3つのパーティションが表示されます:ブート、C :、および439 MBの小さなパーティション(右端)。 つのパーティションを示すコンピューター管理のスクリーンショット
右クリック->ボリュームの削除でLinuxパーティションを削除します。 (すべてのプロンプトで[はい]をクリックします)
C:パーティションを右クリックし、[拡張]をクリックして、ダイアログで[次へ]と[OK]をクリックします。最後のパーティションの量だけ拡張することを提案する必要があります。完了すると、C:のサイズが変更され、2つのパーティションのみが残ります。
それでおしまい。 Windowsゲストは現在35 GB程度しか使用していません。すべてのオーバーヘッドなどにより、実際のディスクイメージは大きくなる可能性があります(38 GBに近い可能性があります)。
すべてが正常に機能していることを確認し、イメージのバックアップを削除するか、オフラインでストレージに移動します。
qemu-img -c
を実行すると、イメージを圧縮します。これにより、スペースをいくらか削減することはできますが、パフォーマンスが大幅に低下する可能性があります。ディスク上のゼロを重複排除したい場合は、基本的にqemu-img convert
を実行する必要があります。これは、イメージをあるフォーマットから別のフォーマットに変換する場合と同じです(srcとdstのフォーマットが同じ場合でも)。
このプロセスは、新しく変換されたイメージを書き込み、ゼロを排除し、ドライブ上のゼロ化されたスペースを効果的に重複排除します。
別のオプションは、もちろんvirt-sparsify
を使用することです。
Windowsで私のために働いた方法VM on KVMは以下の通りです。
Windowsゲストの場合:
sdelete -z c:
(sdelete -z
はVM用です。ディスク上の実際のQCOW2イメージのサイズは増加せず、空の領域はゼロになります。 sdelete -c
一方、必要ではなく、ディスク上のQCOW2イメージサイズが増加します)Linuxホスト:
qemu-img convert -O qcow2 -c inputVM.img outputVM.img
(これはスナップショットを保持せず、現在の状態になります)XenialおよびBionicでは、ユーティリティvirt-sparsify
パッケージから libguestfs-tools が機能するはずです。ご了承ください:
sdelete
のようなツールを事前に実行する必要はありません(ただし、問題はありません)--in-place
フラグを付けて、ファイルをコピーせずにスペースを解放します(ディスクイメージがドライブの残りの空きスペースよりも大きい場合に便利です!)空のスペースを「穴あけ」または「スパース化」するだけです。そのためには、0と穴のみを含むスペースが必要です。ファイルシステムの「空スペース」は単に割り当てられていませんが、0ではなく古いジャンクデータが含まれている可能性があります。したがって、最初のステップはそれをゼロにすることです。それを行うためのツールがありますが、これを行うための簡単な最小限の方法を次に示します...
各ファイルシステムで0のみのファイルを作成し、それを削除します。ここでは、/ tmpがユーザーによって書き込み可能であり、rootfs上にあると想定しています。 (Windowsでは、cygwinで同じコマンドを実行するか、別のツールを使用できます。)
dd if=/dev/zero of=/tmp/zeros bs=1M
rm /tmp/zeros
これで、空のスペースはちょうど0になります。しかし、また、このディスクはディスク上のフルサイズ...であり、最終的に必要なものの反対です。したがって、以前スペースが足りなかった場合、これは機能しません。
VMを停止します。
パンチ穴。これを行うにはいくつかの方法があります... ここにpythonスクリプト を使用した高速な方法があります。最初にvmを停止してから、ディスクでスクリプトを実行しますファイル:qcow2ファイルまたは別の形式の場合、同じように機能するはずですが、忘れていることや、もっと簡単な方法があるかもしれません。
また、ホールが割り当てられていないため、ファイルがすべて1か所にあるわけではないことに注意してください。ファイルシステムが断片化し、パフォーマンスが低下する可能性があります。これは、ファイルの書き込み中にスペースが非常に少ない場合を除いて、通常のLinux/UNIXファイルシステムではまったく目立たないはずですが、可能性に注意してください。断片化を避けるために、少なくとも10%の空き領域を維持することをお勧めします。
また、他のことも行うツールもあります...ゼロ以外の空のスペースのみをゼロにする(穴を開ける前に拡張されないようにする)、スワップもゼロにする、オンライン中に実行する(おそらくハイパーバイザーのサポートが必要)、これらの方法を試してみたところ、どれも非常に信頼性が低く、手動でゼロにした場合と比べて5%ほど圧縮されないことがありました。そのため、ツールをリストすることさえありません。他の人は自分のお気に入りをリストできます。
システムの復元を無効にするか、VMディスク内の既存のボリュームシャドウコピーを削除します。これだけでも多くのスペースを占有する可能性があり、ファイルシステムには表示されません。その後、sdeleteとzeroを実行します。 VMの再起動後、空き領域を確保します。