Wie kann ich die Größe der Festplatte einer virtuellen Maschine ändern?


23

Gibt es eine Möglichkeit, die Größe der Festplatte einer virtuellen Maschine zu ändern? Erhöhen Sie beispielsweise die Festplattengröße von 32 GB auf 64 GB. Ich verwende KVM / Qemu auf Ubuntu Server 11.10 64bit. Vielen Dank.

Antworten:


27

Auf Debian-basierter Distribution sollten Sie virt-resizestattdessen 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.imgFolgendes 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 mvSie, 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


3
Anstatt im letzten Schritt ein Backup zu erstellen (wenn das Image groß ist und Sie keinen zusätzlichen Speicherplatz benötigen / haben), können Sie einfach virsh edit virt_nameden 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.
Mike

1
Oder Sie könnten einfach mv anstelle von cp für den ersten Befehl verwenden. Auf diese Weise wird nicht nur Speicherplatz gespart, sondern auch erheblich schneller.
Kevin Keane

6
Es ist wichtig zu beachten, dass die Zielinstanz auch dann ein Typ ist, wenn das Ursprungsbild einen Typ hat raw. Wenn Sie beispielsweise den qcow2Typ pflegen möchten , sollten Sie eine Konvertierung wie qemu-img convert -O qcow2 /var/lib/libvirt/images/outdisk /var/lib/libvirt/images/outdisk.qcow2
folgt durchführen

1
Und virt-resize hat sogar einen niedlichen Ncurses Progress Spinner.
David McNeill

18

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

Danke für die schnelle Antwort. Es sieht nach einer praktikablen Lösung aus. Ich bin für ein paar Tage nicht in der Stadt, aber wenn ich nächste Woche wieder im Büro bin, versuche ich es und melde mich, wenn es funktioniert.
Tong Wang

1
Noch eine Frage: Wenn ich die Festplatte verkleinern möchte, führe ich die Schritte in umgekehrter Reihenfolge aus? Wie: 1. Verkleinern Sie das Dateisystem; 2. Verkleinern Sie die Partition. 3. Verkleinern Sie das Disk-Image. Recht?
Tong Wang

Ja, resize2fs kann sowohl verkleinern als auch vergrößern, aber es wird offensichtlich genug freien Speicherplatz im Dateisystem benötigen. Beim Verkleinern der Partition würde ich mich irren, wenn ich etwas mehr als nötig zurücklasse, damit Sie nicht versehentlich das Ende des Dateisystems abschneiden :)
Caesium

Sie können sich absolut mit einer gemounteten Partition
anlegen

4

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.imgmit 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 pdie 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 dund die Partitionsnummer geben zu löschen. (Schluck!)

Geben Sie nund 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

( partedKann 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 

losetupsagt 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

2

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

Danke für die einfache Antwort. Arbeitete für mich auf 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);

}

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.


Unbenutzte statische Funktion 'auxfilesize', 'aux_copyNBytesFromTo'. Warum sollte das helfen?
AB

Ungebraucht? Ich verstehe die Frage nicht. Sie werden beide verwendet.
Ilian Zapryanov

Das Ergebnis sind nicht zugewiesene Bytes und eine neue Festplatte für das Betriebssystem. Sie müssen es formatieren. Wenn Sie sich fragen, warum die Foos statisch sind. Es hat mir nur die Prototypen gerettet und warum nicht. Es ist ein einfaches Programm, das in meiner Freizeit in 2 Minuten geschrieben wurde :) Nichts Besonderes oder Optimales.
Ilian Zapryanov

3
Sie könnten vorhandene Tools wie ddoder truncate... verwendet haben
Rudimeier
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.