web-dev-qa-db-ja.com

KVM VMsイメージのサイズを「実際に」減らす方法は?

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を縮小する方法を知っている場合は、自由に共有してください!

3
romu

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に縮小されました。

4
romu

WindowsゲストOSを縮小するには、ゲスト内のパーティションを縮小し、VMをシャットダウンし、目的のサイズの新しい小さいディスクを作成し、古いディスクから新しい小さいディスクにデータをコピーし、ディスク名を交換して再起動する必要がありますVM。

簡単ですが、不適切に行うと、データの損失や髪の毛が失われる可能性があります。

KVM 100 GBのWindows Server 2012ゲストで、QCOW2形式を使用して35 GBに縮小したい場合)の手順は次のとおりです。

[〜#〜]重要[〜#〜]:この方法では、仮想マシンを変更しません定義。代わりに、ディスクイメージの操作のみが必要です。

ゲストの前提条件:

  • ゲストは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. 「Shrink C:」ダイアログウィンドウが表示されたら、「Amount of space toshrink」にスペースの量を入力します。これにより、「MB単位のシュリンク後の合計サイズ」の値が目的の35 GBに近づきます。次に、「縮小」をクリックします。

    [〜#〜]注[〜#〜]:新しいスペースが小さすぎる場合、エラーメッセージが表示されることがあります。エラーがなくなり、縮小が行われるまで、「縮小する容量」を1GBずつ増やします。実際には、10 GBの空き領域を確保したいと考えています。

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

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

  7. Windowsゲストの準備が整いました。

ステップ2:VM Host上のディスクの収縮

手順は実際には縮小ではありませんが、代わりに(最終サイズの)新しいディスクを作成し、元のディスクから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. さて、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のイメージを作成します。計算が完全でない限り、必然的に余剰スペースができてしまいますが、心配しないで、以下で扱います。

  9. 合計サイズ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`
    
  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に関するコメントを思い出してください...それをキャンセルしてディスクを再作成するか、ここで行うように先に進んで、STEPで実行されているように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が正常に起動することを確認し、Cパーティションを追加のスペースに拡張します。

  1. Windowsゲストにログイン

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

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

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

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

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

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

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

7
John

qemu-img -cを実行すると、イメージを圧縮します。これにより、スペースをいくらか削減することはできますが、パフォーマンスが大幅に低下する可能性があります。ディスク上のゼロを重複排除したい場合は、基本的にqemu-img convertを実行する必要があります。これは、イメージをあるフォーマットから別のフォーマットに変換する場合と同じです(srcとdstのフォーマットが同じ場合でも)。

このプロセスは、新しく変換されたイメージを書き込み、ゼロを排除し、ドライブ上のゼロ化されたスペースを効果的に重複排除します。

別のオプションは、もちろんvirt-sparsifyを使用することです。

3
dyasny

Windowsで私のために働いた方法VM on KVMは以下の通りです。

Windowsゲストの場合:

  1. 必要に応じて最適化します。
  2. sdelete -z c:sdelete -zはVM用です。ディスク上の実際のQCOW2イメージのサイズは増加せず、空の領域はゼロになります。 sdelete -c一方、必要ではなく、ディスク上のQCOW2イメージサイズが増加します)

Linuxホスト:

  1. qemu-img convert -O qcow2 -c inputVM.img outputVM.img(これはスナップショットを保持せず、現在の状態になります)
2
Aditya Iyer

XenialおよびBionicでは、ユーティリティvirt-sparsifyパッケージから libguestfs-tools が機能するはずです。ご了承ください:

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

空のスペースを「穴あけ」または「スパース化」するだけです。そのためには、0と穴のみを含むスペースが必要です。ファイルシステムの「空スペース」は単に割り当てられていませんが、0ではなく古いジャンクデータが含まれている可能性があります。したがって、最初のステップはそれをゼロにすることです。それを行うためのツールがありますが、これを行うための簡単な最小限の方法を次に示します...

  1. VMを起動します。
  2. 各ファイルシステムで0のみのファイルを作成し、それを削除します。ここでは、/ tmpがユーザーによって書き込み可能であり、rootfs上にあると想定しています。 (Windowsでは、cygwinで同じコマンドを実行するか、別のツールを使用できます。)

    dd if=/dev/zero of=/tmp/zeros bs=1M
    rm /tmp/zeros
    

    これで、空のスペースはちょうど0になります。しかし、また、このディスクはディスク上のフルサイズ...であり、最終的に必要なものの反対です。したがって、以前スペースが足りなかった場合、これは機能しません。

  3. VMを停止します。

  4. パンチ穴。これを行うにはいくつかの方法があります... ここにpythonスクリプト を使用した高速な方法があります。最初にvmを停止してから、ディスクでスクリプトを実行しますファイル:qcow2ファイルまたは別の形式の場合、同じように機能するはずですが、忘れていることや、もっと簡単な方法があるかもしれません。

また、ホールが割り当てられていないため、ファイルがすべて1か所にあるわけではないことに注意してください。ファイルシステムが断片化し、パフォーマンスが低下する可能性があります。これは、ファイルの書き込み中にスペースが非常に少ない場合を除いて、通常のLinux/UNIXファイルシステムではまったく目立たないはずですが、可能性に注意してください。断片化を避けるために、少なくとも10%の空き領域を維持することをお勧めします。

また、他のことも行うツールもあります...ゼロ以外の空のスペースのみをゼロにする(穴を開ける前に拡張されないようにする)、スワップもゼロにする、オンライン中に実行する(おそらくハイパーバイザーのサポートが必要)、これらの方法を試してみたところ、どれも非常に信頼性が低く、手動でゼロにした場合と比べて5%ほど圧縮されないことがありました。そのため、ツールをリストすることさえありません。他の人は自分のお気に入りをリストできます。

1
Peter

システムの復元を無効にするか、VMディスク内の既存のボリュームシャドウコピーを削除します。これだけでも多くのスペースを占有する可能性があり、ファイルシステムには表示されません。その後、sdeleteとzeroを実行します。 VMの再起動後、空き領域を確保します。

0
jgdaqs