Система виртуализации QEMU

Обновлено 24 января 2020

KVM (Kernel-based Virtual Machine) — это программное решение, обеспечивающее виртуализацию в среде Linux, которая поддерживает аппаратную виртуализацию на базе Intel VT (Virtualization Technology) либо AMD SVM (Secure Virtual Machine).

QEMU — свободная программа с открытым исходным кодом для эмуляции аппаратного обеспечения различных платформ, которая может работать и без использования KVM, но использование аппаратной виртуализации значительно ускоряет работу гостевых систем, поэтому использование KVM в QEMU (enable-kvm) является предпочтительным вариантом.

Первоначально разработка велась в рамках проекта Linux KVM (Kernel-based Virtual Machine), в котором, помимо собственно KVM (поддержки технологий аппаратной виртуализации x86-совместимых процессоров на уровне ядра Linux), разрабатывались патчи для QEMU, позволяющие QEMU использовать функциональность KVM. Однако недавно разработчики QEMU в содружестве с разработчиками KVM приняли решение интегрировать поддержку KVM в основную ветку QEMU (mainline).

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

Поддержка KVM вошла в ядро Linux начиная с версии 2.6.20.

libvirt - это интерфейс и демон для управления виртуальными машинами различных технологий (qemu/kvm, xen, virtualbox), он позволяет удобно настраивать и манипулировать виртуальными машинами. Также к нему есть много разных сторонних приложений для управления, web-интерфейсов и т.д. Например, весьма полезным может быть графический интерфейс управления виртуальными машинами virt-manager.

virt-manager

Установка пакетов

По умолчанию QEMU поддерживает архитектуры i386 и x86_64. Отредактируйте флаги для поддержки необходимых гостевых машин. Пример добавления поддержки архитектуры arm:

/etc/portage/make.conf/custom
QEMU_SOFTMMU_TARGETS="arm i386 x86_64"

Для установки QEMU и libvirt выполните:

emerge -a app-emulation/qemu app-emulation/libvirt

Настройка параметров QEMU

Отредактируйте файл настроек:

/etc/libvirt/qemu.conf
# Позволит vnc слушать на всех адресах
vnc_listen = "0.0.0.0"

# Отключим tls (если виртуальны машины используются не для тестирования, то лучше tls включить и настроить)
vnc_tls = 0

# Пароль по умолчанию для vnc - он будет использоваться в том случае, если для виртуальной машины не указан свой пароль
vnc_password = "XYZ12345"

# Пользователь от которого будет запускаться QEMU
user = "root"

# Группа от которой будет запускаться QEMU
group = "root"

# Формат сохранения и дампов, gzip или другое сжатие позволит уменьшить место, занимаемое образами, но притом увеличит время сохранения образов.
save_image_format = "gzip"
dump_image_format = "gzip"

Запустите демон libvirt и добавьте его в автозагрузку:

/etc/init.d/libvirtd start

rc-update add libvirtd

Также для виртуальной сети нам понадобятся модули tun и vhost_net. Загрузите модули:

modprobe -a tun vhost_net

и добавьте их в автозагрузку:

/etc/modules-load.d/qemu.conf
tun
vhost_net

Создание виртуальной машины

Для начала создайте образ для жесткого диска. По умолчанию он создается динамически расширяемым:

qemu-img create -f qcow2 /var/calculate/vbox/hdd.qcow2 20G

Если вы выделяете сразу все место под диск, то работать виртуальная машина будет быстрее, т.к. ей не надо будет выделять его в процессе работы. Для создания такого образа выполните:

qemu-img create -f qcow2 -o preallocation=metadata hdd.qcow2 20G

Пример конфигурации виртуальной машины:

testkvm.xml
<domain type='kvm' id='1'>
  <features><acpi/></features>
  <name>testkvm</name>
  <description>Description of server</description>
  <memory unit='KiB'>1048576</memory>
  <vcpu placement='static'>1</vcpu>
  <os>
    <type arch='x86_64' machine='pc-1.3'>hvm</type>
    <boot dev='cdrom' />
    <boot dev='hd' />
    <bootmenu enable='yes'/>
  </os>
  <devices>
    <emulator>/usr/bin/qemu-system-x86_64</emulator>
    <disk type='file' device='disk'>
      <driver name='qemu' type='qcow2' cache='writeback' io='threads'/>
      <source file='/var/calculate/vbox/hdd.qcow2'/>
      <target dev='vda' bus='virtio'/>
    </disk>
    <disk type='file' device='cdrom'>
      <driver name='qemu' type='raw'/>
      <source file='/var/calculate/linux/css-18.12-x86_64.iso '/>
      <target dev='vdd' bus='virtio'/>
      <readonly/>
    </disk>
    <interface type='network'>
      <source network='default'/>
    </interface>
    <graphics type='vnc' port='5910' autoport='no'>
      <listen type='address'/>
    </graphics>
  </devices>
</domain>

В примере используется следующая конфигурация:

  • 1Гб оперативной памяти
  • 1 ядро процессора
  • система 64 бита
  • установочный образ Calculate Scratch Server 18.12
  • vnc-сервер на порту 5910.

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

Добавьте машину на базе конфига:

virsh define testkvm.xml

Запустите машину:

virsh start testkvm

Для остановки машины выполните:

virsh destroy testkvm

Это экстренный останов сравнимый с выключением питания.

Для поддержки нормальных остановки и перезапуска в гостевой машине должна быть установлена поддержка ACPI. В случае использование Calculate Linux в качестве гостевой машины, делается это следующим образом:

emerge -a sys-power/acpid

rc-update add acpid boot

Для включения автозапуска гостевой машины при запуске демона libvirt выполните:

virsh autostart testkvm

Чтобы отключить автозапуск, выполните:

virsh autostart --disable testkvm

Для запуска виртуальной машины без использования libvirt-демона выполните:

qemu-system-x86_64 -name calculate -cpu host -smp 4 -enable-kvm -localtime -m 2048 -no-fd-bootchk -net nic,model=virtio,vlan=0 -net user,vlan=0 -drive file=hdd.img,index=0,media=disk,if=virtio -drive file=/mnt/iso/cldx-20150224-i686.iso,media=cdrom -monitor telnet:0.0.0.0:4008,server,nowait -spice port=5901,disable-ticketing -vga qxl -usb

Работа Virtio устройств

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

Команды изменения привода

Общий формат команды:

change-media [HTML_REMOVED] [HTML_REMOVED] [[HTML_REMOVED]] [--eject] [--insert] [--update] [--current] [--live] [--config] [--force]

Для вставки образа disc.iso в виртуальный привод выполните:

change-media guest01 vdd disc.iso

Для извлечения образа из виртуального привода выполните:

change-media guest01 vdd --eject

Настройка сети

При базовых настройках используется виртуальная сеть, недоступная извне. Доступ по IP может быть осуществлен с компьютера, на котором поднят QEMU. Изнутри доступ происходит через NAT.

Возможные варианты настройки сети:

  • NAT Based - это вариант по умолчанию. Внутренняя сеть, предоставляющая доступ к внешней сети с автоматическим применением NAT. В приведенном выше примере конфигурации используется именно этот вариант.
  • Routed - аналогично предыдущему внутренняя сеть, предоставляющая доступ к внешней сети, но без NAT. Предполагает дополнительные настройки таблиц маршрутизации во внешней сети.
  • Изолированная IPv4/IPv6 сеть.
  • Bridge - подключение типа мост (Позволяет реализовать множество различных конфигураций, в том числе и с назначение IP из реальной сети).
  • Перенаправление одной PCI сетевых карт хост-машины на гостевую машину.

Подробно с возможностями настройки сети можно ознакомиться по следующим ссылкам: