Como redimensionar o disco da máquina virtual?

22

Existe alguma maneira de redimensionar o disco de uma máquina virtual? Diga aumentando o tamanho do disco de 32 GB para 64 GB. Estou executando o KVM / Qemu no servidor Ubuntu 11.10 64 bits. Obrigado.

    
por Tong Wang 24.02.2012 / 09:26

5 respostas

25

Na distro baseada no Debian você deve usar virt-resize . Este identificador praticamente tudo sob o capô agora. Vamos supor que sua imagem é chamada de Win7 (por que não?). A primeira coisa é que sua VM seja desligada:

Instale a ferramenta:

# apt-get install libguestfs-tools

Obtenha a localização do seu disco 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" />

Pode ser necessário adaptar /var/lib/libvirt/images/Win7.img nos seguintes itens:

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

Crie seu disco 64G:

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

Você precisará expandir / dev / sda2 (não a partição de inicialização):

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

Faça um backup apenas no caso (ou use mv se você não quiser o backup):

# 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

Agora inicialize!

Para mais informações: virt-resize

    
por malat 11.06.2014 / 17:36
17

Eu recomendo que, antes de fazer nada disso, você tire uma cópia completa da imagem do disco como está, então, quando tudo estiver quebrado, você poderá copiá-la de volta para o início.

Existem 3 coisas que você precisa fazer:

1) Torne a imagem do disco maior. Em seu host:

qemu-img resize foo.qcow2 +32G

Agora, seu convidado pode ver um disco maior, mas ainda tem partições e sistemas de arquivos antigos.

2) Amplie a partição dentro da imagem do disco. Você precisa inicializar um LiveCD no seu convidado para isso, já que você não será capaz de mexer com uma partição montada. Isso é bastante complicado e provavelmente a parte mais perigosa. É bastante copiar aqui, então eu vou apenas linkar por enquanto. Você quer fazer algo assim:

link

OR 2b) criar uma nova partição seria mais simples (e seguro) se você quiser apenas mais espaço de armazenamento. Use fdisk ou cfdisk, ou o que você se sentir confortável - você deve ver um monte de espaço não alocado em seu disco de convidado agora.

3) Finalmente, se você redimensionou sua partição existente, torne o sistema de arquivos dentro da nova partição maior maior (isso está no guia linkado acima). Dentro do seu convidado:

resize2fs /dev/sda1
    
por Caesium 24.02.2012 / 13:41
4

Eu acho que a resposta do Caesium é boa, eu gostaria apenas de escrever alguns outros comandos para conseguir a mesma coisa.

Suponha que você tenha um arquivo disk.img com uma imagem de disco, ou seja, ele possui uma tabela de partições e uma ou mais partições e diz que você deseja aumentar a última partição. O que você tem que fazer é

1) torne o arquivo inteiro maior, digamos 4GiB. Uma maneira rápida de fazer isso é usar dd

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

2) aumentar a partição usando o fdisk (eu gostaria de poder fazer isso em parted ou alguma ferramenta mais agradável ... alguém?)

fdisk disk.img

Digite p para imprimir a tabela partiton e procure pelo setor inicial de sua partição, por exemplo, a partição 2 inicia no setor 106496.

O que você fará é excluir essa partição da tabela de partições e criar uma nova partição que comece exatamente no mesmo setor, mas termine em outro. Então a partição irá conter um sistema de arquivos válido.

Digite d e forneça o número da partição a ser excluída. (Gole!)

Digite n e forneça o número da partição desejado e, em seguida, o setor inicial. Você DEVE usar o mesmo setor inicial que foi usado antes. Finalmente, dê o setor final ou deixe o fdisk escolher o setor mais alto que você pode usar.

Digite w para gravar as alterações no arquivo de imagem do disco e saia do fdisk.

3) Agora você precisa redimensionar o sistema de arquivos. Para isso, você precisa do deslocamento para (= a posição do) sistema de arquivos dentro da imagem do disco. Você pode calcular isso a partir do número do setor se souber o tamanho do setor (que normalmente é 512), ou você pode usar parted

parted disk.img u b p

( parted pode receber comandos como argumentos de linha de comando, então isso significa 'bytes unitários' e 'imprimir', então imprime a tabela de partições e usa bytes como tamanho uint.)

Isto imprime a partição começa e termina. Digamos que sua partição comece em 54525952 e, em seguida, crie um dispositivo de bloco de loopback com losetup .

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

losetup informa qual dev escolhido, por exemplo, /dev/loop0 . Agora você pode usar resize2fs :

resize2fs /dev/loop0

e finalmente remover o dispositivo de loop

losetup -d /dev/loop0
    
por larsr 18.04.2013 / 14:23
2

A melhor solução encontrada está aqui:

link

Acho que o que o @Caesium disse é dado pelo link oficial acima

Espero que isso ajude.

3 etapas:

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

2.GParted live cd to resize

3.reboot and use os tools to resize
    
por kamil 17.12.2013 / 14:21
-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);

}

Este programa simples adiciona N bytes ao final da imagem virtual. Eu usei a imagem de partição Paragon para o Windows XP para mesclar as imagens recém-criadas. Funciona bem aqui.

    
por Ilian Zapryanov 08.07.2015 / 17:59