Ответы:
На дистрибутиве на основе Debian вы должны использовать virt-resize
вместо этого. Эта ручка в значительной степени все под капотом сейчас. Давайте предположим , что ваш образ называется Win7 (почему нет?). Первое , что делают , что ваш VM выключен:
Установите инструмент:
# apt-get install libguestfs-tools
Получить местоположение вашего диска виртуальной машины:
# 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" />
Вы , возможно , придется адаптироваться /var/lib/libvirt/images/Win7.img
в следующем:
# 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 -
Создать свой диск 64G:
# truncate -s 64G /var/lib/libvirt/images/outdisk
Вам нужно будет развернуть / dev / sda2 (не загрузочный раздел):
# 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.
Сделайте резервную копию на всякий случай (или используйте, mv
если вы не хотите, чтобы резервная копия):
# 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
Теперь придачу!
Для большей информации: man virt-resize
raw
типом. если вы хотите сохранить qcow2
тип экземпляра , вы должны применить преобразование, например:qemu-img convert -O qcow2 /var/lib/libvirt/images/outdisk /var/lib/libvirt/images/outdisk.qcow2
Я рекомендую, прежде чем делать какие-либо из этого вы берете полную копию образа диска, как это, тогда, когда все это рассыпается вы можете скопировать его обратно, чтобы начать снова.
Вам нужно сделать 3 вещи:
1) Сделать образ диска больше. В вашей машине:
qemu-img resize foo.qcow2 +32G
Теперь ваш гость может увидеть больший диск, но до сих пор старые разделы и файловые системы.
2) Увеличьте размер раздела внутри образа диска. Вам нужно загрузиться с LiveCD в ваших гостях для этого, так как вы не сможете связываться с смонтированным разделом. Это довольно сложная и, возможно, самая опасная часть. Копировать здесь довольно много, поэтому я просто покажу ссылку. Вы хотите сделать что-то вроде этого:
http://www.howtoforge.com/linux_resizing_ext3_partitions_p2
ИЛИ 2b) создание нового раздела будет проще (и безопаснее), если вы просто хотите больше места для хранения. Используйте fdisk или cfdisk, или все, что вам удобно - вы должны увидеть целую кучу нераспределенного пространства на вашем гостевом диске.
3) Наконец, если вы изменили размер существующего раздела, сделайте файловую систему внутри нового большего раздела больше (это на самом деле в руководстве, связанном выше). Внутри вашего гостя:
resize2fs /dev/sda1
Я думаю, что ответ Цезия в порядке, я просто хотел бы написать некоторые другие команды, чтобы добиться того же.
Предположим, у вас есть файл disk.img
с образом диска, то есть он имеет таблицу разделов и один или несколько разделов, и скажите, что вы хотите увеличить размер последнего раздела. Что вам нужно сделать, это
1) сделать весь файл больше, скажем 4GiB. Быстрый способ сделать это - использоватьdd
dd if=/dev/zero of=disk.img bs=1c seek=4G count=0
2) сделать раздел больше с помощью fdisk (хотелось бы, чтобы это делалось с помощью parted или более приятного инструмента ... Кто-нибудь?)
fdisk disk.img
Введите p
команду для распечатки таблицы разделов и найдите начальный сектор вашего раздела, например, раздел 2 начинается с сектора 106496.
Что вы будете делать, это удалить этот раздел из таблицы разделов и создать новый раздел, который начинается в том же секторе, но заканчивается в более позднем. Тогда раздел будет содержать действительную файловую систему.
Введите d
и укажите номер раздела для удаления. (Глоток!)
Введите n
и дать нужный номер раздела, а затем начальный сектор. Вы должны использовать один и тот же начальный сектор, который был использован ранее. Наконец, укажите конечный сектор или просто позвольте fdisk выбрать самый высокий сектор, который вы можете использовать.
Введите w
запись изменений в файл образа диска и выйдите из fdisk.
3) Теперь вам нужно изменить размер файловой системы. Для этого вам понадобится смещение (= положение) файловой системы внутри образа диска. Вы можете вычислить это из номера сектора, если вы знаете размер сектора (который обычно составляет 512), или вы можете использоватьparted
parted disk.img u b p
( parted
Может принимать команды в качестве аргументов командной строки, так что это означает «блок байтов» и «печать», поэтому она печатает таблицу разделов и использует байты как размер UINT.)
Это распечатывает раздел начинается и заканчивается. Скажите , что ваши старты разделов на 54525952, то вы делаете петлевой блочные устройства с losetup
.
losetup -f --show -o 54525952 disk.img
losetup
скажет вам, какого разработчика он выбрал, например /dev/loop0
. Теперь вы можете использовать resize2fs
:
resize2fs /dev/loop0
и, наконец, удалить устройство петли
losetup -d /dev/loop0
Лучшее найденное решение здесь:
http://www.linux-kvm.com/content/how-resize-your-kvm-virtual-disk
Я думаю, что сказал @Caesium дается из приведенной выше официальной ссылки
Я надеюсь, это поможет.
3 шага:
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);
}
Эта простая программа добавляет N байтов в конец виртуального образа. Я использовал Paragon Partition изображение для Windows XP, чтобы объединить вновь созданные образа. Работы OK здесь.
dd
или truncate
...
virsh edit virt_name
и изменить путь к источнику диска на новый. Тогда , если он не работает, просто изменить его обратно и попробуйте еще раз. Нет особого смысла в том, чтобы иметь 3 изображения, когда вы могли бы сделать это с 2.