illumium.org

Главная › Блоги › Блог kayo

Виртуализуемся с Qemu

kayo — Чт, 31/05/2012 - 16:31

Виртуальные машины, вне всяких сомнений, очень важная и полезная вещь для разработчика приложений. Чтобы поддерживать в своих продуктах широкий спектр платформ, без тестирования и отладки кода на всех них вряд ли как-то обойтись. Особенно это актуально при создании WEB-приложений, способных работать в различных браузерах и их версиях на многих операционных системах.

Речь пойдёт об использовании в целях виртуализации Qemu или Kvm, лучшего по мнению автора решения для виртуализации.

Почему Qemu

Мне приходилось иметь дело с различными виртуальными машинами, не буду описывать их достоинства и недостатки, расскажу здесь о том, почему лучшим выбором для меня является Qemu или Kvm.

Qemu весьма продвинутая в плане возможностей вещь, вместе с тем довольно таки простая и послушная в управлении.

Работа с образами

Родной формат образов жестких дисков Qemu называется Qcow2. Образ в данном формате имеет нефиксированный размер, увеличивающийся в процессе выполнения операций записи. Технология работает на «железном» по отношению к гостевой операционной системе уровне, поэтому никак не ограничивает выбор файловых систем.

Многие люди не используют Qcow2 поскольку raw образы можно монтировать базовыми средствами и работать с ними напрямую. Однако, образы Qcow2 тоже можно монтировать с использованием модуля ядра nbd.

Снимки (Snapshots)

Эта особенность связана с устройством Qcow2 и заключается в возможности зафиксировать некий образ в текущем состоянии, а дальнейшие изменения производить уже в другой постоянный или временный образ.

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

Различные архитектуры

Qemu умеет эмулировать, наверно, самый обширный спектр аппаратных архитектур среди всех прочих виртуальных машин. На нём, кстати, запускаются образы мобильных операционных систем. Например, в средствах разработки для Android самизнаетекого.

С другой стороны, сам Qemu способен работать на не меньшем числе аппаратных архитектур и операционных систем в том числе на мобильных устройствах, как бы это ни «ломало» для некоторых «шаблон».

Нескучная практическая часть

Достоинства Qemu можно перечислять долго, так что самое время перейти к практике.

Создание базового образа

Итак, нет ничего проще:

$ qemu-img create -f qcow2 base.qcow2 10G
Formatting 'test.qcow2', fmt=qcow2 size=10737418240 encryption=off cluster_size=65536
$ du -skh test.qcow2
136K	test.qcow2

Мы создали образ base.qcow2, который может иметь максимальный размер 10G. Однако, пока он пуст и занимает всего 136K места в нашей файловой системе.

Если у нас нет уже готового образа нужной нам операционной системы в самом что ни на есть девственном виде, то придётся сделать его самостоятельно, взяв имеющийся образ с установщиком:

$ kvm -m 512M -hda base.qcow2 -cdrom guess.iso -boot d

Здесь я использовал команду kvm вместо qemu, потому что в моём дистрибутиве таким образом задействуется функционал виртуализации ядра, ускоряющий работу виртуальной машины с аналогичной хост-системе архитектурой.

Виртуальная машина загрузит установщик с образа guess.iso, которому будет доступен наш базовый образ base.qcow2. Я выделил машине 512M оперативной памяти, а опция -boot с параметров d заставляет загружаться с устройства cdrom. Делаем там всю грязную работу по установке операционной, или вообще находим готовый подходящий образ в «доверенном источнике».

Тюнинг гостевой системы

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

Главное, что нужно сделать, это отучить операционку срать ненадлежащим образом использовать наш образ. Отключаем все возможные свопы/подкачки/или что там у вас, временные каталоги типа /tmp переводим куда-нибудь в другой раздел.

Например, можно создать отдельный образ temp.qcow2 аналогично базовому, а затем подключить его как второй винчестер:

$ qemu-img create test-temp.qcow2 1G
Formatting 'test-temp.qcow2', fmt=raw size=1073741824
$ kvm -m 512M -hda base.qcow2 -hdc temp.qcow2

Теперь форматируем новый образ в гостевой системе, подключаем и переводим туда все склонные к избытку холестерина каталоги.

Если сравнить объём занятого операционной системой места с объёмом образа, то почти наверняка последний будет больше где-то порядка на 15-25%. Это нормально, но суровые оптимизаторы обязаны это недоразумение исправить. Я просто создал ещё один такой же пустой базовый образ, отформатировал его в гостевой операционной системе и скопировал все файлы с исходного образа, после чего установил на него системный загрузчик. Новый образ получился уже значительно меньше предшественника, пробуем загрузиться с него, если всё в порядке, то первоначальный можно упокоить с миром.

Подключение образа Qcow2

С копированием файлов то всё понятно, а вот с переносом загрузчика бывает далеко не всё так просто, а зачастую самым тривиальным решением может оказаться использование dd. Это первый случай, когда нам может потребоваться работать с образом гостевой системы как с устройством.

Нам потребуется модуль ядра nbd:

$ sudo modprobe nbd max_part=12
$ ls -al /dev/nbd*
brw-rw---T 1 root disk 43,   0 Май 31 22:36 /dev/nbd0
…

Так мы подключили модуль, затребовав 12 разделов, готовых к связыванию с конечными сетевыми устройствами. Теперь осталось превратить наш образ в одно из таких устройств и подключить к одному из разделов:

$ sudo qemu-nbd -c /dev/nbd0 $PWD/base.qcow2
$ ls -al /dev/nbd0*
brw-rw---T 1 root disk 43, 0 Май 31 23:05 /dev/nbd0
brw-rw---T 1 root disk 43, 1 Май 31 23:05 /dev/nbd0p1

Как видим, появилось ещё одно устройство, это наш первичный раздел, можно делать с ними обоими, как если бы они были обычными устройствами, вот так просто это работает, и никаких петель. Например, просто примонтируем файловую систему первичного раздела:

$ mkdir base
$ sudo mount /dev/nbd0p1 base

Отключить образ можно, когда все его разделы отмонтированы, командой:

$ sudo qemu-nbd -d /dev/nbd0 
/dev/nbd0 disconnected
$ ls -al /dev/nbd0*
brw-rw---T 1 root disk 43, 0 Май 31 23:05 /dev/nbd0

Устройство снова одно.

Особенности крионики снимков

Когда базовый образ готов, самое время его «заморозить». Делаем его доступным только для чтения, ведь больше мы его менять никогда не будем. Теперь создадим новый образ, но совсем не такой как раньше:

$ qemu-img create -f qcow2 -b base.qcow2 variant.qcow2
Formatting 'variant.qcow2', fmt=qcow2 size=10737418240 backing_file='base.qcow2' encryption=off cluster_size=65536
$ du -skh variant.qcow2 
136K	variant.qcow2

Новый образ унаследован от базового, теперь при работе с ним чтение происходит либо из базового, либо с него, а запись только в него. Теперь мы можем загрузиться с этого нового образа и внести какие-то изменения, чтобы получить первый вариант конфигурации виртуальной системы. Аналогично можно создать любое число подобных образов, имеющих в качестве основы один базовый.

А можно пойти ещё дальше, нарастив глубину наследования, в зависимости от потребности в конкретных конфигурациях, главное не забывать всякий раз «замораживать» образ, который будет использоваться в качестве базы, чтобы предотвратить любую возможность его изменения, в противном случае наследующие образы могут оказаться некорректными.

Рекомендую вам по окончании настройки замораживать вообще все образы, чтобы всегда иметь чистые конфигурации, но чтобы загрузить виртуальную машину с такими образами нам потребуется режим снимка:

kvm -m 512M -hda variant.qcow2 -hdc temp.qcow2 -shapshot

При запуске машины таким образом все операции записи будут производиться во временный снимок, который, кстати, при желании можно и сохранить, воспользовавшись консолью Qemu.

Вместо заключения

В статье я попытался описать все аспекты своей работы с Qemu, который считаю действительно мощным и простым в использовании комбайном виртуализации широкой области применения.

Если что-то забыл или пропустил, потом добавлю.

  • kvm
  • qemu
  • Бортовой журнал Иллюмиума

Спасибо за статью, мне

Роман (не проверено) — Сб, 23/03/2013 - 13:08

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

по поводу заморозки образа. Это хорошая идея сделать основную систему только для чтения дабы была более устойчива.

swap, tmp можно скинуть на другой диск ? и даже не на образ а на раздел даже с реальной машины. пусть вместе пользуют можно так ? home тоже придется перенести и /var/log ?

а можно ли заморозить винду ?

  • ответить

Да, tmp я обычно со

kayo — Пнд, 01/04/2013 - 14:32

Да, tmp я обычно со специального образа и подключаю, чтобы в любой момент можно было безопасно место высвободить.

А swap на виртуальной машине имеет смысл лишь в том случае, когда вы ресурсы на сторону выделяете, для личных виртуалок не вижу в нём смысла.

«Заморозить» можно всё, что угодно, это же на низком «аппаратном» уровне по отношению к гостевой системе делается.

We used to be in Love…
  • ответить

Отличия в производительности

Href (не проверено) — Ср, 10/04/2013 - 18:04
Отличия в производительности по сравнению с Virtualbox/VMware есть какие-нибудь?
  • ответить

VMWare не пробовал, а в

kayo — Сб, 13/04/2013 - 18:46
VMWare не пробовал, а в сравнении с VirtualBox, KVM заметно быстрее.
We used to be in Love…
  • ответить

Отправить комментарий

Содержимое этого поля является приватным и не будет отображаться публично.
  • Доступные HTML теги: <a> <em> <strong> <cite> <code> <ul> <ol> <li> <dl> <dt> <dd>
  • Syntax highlight code surrounded by the {syntaxhighlighter SPEC}...{/syntaxhighlighter} tags, where SPEC is a Syntaxhighlighter options string or "class="OPTIONS" title="the title".

Подробнее о форматировании

CAPTCHA
Этот вопрос задается для того, чтобы выяснить, являетесь ли Вы человеком или представляете из себя автоматическую спам-рассылку.
  _     ____         __   __  _____   _____ 
| |_ | _ \ ___ \ \ / / |_ _| |___ |
| __| | |_) | / __| \ V / | | / /
| |_ | __/ \__ \ | | | | / /
\__| |_| |___/ |_| |_| /_/
Введите код, изображенный в стиле ASCII-арт.
RSS-материал

Навигация

  • Подшивки
  • Фотоальбомы

«Иллюмиум» на якоре.

Работает на Drupal, система с открытым исходным кодом.

(L) 2010, Illumium.Org. All rights reversed ^_~