Odpowiedzi:
W dystrybucji opartej na Debianie powinieneś użyć virt-resize
zamiast 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.img
w 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, mv
jeś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
raw
typem. jeśli chcesz zachować np. qcow2
typ, powinieneś zastosować konwersję:qemu-img convert -O qcow2 /var/lib/libvirt/images/outdisk /var/lib/libvirt/images/outdisk.qcow2
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
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.img
z 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, p
aby 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 d
i podaj numer partycji do usunięcia. (Łyk!)
Wpisz n
i 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, w
aby 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
( parted
moż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
losetup
mó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
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
#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.
dd
albo truncate
...
virsh edit virt_name
i 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.