QEMU virtualization

Updated 4 July 2019

QEMU

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

Installing the necessary packages

By default, QEMU supports the i386 and x86_64 architectures. Edit the flags to provide support for more. For example, if you need arm to be supported:

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

To install QEMU and libvirt, run:

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

QEMU setup

Edit the configuration file:

/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"

Start the libvirt daemon and add it to autostart:

/etc/init.d/libvirtd start

rc-update add libvirtd

You will also need the tun and vhost_net modules for the virtual network. Load the necessary modules:

modprobe -a tun vhost_net

...and add them to autostart:

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

Creating a virtual machine

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

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

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

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

Here is a configuration example:

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>

The following configuration is used in the example above:

  • 1GB of RAM
  • 1 CPU core
  • 64-bit system
  • Calculate Scratch Server 18.12 to be installed
  • vnc-сервер на порту 5910.

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

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

virsh define testkvm.xml

To launch the machine, run:

virsh start testkvm

To stop the machine, run:

virsh destroy testkvm

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

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

emerge -a sys-power/acpid

rc-update add acpid boot

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

virsh autostart testkvm

To disable the autostart mode, run:

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

Working with Virtio devices

При использовании обычных виртуальных дисков и сетевых карт система работает следующим образом. В гостевую систему предоставляются копии реальных устройств. Таким образом в гостевой системе драйвера устройств преобразуют высокоуровневые запросы в низкоуровневые, виртуальная система их перехватывает, преобразует в высокоуровневые и передает уже драйверам хост-системы. При использовании 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

Network configuration

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

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

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

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