KVM VM イメージのサイズを「実際に」縮小するにはどうすればよいでしょうか?

KVM VM イメージのサイズを「実際に」縮小するにはどうすればよいでしょうか?

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: ドライブ (縮小)、および削除する残りの未使用領域 (新しいディスクにコピーしない) の合計になります。

  1. Windowsゲストにログインする
  2. スタート メニューの検索機能を使用して、「コンピューターの管理」ユーティリティを開きます。
  3. 左側で、「ストレージ->ディスク管理」をクリックします。ストレージディスク管理のスクリーンショット
  4. 新しい画面で、C: パーティションを右クリックし、「ボリュームの縮小...」をクリックします。ダイアログが表示されるまで少し時間がかかります。しばらくお待ちください。
  5. 「C: を縮小」ダイアログ ウィンドウが表示されたら、「縮小後の合計サイズ (MB)」の値が目的の 35 GB に近づくように、「縮小する領域の量」に領域の量を入力します。次に、「縮小」をクリックします。

    注記: 新しいスペースが小さすぎる場合はエラー メッセージが表示されることがあります。この場合、エラーが消えて縮小が行われるまで、「縮小するスペースの量」を 1 GB ずつ減らしてください。実際には、10 GB の空きスペースを確保しておくことをお勧めします。

    C: パーティションを 34 GB に縮小できたと仮定します。

  6. 完了したら、コマンド プロンプトを開いて次のように入力して VM をシャットダウンします。shutdown /s /t 0

  7. Windows ゲストの準備ができました。

ステップ2: VMホスト上のディスクの縮小

この手順は実際には縮小ではありませんが、代わりに元のディスクから 2 つのパーティションをコピーし、未使用の領域を引き継がない新しいディスク (最終サイズ) を作成します。

目標は、合計サイズがブート パーティション + C: パーティションになるディスクを作成することです。また、わずかに余ったスペースが残りますが (計算が完璧でない限り)、最後の手順で対処するので心配する必要はありません。

  1. Linuxホストにログイン
  2. スーパーユーザーに切り替える:sudo su
  3. 仮想イメージが保存されている場所に移動します。cd /var/lib/libvirt/images
  4. ファイルを一覧表示します:ls -l
  5. ゲストイメージを探します(これについては他の場所にたくさんのチュートリアルがあります)。Windowsゲストイメージの名前が「windows.qcow2」であると仮定しましょう。
  6. バックアップを作成します:

    mkdir backup
    cp windows.qcow2 backup/windows.qcow2.bak
    

    (大きなディスクの場合は時間がかかるので、コーヒーを飲みに行きましょう)

  7. 不足している可能性のある guestfs パッケージをインストールします。

    apt-get install libguestfs-tools
    
  8. さて、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/sda1350 MB の Windows ブート パーティション、/dev/sda2現在 34 GB の C: パーティションがあり、ディスク イメージの合計は/dev/sda/100 G で、切り詰める余地がたくさんあることに注目してください。

    重要なステップは、計算することです。34 G + 350M は 35 G に収まるため、35 GB のイメージを作成します。計算が完璧でない限り、必然的にいくらかの余剰スペースが残りますが、心配しないでください。以下で対処します。

  9. 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`
    
  10. 古いディスクを新しく割り当てたディスクにコピーして、ディスクのサイズを変更しましょう。これは本当に素晴らしい部分です。他のほとんどのガイドでは、非常に複雑な内容が紹介されています。これは、次のコマンドで簡単に実行できます。その後、コーヒーをもっと飲みに行く必要があります。おそらく、かなり時間がかかるでしょう。

    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 で実行したようにパーティションを拡張することができます。

  11. 完了したら、結果の画像を検査します。

    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 ゲストからのこの余分なパーティションについては、後で説明します。今は無視してください。

  12. ディスクイメージを交換します:

    mv windows.qcow2 backup/
    mv newdisk.qcow2 windows.qcow2
    
  13. VM を起動します。

ステップ3: Windowsゲストでのディスク操作の完了

この手順では、Windows が正常に起動することを確認し、C パーティションを余分なスペースに拡張します。

  1. Windowsゲストにログイン

  2. スタート メニューの検索機能を使用して、「コンピューターの管理」ユーティリティを開きます。

  3. 左側で、「ストレージ->ディスク管理」をクリックします。

  4. 3 つのパーティション (ブート、C:、および 439 MB の小さなパーティション (右端)) が表示されます。3つのパーティションを示すコンピュータ管理のスクリーンショット

  5. 右クリック -> ボリュームの削除で Linux パーティションを削除します。(プロンプトが表示されたら [はい] をクリックします)

  6. C: パーティションを右クリックして「拡張」をクリックし、ダイアログで「次へ」と「OK」をクリックします。最後のパーティションの量だけ拡張するように提案されるはずです。完了すると、C: のサイズが変更され、パーティションが 2 つだけ残ります。

  7. これで完了です。Windows ゲストは現在 35 GB 程度しか使用していません。オーバーヘッドなどにより、実際のディスク イメージはこれより大きくなる可能性があることに注意してください (38 GB に近い場合もあります)。

すべてが正常に動作していることを確認し、イメージのバックアップを削除するか、オフラインでストレージに移動します。

答え2

ついに VM スペースを大幅に縮小することができました。当初、W7 VM はホスト ストレージで 107 GB を消費していました。仮想 HDD のサイズは 100 GB で、現在 VM は仮想ストレージの 18 GB しか消費していません。

私がやったことは次のとおりです:

  1. 仮想ドライブをクリーンアップする(一時ファイルなどを削除する)
  2. オープンソースの UltraDefrag ソフトウェアで「完全最適化」されたデフラグを実行します
  3. 走るsdelete -c c:
  4. 走るsdelete -z c:
  5. 走る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-sparsifyXenialとBionicでは、パッケージのユーティリティlibguestfsツール動作するはずです。次の点に注意してください。

  • sdelete事前にゲスト内でツールを実行する必要はありません(ただし、実行しても問題ありません)
  • フラグを使用すると、ファイルをコピーせずにスペースを解放できます--in-place(ディスク イメージが既にドライブの残りの空きスペースよりも大きい場合に便利です)。
  • このツールはqcow2とraw形式の画像をサポートしています

関連情報