19. Система виртуализации 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.

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

Внесем изменения в make.conf для поддержки архитектур гостевых машин. Если вам необходимы другие нестандартные архитектуры, то добавьте их в этот список:

echo 'QEMU_SOFTMMU_TARGETS="i386 x86_64" 
QEMU_USER_TARGETS="i386 x86_64"' >> /etc/portage/make.conf/custom

Для настройки KVM в Calculate Linux нам понадобятся несколько пакетов со своими зависимостями. Аналогично данные рекомендации могут быть применимы и для Gentoo.

Если вы планируете использовать KVM не только для тестирования, то следует для app-emulation/qemu еще добавить USE-флаги sasl и tls для настройки безопасного подключения.

echo ">=net-dns/dnsmasq-2.72 script
app-emulation/qemu png virtfs xattr vnc
app-emulation/libvirt qemu udev virt-network" >> /etc/portage/package.use/custom
emerge -a app-emulation/libvirt app-emulation/qemu

Настроим параметры 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 default

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

modprobe -a tun vhost_net
echo "tun
vhost_net" >> /etc/modules-load.d/kvm.conf

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

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

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

Если вы хотите выделить сразу же все место, то вам нужно использовать следующую команду

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

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

Пример конфигурации виртуальной машины testkvm.xml. В данном примере используется следующая конфигурация 1Гб оперативной памяти, 1 ядро процессора, система 64 бита, установочный образ Calculate Scratch Server 14.12.1, vnc-сервер на порту 5910:

<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-14.12.1-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>

Выделяемая для машины оперативная память задается строкой:

<memory unit='KiB'>1026608</memory>

Количество выделяемых CPU:

<vcpu placement='static'>1</vcpu>

Загрузочные устройства указываются в секции <os>.

Путь к созданному образу жесткого диска задается строкой:

<source file='/var/calculate/vbox/hdd.qcow2'/>

Путь к установочному образу задается в секции, его следует поменять на ваш:

<disk type='file' device='cdrom'>

Подробнее об xml-конфиге — http://libvirt.org/formatdomain.html

Добавление машины на базе конфига:

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 guest01 vdd --eject

Вставка нового образа:

change-media guest01 vdd /pool/disc.iso

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

change-media <domain> <path> [<source>] [--eject] [--insert] [--update] [--current] [--live] [--config] [--force]

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

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

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

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

Если вы хотите настраивать сеть через bridge, то вам следует пересобрать ядро, включив следующие параметры:

CONFIG_MACVLAN=m
CONFIG_MACVTAP=m
CONFIG_BRIDGE_NF_EBTABLES=m
CONFIG_BRIDGE_EBT_MARK_T=m
CONFIG_BRIDGE_EBT_T_NAT=m
Подробно с возможностями настройки сети можно ознакомиться на страницах:
Спасибо!