Come ridimensionare il disco della macchina virtuale?


23

Esiste un modo per ridimensionare il disco di una macchina virtuale? Supponiamo di aumentare le dimensioni del disco da 32 GB a 64 GB. Sto eseguendo KVM / Qemu sul server Ubuntu 11.10 a 64 bit. Grazie.

Risposte:


27

Sulla distribuzione basata su Debian dovresti virt-resizeinvece usare . Ora gestisce praticamente tutto sotto il cofano. Supponiamo che la tua immagine si chiami Win7 (perché no?). Per prima cosa assicurati che la tua VM sia spenta:

Installa lo strumento:

# apt-get install libguestfs-tools

Ottieni la posizione del tuo 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" />

Potrebbe essere necessario adattarsi /var/lib/libvirt/images/Win7.imga quanto segue:

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

Crea il tuo disco 64G:

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

Dovrai espandere / dev / sda2 (non la partizione di avvio):

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

Effettua un backup per ogni evenienza (o usa mvse non vuoi il 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

Adesso avvia!

Per maggiori informazioni: man virt-resize


3
Invece di fare un backup nell'ultimo passaggio (se l'immagine è grande e non vuoi / non hai lo spazio su disco aggiuntivo) puoi semplicemente fare virsh edit virt_namee cambiare il percorso dalla sorgente del disco a quella nuova. Quindi se non funziona, basta cambiarlo e riprovare. Non ha molto senso avere 3 immagini quando puoi farlo con 2.
Mike

1
Oppure potresti semplicemente usare mv invece di cp per il primo comando. Oltre a risparmiare spazio su disco, sarà anche molto più veloce in questo modo.
Kevin Keane,

6
una cosa importante da notare è che anche se l'immagine di origine ha un tipo, l'istanza di destinazione sarà di rawtipo. se si desidera mantenere, ad esempio qcow2, il tipo, è necessario applicare una conversione come:qemu-img convert -O qcow2 /var/lib/libvirt/images/outdisk /var/lib/libvirt/images/outdisk.qcow2
disconnessione

1
E virt-resize ha anche un grazioso spinner di avanzamento di ncurses.
David McNeill,

18

Prima di fare ciò, ti consiglio di prendere una copia completa dell'immagine del disco così com'è, quindi quando tutto si rompe puoi copiarla di nuovo per ricominciare.

Ci sono 3 cose che devi fare:

1) Ingrandisci l'immagine del disco. Nel tuo host:

qemu-img resize foo.qcow2 +32G

Ora il tuo ospite può vedere un disco più grande, ma ha ancora vecchie partizioni e filesystem.

2) Ingrandisci l'immagine della partizione all'interno del disco. A tale scopo, è necessario avviare un LiveCD nel proprio guest, poiché non sarà possibile interferire con una partizione montata. Questo è abbastanza coinvolto e probabilmente la parte più pericolosa. È parecchio da copiare qui, quindi per il momento mi limiterò a collegare. Vuoi fare qualcosa del genere:

http://www.howtoforge.com/linux_resizing_ext3_partitions_p2

OPPURE 2b) la creazione di una nuova partizione sarebbe più semplice (e più sicura) se si desidera solo più spazio di archiviazione. Usa fdisk o cfdisk, o qualunque cosa tu ti senta a tuo agio - dovresti vedere un sacco di spazio non allocato sul tuo disco ospite ora.

3) Infine, se hai ridimensionato la tua partizione esistente, ingrandisci il filesystem all'interno della nuova partizione più grande (questo è in realtà nella guida sopra collegata comunque). All'interno del tuo ospite:

resize2fs /dev/sda1

Grazie per la risposta rapida. Sembra una soluzione praticabile. Sarò fuori città per alcuni giorni, ma una volta tornato in ufficio la settimana prossima, ci proverò e riferirò se funziona.
Tong Wang,

1
Un'altra domanda: se voglio ridurre il disco, eseguo i passaggi in ordine inverso? Come: 1. ridurre il file system; 2. ridurre la partizione; 3. ridurre l'immagine del disco. Destra?
Tong Wang,

Sì, resize2fs può ridursi e crescere, ma ovviamente avrà bisogno di abbastanza spazio libero nel filesystem. Riducendo la partizione, commetto un errore nel lasciare un po 'più del necessario in modo da non tagliare accidentalmente la fine del filesystem :)
Cesio

PUOI assolutamente pasticciare con una partizione montata
etereo

4

Penso che la risposta di Caesium vada bene, vorrei solo scrivere altri comandi per ottenere la stessa cosa.

Supponiamo di avere un file disk.img con un'immagine del disco, ovvero che abbia una tabella delle partizioni e una o più partizioni, e dire che si desidera ingrandire l'ultima partizione. Quello che devi fare è farlo

1) ingrandisci l'intero file, ad esempio 4GiB. Un modo rapido per farlo è usaredd

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

2) ingrandisci la partizione usando fdisk (vorrei poterlo fare con uno strumento parted o più bello ... Qualcuno?)

fdisk disk.img

genere p per stampare la tabella dei partiti e cercare il settore iniziale della partizione, ad esempio la partizione 2 inizia dal settore 106496.

Quello che farai è eliminare quella partizione dalla tabella delle partizioni e creare una nuova partizione che inizia nello stesso settore esatto ma termina in uno successivo. Quindi la partizione conterrà un file system valido.

Digitare de fornire il numero di partizione da eliminare. (Sorso!)

Digitare ne fornire il numero di partizione desiderato, quindi il settore iniziale. È NECESSARIO utilizzare lo stesso settore iniziale utilizzato in precedenza. Finalmente dai il settore finale o lascia che fdisk scelga il settore più alto che puoi usare.

Digitare wper riscrivere le modifiche nel file di immagine del disco e uscire da fdisk.

3) Ora devi ridimensionare il filesystem. Per questo è necessario l'offset al (= la posizione del) file system all'interno dell'immagine del disco. Puoi calcolarlo dal numero di settore se conosci la dimensione del settore (che di solito è 512), oppure puoi usarloparted

parted disk.img u b p

(parted può prendere i comandi come argomenti della riga di comando, quindi questo significa 'unit bytes' e 'print', quindi stampa la tabella delle partizioni e usa i byte come dimensione uint.)

Questo stampa l'inizio e la fine della partizione. Supponi che la tua partizione inizi a 54525952, quindi crei un dispositivo di blocco loopback con losetup.

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

losetupti dice quale sviluppatore ha scelto, per esempio /dev/loop0. Ora puoi usare resize2fs:

resize2fs /dev/loop0

e infine rimuovere il dispositivo loop

losetup -d /dev/loop0

2

La migliore soluzione trovata è qui:

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

Penso che ciò che @Caesium abbia detto sia dato dal link ufficiale sopra

Spero che questo possa aiutare.

3 passaggi:

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

2.GParted live cd to resize

3.reboot and use os tools to resize

Grazie per la semplice risposta. Ha funzionato per me su 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);

}

Questo semplice programma aggiunge N byte alla fine dell'immagine virtuale. Ho usato l'immagine della partizione Paragon per Windows XP per unire le immagini appena create. Funziona bene qui.


Funzione statica inutilizzata 'auxfilesize', 'aux_copyNBytesFromTo'. Perché dovrebbe essere d'aiuto?
AB

Inutilizzato? Non capisco la domanda. Sono entrambi usati.
Ilian Zapryanov,

Il risultato è un byte non allocato e un nuovo disco rigido per il sistema operativo. Devi formattarlo. Se stai chiedendo perché i foo-s sono statici. Mi ha appena salvato i prototipi e perché no. È un semplice programma scritto in 2 minuti nel mio tempo libero :) Niente di speciale o ottimale.
Ilian Zapryanov,

3
Avresti potuto usare strumenti esistenti come ddo truncate...
Rudimeier,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.