
KVM 仮想ディスク イメージを縮小する方法 (特に Windows ゲスト用) について、Web で何時間も検索しましたが、見つかりません。
私が見つけたのは、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 の仮想ドライブが作成されます。期待していたものとは程遠い結果です。
編集-2016-02-16: ここで説明されている VM を縮小する方法は非常に効率的ですが、すべての VM スナップショットが削除されるという大きな欠点があるため、この質問を「更新」します。スナップショットを保持しながら VM を縮小する方法を知っている方がいらっしゃいましたら、ぜひ教えてください。
答え1
Windows ゲスト OS を縮小するには、ゲスト内のパーティションを縮小し、VM をシャットダウンし、必要なサイズの新しい小さいディスクを作成し、古いディスクから新しい小さいディスクにデータをコピーし、ディスク名を交換して、VM を再起動する必要があります。
簡単ですが、不適切に実行すると、データや髪の毛が失われる可能性があります。
ここでは、QCOW2 形式を使用して 100 GB の Windows Server 2012 ゲストを 35 GB に縮小する KVM の手順を示します。
重要: この方法は仮想マシンの変更なし定義。代わりに、ディスクイメージの操作。
ゲストの前提:
- ゲストはWindows Server 2012です
- QCOW2 形式の 100 GB のディスク イメージ
- 2 つのパーティション:
- 350 MBのブート
- 99.6 GB の C: ドライブ、使用済み領域 20 GB
- C:を99.6 GBから34 GBに縮小したい
ホストの想定事項:
- Ubuntu 16 LTS サーバー
- KVM (libvirt)
- 250 GBドライブ
- 仮想イメージは /var/lib/libvirt/images にあります
ステップ 1: Windows ゲストの準備、メインの C: パーティションの縮小
この手順では、Windows から直接 Windows パーティションを縮小します。この手順の最後に作成されるディスク イメージは、ブート パーティション、C: ドライブ (縮小)、および削除する残りの未使用領域 (新しいディスクにコピーしない) の合計になります。
- Windowsゲストにログインする
- スタート メニューの検索機能を使用して、「コンピューターの管理」ユーティリティを開きます。
- 左側で、「ストレージ->ディスク管理」をクリックします。ストレージディスク管理のスクリーンショット
- 新しい画面で、C: パーティションを右クリックし、「ボリュームの縮小...」をクリックします。ダイアログが表示されるまで少し時間がかかります。しばらくお待ちください。
「C: を縮小」ダイアログ ウィンドウが表示されたら、「縮小後の合計サイズ (MB)」の値が目的の 35 GB に近づくように、「縮小する領域の量」に領域の量を入力します。次に、「縮小」をクリックします。
注記: 新しいスペースが小さすぎる場合はエラー メッセージが表示されることがあります。この場合、エラーが消えて縮小が行われるまで、「縮小するスペースの量」を 1 GB ずつ減らしてください。実際には、10 GB の空きスペースを確保しておくことをお勧めします。
C: パーティションを 34 GB に縮小できたと仮定します。
完了したら、コマンド プロンプトを開いて次のように入力して VM をシャットダウンします。
shutdown /s /t 0
- Windows ゲストの準備ができました。
ステップ2: VMホスト上のディスクの縮小
この手順は実際には縮小ではありませんが、代わりに元のディスクから 2 つのパーティションをコピーし、未使用の領域を引き継がない新しいディスク (最終サイズ) を作成します。
目標は、合計サイズがブート パーティション + C: パーティションになるディスクを作成することです。また、わずかに余ったスペースが残りますが (計算が完璧でない限り)、最後の手順で対処するので心配する必要はありません。
- Linuxホストにログイン
- スーパーユーザーに切り替える:
sudo su
- 仮想イメージが保存されている場所に移動します。
cd /var/lib/libvirt/images
- ファイルを一覧表示します:
ls -l
- ゲストイメージを探します(これについては他の場所にたくさんのチュートリアルがあります)。Windowsゲストイメージの名前が「windows.qcow2」であると仮定しましょう。
バックアップを作成します:
mkdir backup cp windows.qcow2 backup/windows.qcow2.bak
(大きなディスクの場合は時間がかかるので、コーヒーを飲みに行きましょう)
不足している可能性のある guestfs パッケージをインストールします。
apt-get install libguestfs-tools
さて、Windows イメージを調べて、Windows ディスクを再確認してみましょう
virt-filesystems
。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 -
/dev/sda1
350 MB の Windows ブート パーティション、/dev/sda2
現在 34 GB の C: パーティションがあり、ディスク イメージの合計は/dev/sda/
100 G で、切り詰める余地がたくさんあることに注目してください。重要なステップは、計算することです。34 G + 350M は 35 G に収まるため、35 GB のイメージを作成します。計算が完璧でない限り、必然的にいくらかの余剰スペースが残りますが、心配しないでください。以下で対処します。
newdisk.qcow2
合計サイズが 35 GB の新しい仮想 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 に関するコメントを思い出してください... そのため、それをキャンセルしてディスクを再作成するか、ここで行っているように先に進み、
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ゲストでのディスク操作の完了
この手順では、Windows が正常に起動することを確認し、C パーティションを余分なスペースに拡張します。
Windowsゲストにログイン
スタート メニューの検索機能を使用して、「コンピューターの管理」ユーティリティを開きます。
左側で、「ストレージ->ディスク管理」をクリックします。
3 つのパーティション (ブート、C:、および 439 MB の小さなパーティション (右端)) が表示されます。3つのパーティションを示すコンピュータ管理のスクリーンショット
右クリック -> ボリュームの削除で Linux パーティションを削除します。(プロンプトが表示されたら [はい] をクリックします)
C: パーティションを右クリックして「拡張」をクリックし、ダイアログで「次へ」と「OK」をクリックします。最後のパーティションの量だけ拡張するように提案されるはずです。完了すると、C: のサイズが変更され、パーティションが 2 つだけ残ります。
これで完了です。Windows ゲストは現在 35 GB 程度しか使用していません。オーバーヘッドなどにより、実際のディスク イメージはこれより大きくなる可能性があることに注意してください (38 GB に近い場合もあります)。
すべてが正常に動作していることを確認し、イメージのバックアップを削除するか、オフラインでストレージに移動します。
答え2
ついに VM スペースを大幅に縮小することができました。当初、W7 VM はホスト ストレージで 107 GB を消費していました。仮想 HDD のサイズは 100 GB で、現在 VM は仮想ストレージの 18 GB しか消費していません。
私がやったことは次のとおりです:
- 仮想ドライブをクリーンアップする(一時ファイルなどを削除する)
- オープンソースの UltraDefrag ソフトウェアで「完全最適化」されたデフラグを実行します
- 走る
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 に縮小されました。
答え3
を実行するとqemu-img -c
、イメージが圧縮されます。これにより、スペースをいくらか削減できますが、パフォーマンスが大幅に低下する可能性があります。ディスク上のゼロの重複を排除したい場合は、qemu-img convert
基本的に、イメージをある形式から別の形式に変換する場合と同じように、 を実行する必要があります (src 形式と dst 形式が同じであっても)。
このプロセスでは、ゼロを除いた新しい変換されたイメージが書き込まれ、ドライブ上のゼロ領域が効果的に重複排除されます。
もう 1 つのオプションは、単に「もちろん」を使用することですvirt-sparsify
。
答え4
virt-sparsify
XenialとBionicでは、パッケージのユーティリティlibguestfsツール動作するはずです。次の点に注意してください。
sdelete
事前にゲスト内でツールを実行する必要はありません(ただし、実行しても問題ありません)- フラグを使用すると、ファイルをコピーせずにスペースを解放できます
--in-place
(ディスク イメージが既にドライブの残りの空きスペースよりも大きい場合に便利です)。 - このツールはqcow2とraw形式の画像をサポートしています