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


23

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

Ответы:


27

На дистрибутиве на основе 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


3
Вместо того , чтобы сделать резервную копию на последнем этапе (если изображение является большим , и вы не хотите / не имеют дополнительное дисковое пространство) , вы можете просто сделать virsh edit virt_nameи изменить путь к источнику диска на новый. Тогда , если он не работает, просто изменить его обратно и попробуйте еще раз. Нет особого смысла в том, чтобы иметь 3 изображения, когда вы могли бы сделать это с 2.
Майк

1
Или вы могли бы просто использовать мв вместо ф для первой команды. Помимо экономии дискового пространства, он также будет значительно быстрее , таким образом.
Кевин Keane

6
Важно отметить, что даже если исходное изображение имеет тип, конечный экземпляр будет rawтипом. если вы хотите сохранить qcow2тип экземпляра , вы должны применить преобразование, например:qemu-img convert -O qcow2 /var/lib/libvirt/images/outdisk /var/lib/libvirt/images/outdisk.qcow2
logoff

1
И вирт изменение размера даже имеет симпатичный Ncurses прогресс кок.
Дэвид Макнейл

18

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

Вам нужно сделать 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

Спасибо за быстрый ответ. Похоже , что жизнеспособное решение. Я не буду в городе несколько дней, но как только я вернусь в офис на следующей неделе, я попробую и сообщу, если это сработает.
Тонг Ван

1
Еще один вопрос: если я хочу , чтобы уменьшить диск, я выполняю шаги в обратном порядке? Как: 1. уменьшить файловую систему; 2. сжать раздел; 3. уменьшить изображение диска. Правильно?
Тонг Ван

Да, resize2fs может как уменьшаться, так и увеличиваться, но ему, очевидно, потребуется достаточно свободного места в файловой системе. При сокращении раздела я ошибся, оставив немного больше, чем необходимо, чтобы вы случайно не отрубили конец файловой системы :)
Cesium

Вы абсолютно МОЖЕТЕ связываться со смонтированным разделом
etherous

4

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

Предположим, у вас есть файл 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

2

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

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

Спасибо за простой ответ. Работал для меня в Ubuntu 16.04
Фил,

-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);

}

Эта простая программа добавляет N байтов в конец виртуального образа. Я использовал Paragon Partition изображение для Windows XP, чтобы объединить вновь созданные образа. Работы OK здесь.


Неиспользуемая статическая функция 'auxfilesize', 'aux_copyNBytesFromTo'. Почему это должно помочь?
AB

Неиспользованный? Я не понимаю вопроса. Они оба используются.
Илиан Запрянов

Результатом являются нераспределенные байты и новый жесткий диск для ОС. Вы должны отформатировать это. Если вы спрашиваете, почему foo-ы статичны. Это просто спасло меня от прототипов и почему бы и нет. Это простая программа, написанная за 2 минуты в свободное время :) Ничего особенного или оптимального.
Илиан Запрянов

3
Вы могли бы использовать существующие инструменты, такие как ddили truncate...
rudimeier
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.