Работа с qemu-kvm

  1. О чём эта статья? В посте описывается работа с виртуальными машинами при помощи эмулятора qemu.
  2. Зачем это нужно, если уже есть ряд фронтендов разного уровня (libvirt, Proxmox, RHEV итд)? В любом случае фронтенды вынуждены вызывать qemu с множеством опций, поэтому в некоторых случаях (тестирование новых возможностей, отладка, развлечение) намного приятней и понятней работать непосредственно с qemu. Кроме того знания полезны для общего развития и понимания работы систем.
  3. Как связаны qemu и технология KVM? Qemu - эмулятор, который может работать и без KVM, но использование аппаратной виртуализации значительно ускоряет работу гостевых систем, поэтому KVM является предпочтительным вариантом.

Поехали!

Для начала стоит проверить, поддерживается ли аппаратная виртуализация вашим процессором. Для этого стоит убедиться что в параметрах камня имеется флаг vmx или svm (В зависимости от производителя Intel/AMD.)

$ egrep '^flags.*(vmx|svm)' /proc/cpuinfo

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

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

$ modprobe kvm
$ modprobe kvm-amd // Для процессоров Intel "modprobe kvm-intel"

Теперь можно использовать все прелести аппаратной виртуализации при помощи qemu. Например, для запуска liveCD на виртуальной машине вполне достаточно выполнить

$ qemu-kvm -enable-kvm -cdrom <path-to-ISO>

Работа с образами виртуальных машин

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

Создание образа диска

Новый образ диска создается при помощи опции create:

qemu-img create -f <формат> -o <опции> имя_образа размер_образа

Поддерживается несколько форматов образов виртуальных машин:

  • raw Файл содержащий точную копию диска, подключаемую к виртуальной машине.
  • qcow2 Формат записи образа вирт машины с поддержкой сжатия, снапшотов и шифрования. Кроме того qcow2 образ занимает столько места, сколько данных записано в него виртуальной машиной, вне зависимости от размера создаваемого при создании.
  • vdi Образ BM поддерживаемый VirtualBox.
  • vmdk Образ виртульных машин VMware.
  • И еще несколько (подробности в мане)

Для конвертации одного формата образа в другой используется опция convert:

qemu-img convert -f <исходный_формат> -O <конечный_формат> <исходный_файл> <конечный_файл>

Для того, чтобы просмотреть информацию об образе используется опция info

qemu-img info -f <формат> имя файл

Шаблоны и снимки состояния

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

Пусть уже создан образ arch.qcow2 с установленной операционной системой на нём. Для того, чтобы на его основе создать еще несколько образов необходимо воспользоваться командами

$ qemu-img create -f qcow2 -o backing_file=arch.qcow2 archnew1.qcow2
Formatting 'archnew1.qcow2', fmt=qcow2 size=5368709120 backing_file='arch.qcow2' encryption=off cluster_size=0
$ qemu-img create -f qcow2 -o backing_file=arch.qcow2 archnew2.qcow2
Formatting 'archnew2.qcow2', fmt=qcow2 size=5368709120 backing_file='arch.qcow2' encryption=off cluster_size=0

Теперь существуют три образа: arch.qcow2, archnew1.qcow2, archnew2.qcow2. При этом два последних не занимают на диске существенного места и ссылаются на первый. При запуске виртуальной машины из образа archnew1.qcow2 в этот файл будут записываться только изменения относительно базового образа.

Ниже приведен вывод команды qemu info для базового образа и diff файла:

$ qemu-img info arch.qcow2
image: arch.qcow2
file format: qcow2
virtual size: 2.0G (2147483648 bytes)
disk size: 585M
cluster_size: 65536

$ qemu-img info archnew1.qcow2
image: archnew1.qcow2
file format: qcow2
virtual size: 2.0G (2147483648 bytes)
disk size: 136K
cluster_size: 65536
backing file: arch.qcow2 (actual path: arch.qcow2)

Видно, что в файле archnew1.qcow2 прописан файл базового образа. Соответвенно при переименовании или отсутствии файла базового образа все системы, основанные на нем не смогут запуститься. Поэтому в некоторых случаях полезно создать однин файл, который объединяет в себе как информацию заложенную в базовом образе, так и отличия записанные в отдельном файле. Это можно сделать так

$ qemu-img convert archnew2.qcow2 -O qcow2 archnew3.qcow2

После этого файл archnew3.qcow2 будет содержать с себе информацию как из archnew2.qcow2 так и из базового образа на котором он основан (arch.qcow2).

$ qemu-img info archnew3.qcow2 
image: archnew3.qcow2
file format: qcow2
virtual size: 2.0G (2147483648 bytes)
disk size: 585M
cluster_size: 65536

Для управления базовыми образами и дополнениями, основаными на них, также может использоаться опция rebase. Описание работы этой опции я нашел только в рассылке разработчиков qemu http://www.mail-archive.com/qemu-devel@nongnu.org/msg21374.html.

qemu-img rebase -f <конечный формат> [-u] -b <новый_базовый_образ> -F <формат_базового_образа> конечный_файл

Без опции -u команда сравнивает базовые файлы (новый, который указан в команде, и старый, на котором основан конечный файл) и переписывает те изменения, которые гарантируют работоспособность системы с новым базовым файлом.

С опцией -u команда только перезаписывает имя базового файла не проверяя сохранение целостности информации. Эта опция полезна при переименовании базового образа и обновлении всех ссылок на этот файл в образах основаных на нём.

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

Снимки состояния системы в qcow2 образах

Для создания снапшотов необязательно работать с diff образами, как описано выше, можно пользоваться встроенной в qcow2 возможностью. Работа со снапшотами реализуется при помощи опции snapshot

qemu-img snapshot -l -[a|c|d] <имя_снапшота> <образ>

Опции понятны:

-l - список снапшотов
-a - возврат к записанному в снимке состоянию
-с - создание снапшота
-d - удаление

Запуск виртуальной машины - несколько полезных опции.

Читатели наверняка уже ждут не дождуться запуска виртуалной машины. Нет дальше смысла томить население. Итак, типичный пример

$ qemu-kvm -m 1024 -drive file=arch.qcow2,format=qcow2,media=disk,if=ide -drive file=somecd.iso,media=cdrom -boot c -soundhw ac97 -smp 2

И небольшой разбор по опциям:

-m <количество_памяти_в_Мб> - память для вирт машины
-drive file=<образ_диска>,format=<формат_образа>,media=<disk|cdrom>,if=<интерфейс подключения,ide по умолчанию>,snapshot=<on|off, вклбчение поддержки снапшотов> - подключение диска
-boot c - Порядок загрузки. (a,b - floppy,c - disk, d - cdrom)
-soundhw <тип звуковой карты> - подключение звуковой карты для вирт машины. Возможные варианты можно посмотреть при помощи опции -soundhw ?
-smp <кол-во виртуальных процессоров> - подробности можно прочитать в мануале. :)

При таком запуске некоторые вещи подключаются по умолчанию. Например видеокарта cirrus и sdl вывод изображения. Также автоматически подключается сетевой интерфейс с NAT на хост систему (это делается средствами qemu и работает достаточно медленно). Конечно есть и другие варианты для вывода видео и настроек сети, но это уже тема для отдельного поста.

1121

Комментарии

Ulfur аватар

 а в именах подгружаемых модулей разве не нижнее подчеркивание используется?

kvm_amd, kvm_intel

Вообще-то да, но описанные команды тоже сработают. modprobe автоматически подставит нижнее подчеркивание.

Ulfur аватар

 Ааа, точно... как-то давно тоже с этим сталкивался

fufler аватар

Спасибо за статью, она очень полезна для ознакомления с qemu-kvm. Попробовал работу с базовыми образами raw+qcow2 и qcow2+qcow2 -- работает отличо.

Спасибо за статью, очень полезно!

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

Конкретная процедура бекапа зависит от того какой системой управления виртуализацией вы пользуететсь. В самом общем случае можно просто скопировать образы вирт машин (если они хранятся в файлах) или использовать dd (Если образы на дисковых разделах). Как правило среда виртуализации позволяет упростить данную процедуру. RHEV, например, предоставляет возможность использовать export domain.