Sanal makine diski nasıl yeniden boyutlandırılır?


23

Sanal bir makinenin diskini yeniden boyutlandırmak için yine de var mı? Disk boyutunu 32GB'tan 64GB'a yükseltmeyi söyleyin. KVM / Qemu'yu Ubuntu sunucusundaki 11.10 64bit kullanıyorum. Teşekkürler.

Yanıtlar:


27

Debian tabanlı dağıtımda virt-resizebunun yerine kullanmalısınız . Bu artık hemen kaputun altındaki her şeyi idare ediyor. Resminizin Win7 olduğunu varsayalım (neden olmasın?). İlk olarak, VM'nizin kapalı olduğundan emin olun:

Aracı yükleyin:

# apt-get install libguestfs-tools

VM diskinizin yerini alın:

# 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.imgAşağıdakilere uyum sağlamanız gerekebilir :

# 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 diskinizi oluşturun:

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

/ Dev / sda2 kodunu genişletmeniz gerekecek (önyükleme bölümünü değil):

# 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.

Sadece durumda yedekleme yapın (veya mvyedeği istemiyorsanız kullanın ):

# 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

Şimdi aç!

Daha fazla bilgi için: man virt-resize


3
Son adımda bir yedekleme yapmak yerine (görüntü büyükse ve ek disk alanı istemiyorsanız / istemiyorsanız) virsh edit virt_name, diskin kaynağının yolunu yenisiyle değiştirebilirsiniz. Sonra işe yaramazsa, sadece geri değiştirin ve tekrar deneyin. 2 ile yapabileceğiniz zaman 3 görüntü elde
Mike

1
Veya ilk komut için cp yerine mv kullanabilirsiniz. Disk alanından tasarruf etmenin yanı sıra, bu yolla da çok daha hızlı olacaktır.
Kevin Keane

6
Dikkat edilmesi gereken önemli bir nokta, kaynak görüntünün bir türü olsa bile, hedef örneğin yazılacağıdır raw. Örnek qcow2türünü korumak istiyorsanız , aşağıdaki gibi bir dönüşüm uygulamanız gerekir:qemu-img convert -O qcow2 /var/lib/libvirt/images/outdisk /var/lib/libvirt/images/outdisk.qcow2
logoff

1
Ve virt-resize bile sevimli bir hemşirenin gelişme göstericisine sahip.
David McNeill

18

Bunlardan herhangi birini yapmadan önce, olduğu gibi disk görüntüsünün tam bir kopyasını almanızı öneririm, daha sonra her koptuğunda baştan başlamak için tekrar kopyalayabilirsiniz.

Yapmanız gereken 3 şey var:

1) Disk görüntüsünü büyütün. Ev sahibinizde:

qemu-img resize foo.qcow2 +32G

Artık misafiriniz daha büyük bir disk görebiliyor, ancak hala eski bölümleri ve dosya sistemleri var.

2) Disk görüntüsünün içindeki bölümü büyütün. Bunun için konuğunuzda bir LiveCD başlatmanız gerekir, çünkü monte edilmiş bir bölümle uğraşmazsınız. Bu oldukça karışmış ve muhtemelen en tehlikeli kısım. Buraya kopyalanacak çok şey var, bu yüzden şimdilik bağlantı kuracağım. Böyle bir şey yapmak istersiniz:

http://www.howtoforge.com/linux_resizing_ext3_partitions_p2

VEYA 2b), daha fazla depolama alanı istiyorsanız, yeni bir bölüm oluşturmak daha basit (ve daha güvenli) olur. Fdisk veya cfdisk veya ne rahat hissederseniz kullanın - şimdi konuk diskinizde ayrılmamış bir sürü alan görmelisiniz.

3) Son olarak, mevcut bölümünüzü yeniden boyutlandırdıysanız, yeni büyük bölüm içindeki dosya sistemini daha büyük hale getirin (bu aslında yine de yukarıda belirtilen kılavuzdadır). Konuğun içinde:

resize2fs /dev/sda1

Hızlı cevap için teşekkürler. Uygulanabilir bir çözüme benziyor. Birkaç gün şehir dışında olacağım, ancak haftaya ofise döndüğümde, çalışıp çalışmadığını tekrar deneyeceğim.
Tong Wang

1
Bir soru daha: eğer diski küçültmek istersem, adımları tersine mi uygularım? Gibi: 1. dosya sistemini küçültmek; 2. bölümü küçültmek; 3. disk görüntüsünü küçültün. Sağ?
Tong Wang

Evet, resize2fs büyüdükçe küçülebilir, ancak dosya sisteminde yeterince boş alana ihtiyaç duyacaktır. Bölmeyi küçültürken, gereğinden fazla bırakmaya karar verdim, bu yüzden yanlışlıkla dosya sisteminin sonunu kesmeyin :)
Caesium

Kesinlikle monte edilmiş bir
bölmeyle uğraşabilirsin

4

Caesium'un cevabının iyi olduğunu düşünüyorum, aynı şeyi yapmak için başka komutları da yazmak istiyorum.

disk.imgDisk görüntüsüne sahip bir dosyanız olduğunu varsayalım , yani bir bölüm tablosu ve bir veya daha fazla bölümü var ve son bölümü daha büyük hale getirmek istediğinizi söyleyin. Yapman gereken şey

1) tüm dosyayı büyütün, 4GiB diyelim. Bunu yapmanın hızlı bir yolu kullanmaktır.dd

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

2) fdisk kullanarak bölümü daha büyük hale getirin (keşke bunu parçalı veya daha güzel bir araçla yapabilseydim ... Herkes?)

fdisk disk.img

Tip psektöründe 106.496 de örnek bölümü için, senin bölümünün başlangıç sektörü için 2 başlar ayırma bölmesini masa ve göz yazdırmak için.

Yapacağınız şey, bu bölümü bölüm tablosundan silmek ve aynı sektörde başlayıp daha sonra bitecek yeni bir bölüm oluşturmaktır. Sonra bölüm geçerli bir dosya sistemi içerecektir.

Tip dve silmek için bölüm numarası vermek. (Yudum!)

Yazın nve istenen bölüm numarasını ve ardından başlangıç sektörünü ver. Daha önce kullanılanlarla aynı başlangıç ​​sektörünü kullanmalısınız. Sonunda son sektörü verin veya fdisk'in kullanabileceğiniz en yüksek sektörü seçmesine izin verin.

Tip wdeğişiklikler disk görüntü dosyasına geri yazmak ve çıkış fdisk için.

3) Şimdi dosya sistemini yeniden boyutlandırmanız gerekiyor. Bunun için, disk görüntüsünde dosya sisteminin (=) konumunu dengelemeye ihtiyacınız var. Sektör boyutunu (genellikle 512 olan) biliyorsanız, bunu sektör numarasından hesaplayabilirsiniz veyaparted

parted disk.img u b p

( partedkomutları komut satırı argümanları olarak alabilir, bu nedenle 'unit bytes' ve 'print' anlamına gelir, bu yüzden bölüm tablosunu yazdırır ve byte'ları size uint olarak kullanır.)

Bu bölüm yazdırır başlar ve biter. Bölümünüzün 54525952'de başladığını ve ardından bir geridöngü blok aygıtı yaptığınızı söyleyin losetup.

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

losetupÖrneğin, hangi devi seçtiğini söyler /dev/loop0. Şimdi kullanabilirsiniz resize2fs:

resize2fs /dev/loop0

ve nihayet döngü cihazı kaldırmak

losetup -d /dev/loop0


-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);

}

Bu basit program sanal görüntünün sonuna N bayt ekler. Yeni oluşturulan görüntüleri birleştirmek için Windows XP için Paragon bölüm görüntüsünü kullandım. Tamam burada çalışıyor.


Kullanılmayan statik fonksiyon 'auxfilesize', 'aux_copyNBytesFromTo'. Bu neden yardım etmeli?
AB,

Kullanılmayan? Soruyu anlamıyorum. İkisi de kullanılıyor.
Ilian Zapryanov

Sonuç, ayrılmamış bir bayt ve işletim sistemine yeni bir sabit sürücüdür. Biçimlendirmelisin. Foo'ların neden statik olduğunu soruyorsanız. Sadece prototipleri kurtardı ve neden olmasın. Boş zamanlarımda 2 dakika içinde yazılmış basit bir program :) Özel veya optimal bir şey yok.
Ilian Zapryanov

3
Var olan araçları kullanabilir ddveya truncate...
rudimeier
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.