Jak zmienić rozmiar dysku maszyny wirtualnej?

23

Czy istnieje możliwość zmiany rozmiaru dysku maszyny wirtualnej? Powiedz zwiększenie rozmiaru dysku z 32 GB do 64 GB. Używam KVM / Qemu na serwerze Ubuntu 11.10 64bit. Dzięki.

Tong Wang
źródło

Odpowiedzi:

27

W dystrybucji opartej na Debianie powinieneś użyć virt-resizezamiast tego. Ten uchwyt obsługuje teraz prawie wszystko pod maską. Załóżmy, że twój obraz nazywa się Win7 (dlaczego nie?). Najpierw upewnij się, że maszyna wirtualna jest wyłączona:

Zainstaluj narzędzie:

# apt-get install libguestfs-tools

Uzyskaj lokalizację dysku maszyny wirtualnej:

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

Konieczne może być dostosowanie /var/lib/libvirt/images/Win7.imgw następujący sposób:

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

Utwórz dysk 64G:

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

Musisz rozwinąć / dev / sda2 (nie partycję rozruchową):

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

Utwórz kopię zapasową na wszelki wypadek (lub użyj, mvjeśli nie chcesz kopii zapasowej):

# 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

Teraz uruchom!

Aby uzyskać więcej informacji: man virt-resize

malat
źródło
3
Zamiast tworzenia kopii zapasowej w ostatnim kroku (jeśli obraz jest duży i nie chcesz / nie masz dodatkowego miejsca na dysku), możesz po prostu zrobić virsh edit virt_namei zmienić ścieżkę do źródła dysku na nowy. Jeśli to nie zadziała, po prostu zmień to i spróbuj ponownie. Posiadanie 3 zdjęć nie ma większego sensu, gdy można to zrobić za pomocą 2.
Mike
1
Lub możesz po prostu użyć mv zamiast cp dla pierwszego polecenia. Oprócz oszczędności miejsca na dysku, będzie w ten sposób znacznie szybszy.
Kevin Keane
6
jedną ważną rzeczą do zauważenia jest to, że nawet jeśli obraz źródłowy ma typ, instancja docelowa będzie rawtypem. jeśli chcesz zachować np. qcow2typ, powinieneś zastosować konwersję:qemu-img convert -O qcow2 /var/lib/libvirt/images/outdisk /var/lib/libvirt/images/outdisk.qcow2
wyloguj się
1
I virt-resize ma nawet ładny spinner postępu ncurses.
David McNeill,
18

Zalecam, aby przed zrobieniem tego zrobić pełną kopię obrazu dysku w takiej postaci, w jakiej jest, a kiedy wszystko się zepsuje, możesz skopiować go z powrotem, aby zacząć od nowa.

Musisz zrobić 3 rzeczy:

1) Powiększ obraz dysku. W twoim hoście:

qemu-img resize foo.qcow2 +32G

Teraz twój gość widzi większy dysk, ale wciąż ma stare partycje i systemy plików.

2) Zwiększ partycję wewnątrz obrazu dysku. W tym celu musisz uruchomić LiveCD w swoim gościu, ponieważ nie będziesz mógł zadzierać z zamontowaną partycją. Jest to dość zaangażowana i prawdopodobnie najbardziej niebezpieczna część. Tutaj jest sporo do skopiowania, więc na razie po prostu połączę. Chcesz zrobić coś takiego:

http://www.howtoforge.com/linux_resizing_ext3_partitions_p2

LUB 2b) utworzenie nowej partycji byłoby prostsze (i bezpieczniejsze), jeśli chcesz tylko więcej miejsca. Użyj fdisk lub cfdisk lub czegokolwiek, z czym czujesz się komfortowo - powinieneś teraz zobaczyć całą masę nieprzydzielonego miejsca na dysku gościa.

3) Wreszcie, jeśli zmieniłeś rozmiar istniejącej partycji, powiększ system plików w nowej, większej partycji (tak w rzeczywistości jest to w powyższym przewodniku). Wewnątrz twojego gościa:

resize2fs /dev/sda1
Cez
źródło
Dzięki za szybką odpowiedź. Wygląda jak realne rozwiązanie. Będę poza miastem przez kilka dni, ale kiedy wrócę do biura w przyszłym tygodniu, spróbuję i zdam raport, jeśli to zadziała.
Tong Wang
1
Jeszcze jedno pytanie: jeśli chcę zmniejszyć dysk, czy wykonuję kroki w odwrotnej kolejności? Jak: 1. zmniejszyć system plików; 2. zmniejszyć partycję; 3. zmniejsz obraz dysku. Dobrze?
Tong Wang
Tak, resize2fs może się zmniejszać, a także rosnąć, ale oczywiście będzie potrzebował wystarczającej ilości wolnego miejsca w systemie plików. Zmniejszając partycję, popełniłem błąd, pozostawiając nieco więcej niż to konieczne, aby przypadkowo nie odciąć końca systemu plików :)
Cesium
Absolutnie MOŻESZ zadzierać z zamontowaną partycją
eteryczną
4

Myślę, że odpowiedź Caesium jest w porządku, chciałbym tylko napisać kilka innych poleceń, aby osiągnąć to samo.

Załóżmy, że masz plik disk.imgz obrazem dysku, tzn. Ma on tablicę partycji i jedną lub więcej partycji, i powiedz, że chcesz powiększyć ostatnią partycję. Musisz tylko to zrobić

1) powiększ cały plik, powiedzmy 4GiB. Szybkim sposobem na to jest użyciedd

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

2) powiększ partycję za pomocą fdisk (chciałbym móc to zrobić w parted lub jakimś lepszym narzędziu ... Ktoś?)

fdisk disk.img

Wpisz, paby wydrukować tabelę partycji i poszukaj sektora początkowego partycji, na przykład partycja 2 zaczyna się od sektora 106496.

Co musisz zrobić, to usunąć tę partycję z tabeli partycji i utworzyć nową partycję, która zaczyna się dokładnie w tym samym sektorze, ale kończy się na późniejszej. Następnie partycja będzie zawierać prawidłowy system plików.

Wpisz di podaj numer partycji do usunięcia. (Łyk!)

Wpisz ni podaj żądany numer partycji, a następnie sektor startowy. MUSISZ użyć tego samego sektora początkowego, który był używany wcześniej. Na koniec podaj sektor końcowy lub po prostu pozwól fdisk wybrać najwyższy sektor, którego możesz użyć.

Wpisz, waby zapisać zmiany z powrotem do pliku obrazu dysku i wyjdź z fdisk.

3) Teraz musisz zmienić rozmiar systemu plików. W tym celu potrzebujesz przesunięcia do (= pozycji) systemu plików wewnątrz obrazu dysku. Możesz to obliczyć na podstawie numeru sektora, jeśli znasz rozmiar sektora (który zwykle wynosi 512) lub możesz użyćparted

parted disk.img u b p

( partedmoże przyjmować polecenia jako argumenty wiersza poleceń, więc oznacza to „bajty jednostkowe” i „print”, więc drukuje tablicę partycji i używa bajtów jako rozmiar uint.)

Spowoduje to wydrukowanie partycji. Powiedz, że twoja partycja zaczyna się od 54525952, a następnie tworzysz urządzenia blokujące sprzężenie zwrotne losetup.

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

losetupmówi na przykład, który program wybrał /dev/loop0. Teraz możesz użyć resize2fs:

resize2fs /dev/loop0

i na koniec usuń urządzenie pętli

losetup -d /dev/loop0
larsr
źródło
2

Najlepsze znalezione rozwiązanie znajduje się tutaj:

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

Myślę, że to, co powiedział @Cesesium, pochodzi z powyższego oficjalnego linku

Mam nadzieję, że to pomoże.

3 kroki:

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

2.GParted live cd to resize

3.reboot and use os tools to resize
Kamil
źródło
Dziękuję za prostą odpowiedź. Pracowałem dla mnie na 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);

}

Ten prosty program dodaje N bajtów na końcu obrazu wirtualnego. Użyłem obrazu partycji Paragon dla Windows XP do scalenia nowo utworzonych obrazów. Działa tutaj OK.

Ilian Zapryanov
źródło
Nieużywana funkcja statyczna „auxfilesize”, „aux_copyNBytesFromTo”. Dlaczego to powinno pomóc?
AB
Nie używany? Nie rozumiem pytania. Oba są używane.
Ilian Zapryanov
Rezultatem są nieprzydzielone bajty i nowy dysk twardy do systemu operacyjnego. Musisz go sformatować. Jeśli pytasz, dlaczego foo-y są statyczne. Właśnie uratowałem mi prototypy i dlaczego nie. To prosty program napisany w 2 minuty w wolnym czasie :) Nic specjalnego ani optymalnego.
Ilian Zapryanov
3
Mogłeś wykorzystane istniejące narzędzia, takie jak ddalbo truncate...
rudimeier