Как изменить размер диска виртуальной машины?

Есть ли способ изменить размер диска виртуальной машины? Скажем, увеличение размера диска с 32 до 64 ГБ. Я использую KVM / Qemu на сервере Ubuntu 11.10 64bit. Спасибо.

23
задан 24 February 2012 в 17:58

5 ответов

На базирующемся дистрибутиве Debian необходимо использовать virt-resize вместо этого. Этот дескриптор в значительной степени все под капотом теперь. Давайте предположим, что Ваше изображение называют Win7 (почему нет?). Первая вещь удостоверяется, что Ваш VM закрывается:

Установите инструмент:

# apt-get install libguestfs-tools

Получите местоположение своего диска VM:

# 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

Теперь загрузитесь!

Для большего количества информации: человек virt-изменяет-размер

27
ответ дан 24 February 2012 в 17:58

Я думаю, что ответ Цезия прекрасен, я был бы точно так же, как для записи некоторых других команд для достижения того же самого.

Предположите, что у Вас есть файл disk.img с образом диска, т.е. это имеет таблицу разделов и один или несколько разделов, и скажите, что Вы хотите сделать последний раздел больше. То, что необходимо сделать, к

1) сделайте целый файл больше, скажите 4 ГиБ. Быстрый способ сделать это состоит в том, чтобы использовать dd

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

2) сделайте раздел большим использованием fdisk (мне жаль, что я не мог выполнить, это разошлось или некоторый более хороший инструмент... Кто-либо?)

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 это выбрало, например /dev/loop0. Теперь можно использовать resize2fs:

resize2fs /dev/loop0

и наконец удалите циклическое устройство

losetup -d /dev/loop0
4
ответ дан 24 February 2012 в 17:58
#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 в конец виртуального изображения. Я использовал Образцовое изображение раздела для Windows XP для слияния недавно созданных изображений. Работы хорошо здесь.

-1
ответ дан 24 February 2012 в 17:58

Лучшее решение найдено здесь:

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

[ 114] Я думаю, что то, что сказал @Caesium, дано по приведенной выше официальной ссылке

Надеюсь, это поможет.

3 шага:

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

2.GParted live cd to resize

3.reboot and use os tools to resize
0
ответ дан 24 February 2012 в 17:58

Я рекомендую, прежде чем делать что-либо из этого, взять полную копию образа диска, как есть, затем, когда все сломается, вы можете скопировать его обратно, чтобы начать все сначала.

Есть 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
0
ответ дан 24 February 2012 в 17:58

Другие вопросы по тегам:

Похожие вопросы: