Antworten:
Auf Debian-basierter Distribution sollten Sie virt-resize
stattdessen verwenden. Dieser Griff hat jetzt so ziemlich alles unter der Haube. Nehmen wir an, Ihr Image heißt Win7 (warum nicht?). Stellen Sie als erstes sicher, dass Ihre VM heruntergefahren ist:
Installieren Sie das Tool:
# apt-get install libguestfs-tools
Abrufen des Speicherorts Ihrer VM-Festplatte:
# 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" />
Möglicherweise müssen Sie /var/lib/libvirt/images/Win7.img
Folgendes anpassen :
# 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 -
Erstellen Sie Ihre 64G-Festplatte:
# truncate -s 64G /var/lib/libvirt/images/outdisk
Sie müssen / dev / sda2 erweitern (nicht die Boot-Partition):
# 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.
Erstellen Sie ein Backup für alle Fälle (oder verwenden mv
Sie, wenn Sie das Backup nicht möchten):
# 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
Jetzt booten!
Für weitere Informationen: man virt-resize
raw
. Wenn Sie beispielsweise den qcow2
Typ pflegen möchten , sollten Sie eine Konvertierung wie qemu-img convert -O qcow2 /var/lib/libvirt/images/outdisk /var/lib/libvirt/images/outdisk.qcow2
Ich empfehle, dass Sie, bevor Sie dies tun, eine vollständige Kopie des Disk-Images erstellen. Wenn alles kaputt geht, können Sie es zurückkopieren, um von vorne zu beginnen.
Es gibt 3 Dinge, die Sie tun müssen:
1) Vergrößern Sie das Disk-Image. In Ihrem Gastgeber:
qemu-img resize foo.qcow2 +32G
Jetzt kann Ihr Gast eine größere Festplatte sehen, hat aber noch alte Partitionen und Dateisysteme.
2) Vergrößern Sie die Partition im Image. Sie müssen dazu eine Live-CD in Ihrem Gast booten, da Sie sich nicht mit einer gemounteten Partition anlegen können. Dies ist ziemlich kompliziert und wahrscheinlich der gefährlichste Teil. Es ist ziemlich viel zu kopieren, also verlinke ich stattdessen erstmal. Sie möchten so etwas tun:
http://www.howtoforge.com/linux_resizing_ext3_partitions_p2
ODER 2b) Das Erstellen einer neuen Partition wäre einfacher (und sicherer), wenn Sie nur mehr Speicherplatz benötigen. Verwenden Sie fdisk oder cfdisk oder was auch immer Sie möchten - Sie sollten jetzt eine ganze Reihe von nicht zugewiesenen Speicherplatz auf Ihrer Gastfestplatte sehen.
3) Wenn Sie die Größe Ihrer vorhandenen Partition geändert haben, vergrößern Sie das Dateisystem in der neuen größeren Partition (dies ist eigentlich in der oben verlinkten Anleitung enthalten). In Ihrem Gast:
resize2fs /dev/sda1
Ich denke, Caesiums Antwort ist in Ordnung. Ich möchte nur einige andere Befehle aufschreiben, um dasselbe zu erreichen.
Angenommen, Sie haben eine Datei disk.img
mit einem Datenträger-Image, dh sie enthält eine Partitionstabelle und eine oder mehrere Partitionen, und Sie möchten die letzte Partition vergrößern. Was Sie tun müssen, ist zu
1) Vergrößern Sie die gesamte Datei, z. B. 4 GB. Eine schnelle Möglichkeit ist die Verwendungdd
dd if=/dev/zero of=disk.img bs=1c seek=4G count=0
2) Vergrößere die Partition mit fdisk (Ich wünschte, ich könnte dies in einem geteilten oder einem schöneren Tool tun ... Jemand?)
fdisk disk.img
Geben Sie p
die partiton Tabelle und sucht den Startsektor der Partition zu drucken, zum Beispiel Partition 2 beginnt bei Sektor 106.496.
Sie müssen diese Partition aus der Partitionstabelle löschen und eine neue Partition erstellen, die genau am selben Sektor beginnt, aber an einem späteren endet. Dann enthält die Partition ein gültiges Dateisystem.
Geben Sie d
und die Partitionsnummer geben zu löschen. (Schluck!)
Geben Sie n
und geben Sie die gewünschte Partitionsnummer und dann den Startsektor. Sie MÜSSEN den gleichen Startsektor wie zuvor verwenden. Geben Sie zum Schluss den Endsektor an oder lassen Sie fdisk den höchsten Sektor auswählen, den Sie verwenden können.
Geben Sie ein w
, um die Änderungen wieder in die Image-Datei zu schreiben, und beenden Sie fdisk.
3) Jetzt müssen Sie die Größe des Dateisystems ändern. Dazu benötigen Sie den Offset zum (= die Position des) Dateisystems im Disk-Image. Sie können dies aus der Sektornummer berechnen, wenn Sie die Sektorgröße kennen (normalerweise 512) oder verwenden könnenparted
parted disk.img u b p
( parted
Kann Befehle als Befehlszeilenargumente annehmen, bedeutet also "Einheitenbytes" und "Drucken", druckt also die Partitionstabelle und verwendet Bytes als Größe uint.)
Dies druckt die Partition aus, die beginnt und endet. Angenommen, Ihre Partition beginnt bei 54525952, dann erstellen Sie eine Loopback-Blockierung mit Geräten losetup
.
losetup -f --show -o 54525952 disk.img
losetup
sagt dir zum Beispiel, welchen Entwickler es ausgewählt hat /dev/loop0
. Jetzt können Sie verwenden resize2fs
:
resize2fs /dev/loop0
und schließlich das Loop-Gerät entfernen
losetup -d /dev/loop0
Die beste Lösung finden Sie hier:
http://www.linux-kvm.com/content/how-resize-your-kvm-virtual-disk
Ich denke, was @Caesium gesagt hat, ist aus dem obigen offiziellen Link ersichtlich
Ich hoffe das wird helfen.
3 Schritte:
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);
}
Dieses einfache Programm fügt dem Ende des virtuellen Images N Bytes hinzu. Ich habe das Paragon-Partitionsimage für Windows XP verwendet, um die neu erstellten Images zusammenzuführen. Funktioniert hier OK.
dd
oder truncate
... verwendet haben
virsh edit virt_name
den Pfad zur Quelle der Festplatte auf den neuen ändern. Wenn es dann nicht funktioniert, ändern Sie es einfach zurück und versuchen Sie es erneut. Es macht nicht wirklich viel Sinn, 3 Bilder zu haben, wenn man es mit 2 machen könnte.