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

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

Я потратил много часов на поиски в Интернете информации о том, как сжать образы виртуальных дисков KVM, особенно для гостевых систем Windows, но безуспешно.

Все, что я нашел, — это обнулить свободное пространство виртуальной машины, дефрагментировать виртуальный диск (из Windows), а затем запустить qemu-img convert -c ...( -cфлаг для сжатия).

У меня есть виртуальная машина Windows 7 с размером виртуального диска 100 ГБ. Изначально этот VDD тратит 40 ГБ на хранилище хоста. После обнуления VDD съедает настоящие 100 ГБ на хосте. И qemu-img -c ...создает 91 ГБ, что совсем не то, что я ожидал.

На сайте modernie мы можем скачать виртуальные машины W7 размером менее 10 ГБ, как это возможно? Есть ли способ "действительно" сжать образы виртуальных машин?


Спасибо @dyasny, я сделал небольшой тест с virt-sparsity. Я очистил диск виртуальной машины W7, отключил спящий режим, поэтому VDD потребляет всего 20 ГБ. Снова ухудшил диск и снова запустил sdelete -z. Запуск virt-sparsityс --compressфлагом дает виртуальный диск на 80 ГБ. Далеко не то, на что я надеялся.


EDIT-2016-02-16: "Освежаю" этот вопрос, потому что обсуждаемый здесь метод сжатия виртуальной машины очень эффективен, но имеет существенный недостаток: он удаляет все снимки виртуальной машины. Если кто-то знает, как сжать виртуальную машину, сохраняя снимки, не стесняйтесь поделиться!

решение1

Чтобы уменьшить размер гостевой ОС Windows, необходимо уменьшить размер раздела внутри гостевой ОС, завершить работу виртуальной машины, создать новый диск меньшего размера нужного размера, скопировать данные со старого диска на новый диск меньшего размера, поменять имена дисков и перезагрузить виртуальную машину.

Это просто, но если сделать это неправильно, можно потерять данные и волосы.

Ниже приведены шаги для KVM с гостевой ОС Windows Server 2012 объемом 100 ГБ, которую мы хотим сжать до 35 ГБ, используя формат QCOW2.

ВАЖНЫЙ: Этот метод включает в себябез модификации виртуальной машиныопределение. Вместо этого требуется толькоманипуляции с образами дисков.

Предположения для гостя:

  • Гость — Windows Server 2012
  • Образ диска 100 ГБ в формате QCOW2
  • Два раздела:
    • 350 МБ загрузки
    • 99,6 ГБ на диске C: с 20 ГБ занятого пространства
  • Мы хотим уменьшить размер диска C: с 99,6 ГБ до 34 ГБ.

Предположения для Хоста:

  • Ubuntu 16 LTS-сервер
  • KVM (libvirt)
  • Диск 250 ГБ
  • Виртуальные образы расположены в /var/lib/libvirt/images

ШАГ 1: Подготовка гостевой ОС Windows, усадка основного раздела C:

На этом шаге мы просто уменьшим наши разделы Windows напрямую из Windows. Полученный образ диска в конце этого шага будет суммой загрузочного раздела, диска C: (уменьшенного) и оставшегося неиспользуемого пространства, которое мы удалим (не копируя его на новый диск).

  1. Войдите в систему Windows Guest.
  2. Откройте утилиту «Управление компьютером», воспользовавшись функцией поиска в меню «Пуск», чтобы найти ее.
  3. С левой стороны нажмите «Хранилище->Управление дисками».Скриншот управления дисками хранения
  4. На новом экране щелкните правой кнопкой мыши раздел C:, выберите «Сжать том…», это должно занять некоторое время, прежде чем появится диалоговое окно. Будьте терпеливы.
  5. После появления диалогового окна «Сжать C:» введите объем пространства в поле «Объем пространства для сжатия», чтобы значение «Общий размер после сжатия в МБ» приблизилось к желаемым 35 ГБ. Затем нажмите «Сжать».

    ПРИМЕЧАНИЕ: Вы можете получить сообщение об ошибке, если новое пространство слишком мало, в этом случае вам следует уменьшить «Объем пространства для сжатия» на 1 ГБ постепенно, пока ошибка не исчезнет и не произойдет сжатие. На практике мы предпочитаем оставлять 10 ГБ свободного пространства.

    Предположим, вам удалось уменьшить раздел C: до 34 ГБ.

  6. После этого завершите работу виртуальной машины, открыв командную строку и введя:shutdown /s /t 0

  7. Ваша гостевая система Windows готова.

ШАГ 2: Уменьшение размера диска на хосте виртуальной машины

На самом деле эта процедура не является сжатием, вместо этого мы создадим новый диск (окончательного размера), на который скопируем два раздела с исходного диска и пропустим перенос неиспользуемого пространства.

Цель состоит в том, чтобы создать диск, общий размер которого = загрузочный раздел + раздел C:. У нас также останется немного свободного места (если только ваши расчеты не идеальны), о котором не стоит беспокоиться, поскольку мы разберемся с этим на последнем этапе.

  1. Войдите в систему Linux-хоста.
  2. переключиться на суперпользователя:sudo su
  3. перейдите туда, где хранятся виртуальные образы:cd /var/lib/libvirt/images
  4. список файлов:ls -l
  5. Найдите ваш гостевой образ (много руководств по этому вопросу в другом месте). Предположим, что наш гостевой образ Windows называется «windows.qcow2»
  6. делаем резервную копию:

    mkdir backup
    cp windows.qcow2 backup/windows.qcow2.bak
    

    (выпей кофе, потому что для большого диска это займет некоторое время)

  7. установите пакеты guestfs, которых вам может не хватать:

    apt-get install libguestfs-tools
    
  8. Хорошо, давайте еще раз проверим наш диск Windows, изучив образ Windows с помощью virt-filesystems:

    virt-filesystems --long --parts --blkdevs -h -a windows.qcow2
    

    что выводит это:

    Name       Type       MBR  Size  Parent 
    /dev/sda1  partition  07   350M  /dev/sda
    /dev/sda2  partition  07   34G   /dev/sda
    /dev/sda   device     -    100G  -
    

    Обратите внимание, что у нас есть /dev/sda1загрузочный раздел Windows размером 350 МБ, /dev/sda2раздел C: размером 34 ГБ, а общий размер образа диска /dev/sda/составляет 100 ГБ, что оставляет нам кучу места для обрезки.

    Итак, вот важный шаг: посчитайте: 34 G + 350M помещается в 35 G, поэтому мы собираемся создать образ на 35 ГБ. У нас неизбежно останется некоторое оставшееся пространство – если только ваши расчеты не идеальны – но не беспокойтесь об этом, мы разберемся с этим ниже.

  9. Давайте создадим новый виртуальный диск QCOW2, который мы называем newdisk.qcow2общим размером 35 ГБ:

    qemu-img create -f qcow2 -o preallocation=metadata newdisk.qcow2 35G
    

    что выводит:

    Formatting 'newdisk.qcow2', fmt=qcow2 size=37580963840 encryption=off cluster_size=65536 preallocation=metadata lazy_refcounts=off refcount_bits=16`
    
  10. Давайте изменим размер диска, скопировав старый диск на новый выделенный. Это та часть, которая абсолютно потрясающая. Большинство других руководств показывают какие-то ужасно сложные вещи. Это просто делается этой командой, после чего вам следует пойти выпить еще кофе — это, скорее всего, займет некоторое время:

    virt-resize windows.qcow2 newdisk.qcow2`
    

    что выводит это:

    [   0.0] Examining windows.qcow2
    100% ?¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦? --:--
    **********
    Summary of changes:
    /dev/sda1: This partition will be left alone.
    /dev/sda2: This partition will be left alone.
    There is a surplus of 439.8M.  An extra partition will be created for the surplus.
    **********
    [   8.8] Setting up initial partition table on newdisk.qcow2
    [   9.9] Copying /dev/sda1
    100% ?¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦? 00:00
    [  15.1] Copying /dev/sda2
    100% ?¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦? 00:00
    Resize operation completed with no errors.  Before deleting the old disk, carefully check that the resized disk boots and works correctly.
    

    Обратите внимание, что инструмент обнаружил избыток места... вспомните комментарии о Math... Так что вы можете отменить это и заново создать диск или просто продолжить, как мы это делаем здесь, и расширить раздел, sda2как это делается на ШАГЕ 3.

  11. После этого проверьте полученное изображение:

    virt-filesystems --long --parts --blkdevs -h -a newdisk.qcow2
    

    что выводит это:

    Name       Type       MBR  Size  Parent
    /dev/sda1  partition  07   350M  /dev/sda
    /dev/sda2  partition  07   34G   /dev/sda
    /dev/sda3  partition  83  439.8M   /dev/sda
    /dev/sda   device     -    35G  -
    

    Обратите внимание, что тип — /dev/sda3это тип linux для оставшегося пространства. Оставшееся пространство в порядке, если только вы не сделали свои расчеты совершенно правильно. Мы разберемся с этим дополнительным разделом из гостевой системы Windows ниже. Прямо сейчас просто проигнорируйте его.

  12. Поменять местами образы дисков:

    mv windows.qcow2 backup/
    mv newdisk.qcow2 windows.qcow2
    
  13. Запустите виртуальную машину.

ШАГ 3: Завершение операции с диском в гостевой ОС Windows

На этом этапе мы убеждаемся, что Windows загружается нормально, и расширяем раздел C на дополнительное пространство.

  1. Войдите в гостевую систему Windows.

  2. Откройте утилиту «Управление компьютером», воспользовавшись функцией поиска в меню «Пуск», чтобы найти ее.

  3. С левой стороны нажмите «Хранилище->Управление дисками».

  4. Вы должны увидеть 3 раздела: загрузочный, C: и небольшой раздел размером 439 МБ (крайний справа).Скриншот окна «Управление компьютером», показывающий 3 раздела

  5. Удалите раздел Linux, щелкнув правой кнопкой мыши -> удалить том. (нажмите «да» на все запросы)

  6. Щелкните правой кнопкой мыши по разделу C: и щелкните «Расширить», затем «Далее» и «ОК» в диалоговых окнах. Он должен предложить расширить только на размер последнего раздела. После этого вы измените размер C: и у вас останется только два раздела.

  7. Вот и все. Ваш гостевой Windows теперь использует всего 35 ГБ или около того. Помните, что реальный образ диска может быть больше (он может быть ближе к 38 ГБ) из-за всех накладных расходов и т. д.

Проверьте, что все работает нормально, и удалите резервные копии образов или переместите их в автономное хранилище.

решение2

Мне наконец удалось действительно уменьшить пространство виртуальной машины. В начале виртуальная машина W7 съедала 107 ГБ на хостовом хранилище. Размер виртуального жесткого диска составляет 100 ГБ, и в настоящее время виртуальная машина съедает только 18 ГБ своего виртуального хранилища.

Вот что я сделал:

  1. Очистите виртуальный диск (удалите временные файлы и т. д.)
  2. Дефрагментируйте с помощью программного обеспечения UltraDefrag с открытым исходным кодом и «полной оптимизацией»
  3. Бегатьsdelete -c c:
  4. Бегатьsdelete -z c:
  5. Бегатьqemu-img convert -c -f qcow2 w7-64.qcow2 -O qcow2 w7-64-compressed.qcow2

Таким образом, файл qcow2 был сжат со 107 ГБ до...7 ГБ!

решение3

При запуске qemu-img -cвы сжимаете изображение, что, хотя и позволяет уменьшить пространство, может сильно повредить производительности. Если вы хотите дедуплицировать нули на диске, вам нужно запустить qemu-img convert, в основном так, как будто вы пытаетесь преобразовать изображение из одного формата в другой (даже если форматы src и dst одинаковы).

Этот процесс запишет новый преобразованный образ без нулей, эффективно дедуплицируя обнуленное пространство на диске.

Другим вариантом было бы просто использовать, virt-sparsifyконечно.

решение4

В Xenial и Bionic утилита virt-sparsifyиз пакетаlibguestfs-инструментыДолжно работать. Обратите внимание, что:

  • Вам НЕ НУЖНО sdeleteзаранее запускать какой-либо инструмент внутри гостевой ОС (но это не повредит)
  • Вы можете использовать этот --in-placeфлаг, чтобы освободить место без копирования файла (полезно, если образ диска уже больше оставшегося свободного места на вашем диске!)
  • Инструмент поддерживает изображения в форматах qcow2 и raw.

Связанный контент