Як змінити розмір диска віртуальної машини?


23

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

Відповіді:


27

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

Тепер завантажте!

Для отримання додаткової інформації: man virt-resize


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

1
Або ви можете просто використовувати mv замість cp для першої команди. Крім економії місця на диску, цей спосіб також буде значно швидше.
Кевін Кін

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

1
А у virt-resize навіть є симпатичний нюх, що розвивається.
Девід Макнейл

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

Ви абсолютно МОЖЕТЕ возитися із змонтованою перегородкою
ефірний

4

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

Припустимо, у вас є файл disk.imgіз зображенням диска, тобто він має таблицю розділів та один або кілька розділів, і скажіть, що ви хочете зробити останній розділ більшим. Що ви повинні зробити, це зробити

1) зробіть увесь файл більшим, скажімо, 4GiB. Швидкий спосіб зробити це - використовувати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може приймати команди як аргументи командного рядка, тому це означає "одиничні байти" та "друк", тому вона друкує таблицю розділів і використовує байти як розмір утиліти.)

Це виводить початок і закінчення розділу. Скажіть, що ваш розділ починається з 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 для Windows XP. Тут працює добре.


Невикористана статична функція "auxfilesize", "aux_copyNBytesFromTo". Чому це повинно допомагати?
AB

Невикористаний? Я не розумію питання. Вони обидва використовуються.
Іліан Запрянов

Результат - нерозподілений байт та новий жорсткий диск до ОС. Ви повинні відформатувати його. Якщо ви запитуєте, чому foo-s статичні. Це просто врятувало мене прототипи, а чому ні. Це проста програма, написана за 2 хвилини у вільний час :) Нічого особливого чи оптимального.
Іліан Запрянов

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