仮想マシンのディスクのサイズを変更する方法は?


23

とにかく仮想マシンのディスクのサイズを変更する方法はありますか?ディスクサイズを32GBから64GBに増やしたとします。Ubuntuサーバー11.10 64ビットでKVM / Qemuを実行しています。ありがとう。

回答:


27

Debianベースのディストリビューションでは、virt-resize代わりに使用する必要があります。これは、今ではほとんどすべてを処理します。イメージがWin7と呼ばれると仮定しましょう(なぜですか?)。まず、VMがシャットダウンされていることを確認してください。

ツールをインストールします。

# apt-get install libguestfs-tools

VMディスクの場所を取得します。

# virsh dumpxml Win7 | xpath -e /domain/devices/disk/source
Found 2 nodes in stdin:
-- NODE --
<source file="/var/lib/libvirt/images/Win7.img" />
-- NODE --
<source file="/var/lib/libvirt/images/Win7.iso" />

/var/lib/libvirt/images/Win7.img以下に適応する必要がある場合があります。

# virt-filesystems --long --parts --blkdevs -h -a /var/lib/libvirt/images/Win7.img
Name       Type       MBR  Size  Parent
/dev/sda1  partition  07   100M  /dev/sda
/dev/sda2  partition  07   32G   /dev/sda
/dev/sda   device     -    32G   -

64Gディスクを作成します。

# truncate -s 64G /var/lib/libvirt/images/outdisk

/ dev / sda2(ブートパーティションではない)を展開する必要があります。

# virt-resize --expand /dev/sda2 /var/lib/libvirt/images/Win7.img /var/lib/libvirt/images/outdisk
Examining /var/lib/libvirt/images/Win7.img ...
 100% [progress bar] --:--
**********

Summary of changes:

/dev/sda1: This partition will be left alone.

/dev/sda2: This partition will be resized from 32G to 64G.  The 
    filesystem ntfs on /dev/sda2 will be expanded using the 
    'ntfsresize' method.

**********
Setting up initial partition table on outdisk ...
Copying /dev/sda1 ...
Copying /dev/sda2 ...
 100% [progress bar] 00:00
 100% [progress bar] 00:00
Expanding /dev/sda2 using the 'ntfsresize' method ...

Resize operation completed with no errors.  Before deleting the old 
disk, carefully check that the resized disk boots and works correctly.

念のためバックアップを作成しmvます(またはバックアップが必要ない場合に使用します)。

# cp /var/lib/libvirt/images/Win7.img /var/lib/libvirt/images/Win7.img.old
# mv /var/lib/libvirt/images/outdisk /var/lib/libvirt/images/Win7.img

さあブート!

詳細:man virt-resize


3
最後の手順でバックアップを作成する代わりに(イメージが大きく、追加のディスク領域が必要ない場合は)virsh edit virt_name、ディスクのソースへのパスを新しいものに変更するだけで済みます。それが機能しない場合は、元に戻して再試行してください。本当に多くのポイントは、あなたが2でそれを行うことができたときに3枚の画像を有することではありません
マイク・

1
または、最初のコマンドにcpではなくmvを使用することもできます。ディスク領域を節約するだけでなく、この方法でも劇的に高速になります。
ケビン・キーン

6
注意すべき重要な点の1つは、元のイメージに型がある場合でも、宛先インスタンスはraw型になります。インスタンスqcow2タイプを維持したい場合は、次のような変換を適用する必要がありますqemu-img convert -O qcow2 /var/lib/libvirt/images/outdisk /var/lib/libvirt/images/outdisk.qcow2
。–ログオフ

1
また、virt-resizeにはかわいいncurses進行スピナーがあります。
デビッドマクニール

18

これを行う前に、ディスクイメージの完全なコピーをそのまま使用することをお勧めします。その後、すべてが壊れたら、コピーして最初からやり直すことができます。

あなたがする必要がある3つのことがあります:

1)ディスクイメージを大きくします。ホストで:

qemu-img resize foo.qcow2 +32G

これでゲストはより大きなディスクを見ることができますが、古いパーティションとファイルシステムはまだあります。

2)ディスクイメージ内のパーティションを大きくします。このためには、ゲストのLiveCDからブートする必要があります。マウントされたパーティションを台無しにすることはできないからです。これは非常に複雑で、おそらく最も危険な部分です。ここにコピーするのは非常に多いので、今のところ代わりにリンクします。あなたはこのようなことをしたい:

http://www.howtoforge.com/linux_resizing_ext3_partitions_p2

または2b)より多くのストレージスペースが必要な場合は、新しいパーティションを作成する方が簡単(かつ安全)です。fdiskまたはcfdisk、または使い慣れたものを使用します。ゲストディスクに未割り当ての領域がすべて表示されるはずです。

3)最後に、既存のパーティションのサイズを変更した場合、新しい大きなパーティション内のファイルシステムを大きくします(これは実際には上記のリンクのガイドにあります)。ゲストの内部:

resize2fs /dev/sda1

迅速な回答をありがとう。実行可能なソリューションのように見えます。私は数日間町を離れますが、来週オフィスに戻ったら、試してみて、機能するかどうかを報告します。
トン王

1
もう1つの質問:ディスクを縮小したい場合、逆の順序で手順を実行しますか?次のように:1.ファイルシステムを縮小します。2.パーティションを縮小します。3.ディスクイメージを縮小します。右?
トン王

はい、resize2fsは縮小することも成長することもできますが、ファイルシステムに十分な空き領域が必要であることは明らかです。パーティションを縮小するとき、必要以上に少し残しておくとエラーになるので、誤ってファイルシステムの端を切り落とさないようにしてください:)
セシウム

あなたは絶対にマウントされたパーティションを台無しにすることができます
エーテル

4

Caesiumの答えは素晴らしいと思います。同じことを達成するために他のコマンドを書き留めたいと思います。

disk.imgディスクイメージのあるファイル、つまりパーティションテーブルと1つ以上のパーティションがあるとし、最後のパーティションを大きくしたいとします。あなたがしなければならないことは

1)4GiBなど、ファイル全体を大きくします。それを行う簡単な方法はdd

dd if=/dev/zero of=disk.img bs=1c seek=4G count=0

2)fdiskを使用してパーティションを大きくします(これをpartedまたは他の優れたツールで実行できるといいのですが...誰ですか?)

fdisk disk.img

入力pしてパーティションテーブルを印刷し、パーティションの開始セクターを探します。たとえば、パーティション2はセクター106496から始まります。

パーティションテーブルからそのパーティションを削除し、まったく同じセクターで始まり新しいセクターで終わる新しいパーティションを作成します。その後、パーティションには有効なファイルシステムが含まれます。

d削除するパーティション番号を入力して指定します。(むしゃむしゃ!)

n目的のパーティション番号を入力して指定し、開始セクターを指定します。以前と同じ開始セクターを使用する必要があります。最後に、最終セクターを指定するか、fdiskで使用可能な最高のセクターを選択します。

入力wして変更をディスクイメージファイルに書き戻し、fdiskを終了します。

3)次に、ファイルシステムのサイズを変更する必要があります。このためには、ディスクイメージ内のファイルシステムへのオフセット(=の位置)が必要です。セクターサイズ(通常は512)がわかっている場合は、セクター番号からこれを計算できます。または、parted

parted disk.img u b p

partedコマンドをコマンドライン引数として受け取ることができるため、これは「ユニットバイト」と「印刷」を意味するため、パーティションテーブルを印刷し、サイズuintとしてバイトを使用します。)

これにより、パーティションの開始と終了が出力されます。パーティションが54525952から始まるとすると、でループバックブロックデバイスを作成しlosetupます。

losetup -f --show -o 54525952 disk.img 

losetupたとえば、どのdevを選択したかがわかります/dev/loop0。使用できるようになりましたresize2fs

resize2fs /dev/loop0

そして最後にループデバイスを取り外します

losetup -d /dev/loop0

2

見つかった最適なソリューションは次のとおりです。

http://www.linux-kvm.com/content/how-resize-your-kvm-virtual-disk

私は@Caesiumが言ったことは上記の公式リンクから与えられていると思う

これが役立つことを願っています。

3ステップ:

1.qemu-img resize windows.qcow2 +5GB

2.GParted live cd to resize

3.reboot and use os tools to resize

簡単な答えをありがとう。Ubuntu 16.04で私のために働いた
phil

-1
#include <stdio.h>

static unsigned long auxfilesize(FILE* fp) {

    unsigned long len=0;
    int c=0;


    while ( (c = fgetc(fp)) != -1 ) {
        len++;
    }

    return len;
}


static unsigned long aux_copyNBytesFromTo(FILE* from, FILE* to,
                                    unsigned long fromSize, 
                                    unsigned long bytes) {

    unsigned long iter = 0;
    while ( iter++ < fromSize ) {
        int c = fgetc(from);
        fputc(c, to);

    }
    iter-=1; 
    if ( fromSize < bytes ) {
        while ( iter++ < bytes ) {
            fputc(0, to);
        }
    }
    return iter;
}


int main(int argc, char **argv) {
    FILE *from = fopen(argv[1], "rb");
    FILE *to = fopen(argv[2], "wb" );
    unsigned long l = auxfilesize(from);

    rewind(from); 

    aux_copyNBytesFromTo(from, to, l, (l + l/2)) ;

    fclose(from);
    fclose(to);

}

この単純なプログラムは、仮想イメージの最後にNバイトを追加します。Windows XPのParagonパーティションイメージを使用して、新しく作成されたイメージをマージしました。ここで動作します。


未使用の静的関数「auxfilesize」、「aux_copyNBytesFromTo」。なぜそれが役立つのですか?
AB

未使用?私は質問を理解していません。両方とも使用されます。
イリアンザプリャノフ

結果は、未割り当てのバイトとOSへの新しいハードドライブです。フォーマットする必要があります。foo-sが静的である理由を尋ねている場合。プロトタイプを保存してくれただけでした。それは私の暇なときに2分で書かれた簡単なプログラムです:)特別なものや最適なものはありません。
イリアンザプリャノフ

3
ddまたはtruncate...のような既存のツールを使用できたかもしれません
-rudimeier
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.