Система виртуализации 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
.
Установка пакетов
По умолчанию QEMU поддерживает архитектуры i386 и x86_64. Отредактируйте флаги для поддержки необходимых гостевых машин. Пример добавления поддержки архитектуры arm:
QEMU_SOFTMMU_TARGETS="arm i386 x86_64"
Для установки QEMU и libvirt выполните:
emerge -a app-emulation/qemu app-emulation/libvirt
Настройка параметров QEMU
Отредактируйте файл настроек:
# Позволит 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
и добавьте их в автозагрузку:
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
Пример конфигурации виртуальной машины:
<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 сетевых карт хост-машины на гостевую машину.
Подробно с возможностями настройки сети можно ознакомиться по следующим ссылкам: