Risposte:
Sulla distribuzione basata su Debian dovresti virt-resize
invece 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.img
a 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 mv
se 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
raw
tipo. 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
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
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 d
e fornire il numero di partizione da eliminare. (Sorso!)
Digitare n
e 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 w
per 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
losetup
ti 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
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
#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.
dd
o truncate
...
virsh edit virt_name
e 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.