Comment redimensionner le disque de la machine virtuelle?

23

Est-il possible de redimensionner le disque d'une machine virtuelle? Disons augmenter la taille du disque de 32 Go à 64 Go. J'utilise KVM / Qemu sur le serveur Ubuntu 11.10 64 bits. Merci.

Tong Wang
la source

Réponses:

27

Sur une distribution basée sur Debian, vous devriez utiliser à la virt-resizeplace. Cette poignée à peu près tout sous le capot maintenant. Supposons que votre image s'appelle Win7 (pourquoi pas?). Assurez-vous d'abord que votre machine virtuelle est arrêtée:

Installez l'outil:

# apt-get install libguestfs-tools

Obtenez l'emplacement de votre disque 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" />

Vous devrez peut-être vous adapter /var/lib/libvirt/images/Win7.imgaux éléments suivants:

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

Créez votre disque 64G:

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

Vous devrez développer / dev / sda2 (pas la partition de démarrage):

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

Faites une sauvegarde au cas où (ou utilisez mvsi vous ne voulez pas la sauvegarde):

# 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

Maintenant, démarrez!

Pour plus d'informations: man virt-resize

malat
la source
3
Au lieu de faire une sauvegarde à la dernière étape (si l'image est grande et que vous ne voulez pas / n'avez pas l'espace disque supplémentaire), vous pouvez simplement faire virsh edit virt_nameet changer le chemin d'accès à la source du disque pour le nouveau. Si cela ne fonctionne pas, modifiez-le et réessayez. Il n'y a pas vraiment d'intérêt à avoir 3 images quand on pourrait le faire avec 2.
Mike
1
Ou vous pouvez simplement utiliser mv au lieu de cp pour la première commande. En plus d'économiser de l'espace disque, il sera également beaucoup plus rapide de cette façon.
Kevin Keane
6
une chose importante à noter est que même si l'image d'origine a un type, l'instance de destination sera de rawtype. Si vous souhaitez conserver le qcow2type d' instance , vous devez appliquer une conversion comme:qemu-img convert -O qcow2 /var/lib/libvirt/images/outdisk /var/lib/libvirt/images/outdisk.qcow2
Déconnexion
1
Et virt-resize a même un joli spinner de progression ncurses.
David McNeill
18

Je recommande avant de faire quoi que ce soit de prendre une copie complète de l'image disque telle qu'elle est, puis quand tout se casse, vous pouvez la recopier pour recommencer.

Il y a 3 choses que vous devez faire:

1) Agrandir l'image du disque. Chez votre hôte:

qemu-img resize foo.qcow2 +32G

Maintenant, votre invité peut voir un disque plus gros, mais a toujours d'anciennes partitions et systèmes de fichiers.

2) Agrandir la partition à l'intérieur de l'image disque. Pour cela, vous devez démarrer un LiveCD sur votre invité, car vous ne pourrez pas jouer avec une partition montée. C'est assez compliqué et probablement la partie la plus dangereuse. C'est beaucoup à copier ici, donc je vais juste lier à la place pour l'instant. Vous voulez faire quelque chose comme ça:

http://www.howtoforge.com/linux_resizing_ext3_partitions_p2

OU 2b) la création d'une nouvelle partition serait plus simple (et plus sûre) si vous voulez simplement plus d'espace de stockage. Utilisez fdisk ou cfdisk, ou tout ce qui vous convient - vous devriez maintenant voir tout un tas d'espace non alloué sur votre disque invité.

3) Enfin, si vous redimensionnez votre partition existante, agrandissez le système de fichiers à l'intérieur de la nouvelle partition plus grande (c'est en fait dans le guide lié ci-dessus de toute façon). À l'intérieur de votre invité:

resize2fs /dev/sda1
Césium
la source
Merci pour la réponse rapide. Cela ressemble à une solution viable. Je serai absent de la ville pendant quelques jours, mais une fois que je serai de retour au bureau la semaine prochaine, je vais essayer de faire rapport si cela fonctionne.
Tong Wang
1
Une autre question: si je veux réduire le disque, dois-je effectuer les étapes dans un ordre inversé? Comme: 1. réduire le système de fichiers; 2. rétrécir la partition; 3. rétrécissez l'image du disque. Droite?
Tong Wang
Oui, resize2fs peut rétrécir et augmenter, mais il aura évidemment besoin de suffisamment d'espace libre dans le système de fichiers. Lors de la réduction de la partition, je me trompe en laissant un peu plus que nécessaire afin de ne pas couper accidentellement la fin du système de fichiers :)
Cesium
Vous POUVEZ absolument
jouer
4

Je pense que la réponse de Caesium est très bien, je voudrais juste écrire quelques autres commandes pour réaliser la même chose.

Supposons que vous ayez un fichier disk.imgavec une image disque, c'est-à-dire qu'il ait une table de partition et une ou plusieurs partitions, et dites que vous voulez agrandir la dernière partition. Ce que vous devez faire, c'est

1) agrandissez l'ensemble du fichier, par exemple 4GiB. Un moyen rapide de le faire consiste à utiliserdd

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

2) rendre la partition plus grande en utilisant fdisk (je souhaite pouvoir le faire en partie ou un outil plus agréable ... N'importe qui?)

fdisk disk.img

Tapez ppour imprimer la table des partitions et recherchez le secteur de départ de votre partition, par exemple la partition 2 commence au secteur 106496.

Ce que vous allez faire est de supprimer cette partition de la table des partitions et de créer une nouvelle partition qui commence exactement au même secteur mais se termine à un autre plus tard. Ensuite, la partition contiendra un système de fichiers valide.

Tapez det donnez le numéro de partition à supprimer. (Gorgée!)

Tapez net donnez le numéro de partition souhaité, puis le secteur de démarrage. Vous DEVEZ utiliser le même secteur de démarrage que celui utilisé auparavant. Enfin, donnez le secteur final ou laissez simplement fdisk choisir le secteur le plus élevé que vous pouvez utiliser.

Tapez wpour réécrire les modifications dans le fichier d'image disque et quittez fdisk.

3) Vous devez maintenant redimensionner le système de fichiers. Pour cela, vous avez besoin du décalage vers (= la position du) système de fichiers à l'intérieur de l'image disque. Vous pouvez calculer cela à partir du numéro de secteur si vous connaissez la taille du secteur (qui est généralement 512), ou vous pouvez utiliserparted

parted disk.img u b p

( partedpeut prendre des commandes comme arguments de ligne de commande, donc cela signifie 'octets unitaires' et 'imprimer', donc il imprime la table de partition et utilise les octets comme taille uint.)

Cela imprime la partition commence et se termine. Supposons que votre partition commence à 54525952, puis vous créez un périphérique de bouclage avec losetup.

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

losetupvous indique quel dev il a choisi, par exemple /dev/loop0. Vous pouvez maintenant utiliser resize2fs:

resize2fs /dev/loop0

et enfin retirer le périphérique de boucle

losetup -d /dev/loop0
larsr
la source
2

La meilleure solution trouvée est ici:

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

Je pense que ce que @Caesium a dit est donné par le lien officiel ci-dessus

J'espère que cela vous aidera.

3 étapes:

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

2.GParted live cd to resize

3.reboot and use os tools to resize
kamil
la source
Merci pour la réponse simple. A travaillé pour moi sur 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);

}

Ce programme simple ajoute N octets à la fin de l'image virtuelle. J'ai utilisé l'image de partition Paragon pour Windows XP pour fusionner les images nouvellement créées. Fonctionne bien ici.

Ilian Zapryanov
la source
Fonction statique non utilisée 'auxfilesize', 'aux_copyNBytesFromTo'. Pourquoi cela devrait-il aider?
AB
Inutilisé? Je ne comprends pas la question. Ils sont tous deux utilisés.
Ilian Zapryanov
Le résultat est un octet non alloué et un nouveau disque dur pour le système d'exploitation. Vous devez le formater. Si vous demandez pourquoi les foo-s sont statiques. Cela m'a juste sauvé les prototypes et pourquoi pas. C'est un programme simple écrit en 2 minutes dans mon temps libre :) Rien de spécial ou optimal.
Ilian Zapryanov
3
Vous auriez pu utiliser des outils existants comme ddou truncate...
rudimeier