Установка и настройка QEMU/KVM в Ubuntu

Логотипы Ubuntu libvirt KVM

В этой статье я хочу рассмотреть установку и настройку QEMU/KVM в Ubuntu.

Оглавление

Введение в QEMU/KVM

KVM (Kernel-based Virtual Machine) — это комплекс программ для виртуализации с аппаратной поддержкой в среде Linux x86. Виртуализация позволяет нам устанавливать полностью изолированные, но работающие бок о бок операционные системы на одном и том же железе.

Гипервизор KVM представляет из себя загружаемый модуль ядра Linux. Он обеспечивает только уровень абстракции устройств. Таким образом одного гипервизора KVM недостаточно для запуска виртуальной ОС. Нужна еще эмуляция процессора, дисков, сети, видео, шины. Для этого существует QEMU.

QEMU (Quick Emulator) — эмулятор различных устройств, который позволяет запускать операционные системы, предназначенные для одной архитектуры, на другой.

Обычно такой комплекс программ для виртуализации называют QEMU/KVM.

Проверка аппаратной поддержки виртуализации

Во-первых, перед настройкой KVM необходимо проверить совместимость сервера с технологиями виртуализации:

cat /proc/cpuinfo | egrep -c "(vmx|svx)"

Числа отличные от нуля говорят о том, что процессор имеет поддержку аппаратной виртуализации Intel-VT или AMD-V .

Если вы получили число 0, то заходим в BIOS и ищем опцию для включения технологии виртуализации. Она может имеет различные названия, например, Intel Virtualization Technology или Virtualization.

Подготовка сервера

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

sudo mkdir -p /kvm/{hdd,iso}

В результате будет создан каталог /kvm/hdd для виртуальных жестких дисков и каталог /kvm/iso для образов ISO.

Установка и запуск QEMU/KVM в Ubuntu

В качестве интерфейса к технологиии виртуализации QEMU/KVM в Ubuntu мы будем использовать библиотеку libvirt. С помощью следующей команды мы установим гипервизор, эмулятор, библиотеку и утилиты управления.

sudo apt-get install qemu-kvm libvirt-bin virtinst libosinfo-bin

Где qemu-kvm — сам гипервизор; libvirt-bin — библиотека управления гипервизором; virtinst — утилита управления виртуальными машинами; libosinfo-bin — утилита для просмотра списка вариантов гостевых операционных систем.

После успешной установки всех пакетов настроим автоматический запуск сервиса.

sudo systemctl enable libvirtd

Запустим его.

sudo systemctl start libvirtd

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

sudo usermod -aG libvirt user

И установим права доступа на ранее созданные каталоги:

sudo chgrp libvirt /kvm/{hdd,iso}
sudo chmod g+w /kvm/hdd

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

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

Внимание! Используя удаленное подключение, внимательно проверяйте настройки. В случае ошибки соединение будет прервано и вам понадобится физический (или через ip kvm) доступ к серверу для исправления ситуации.

Итак, виртуальные машины могут работать через свою виртуальную сеть с NAT или получать IP-адреса из локальной сети через сетевой мост, который нам необходимо настроить.

Настройка сетевого моста

В старых версиях Ubuntu большая часть настроек конфигурации сети Ethernet находится в файле /etc/network/interfaces. На всякий случай создадим его резервную копию:

mkdir -p ~/backup && sudo cp /etc/network/interfaces ~/backup

Затем устанавливаем утилиты для конфигурирования Ethernet-моста:

sudo apt-get install bridge-utils

Открываем файл /etc/network/interfaces в своем любимом редакторе (vim, nano):

sudo vim /etc/network/interfaces

И приводим его к примерно такому виду:

source /etc/network/interfaces.d/*

auto lo
iface lo inet loopback

#allow-hotplug eno1
#iface eno1 inet static
#	address 192.168.7.2/24
#	gateway 192.168.7.1
#	dns-nameservers 127.0.0.1 192.168.7.1 8.8.8.8
#	dns-search home.lan

auto br0
iface br0 inet static
	address 192.168.7.2/24
	gateway 192.168.7.1
	bridge_ports eno1
	bridge_stp on
	bridge_fd 2
    bridge_hello 2
    bridge_maxage 20
	dns-nameservers 127.0.0.1 192.168.7.1 8.8.8.8
	dns-search home.lan

Все, что закомментировано — старые настройки сети; br0 — название интерфейса создаваемого моста; eno1 — сетевой интерфейс, через который будет работать мост.

Вам необходимо поменять eno1 на имя интерфейса вашей сетевой карты и заменить ip-адреса, на те, которые используются в вашей локальной сети.

Если вы получаете адрес динамически через DHCP, то конфигурация сократится до такой:

source /etc/network/interfaces.d/*

auto lo
iface lo inet loopback

auto br0
iface br0 inet dhcp
    bridge_ports eno1
	bridge_stp on
	bridge_fd 2
    bridge_hello 2
    bridge_maxage 20

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

sudo systemctl restart networking

Начиная с релиза Ubuntu 17.10, для управления конфигурацией сети по умолчанию используется утилита Netplan, которая добавляет новый уровень абстракции при настройке сетевых интерфейсов. Конфигурация сети хранится в файлах формата YAML. Предоставляется эта информация бэкендам (network renderers), таким как NetworkManager или systemd-networkd.

Файлы конфигурации Netplan хранятся в папке /etc/netplan. Для настройки сети открываем в редакторе файл 01-netcfg.yaml

vim /etc/netplan/01-netcfg.yaml

и приводим его к такому виду:

network:
  version: 2
  renderer: networkd
  ethernets:
   ens3:
      dhcp4: false
      dhcp6: false
  bridges:
    br0:
      dhcp4: false
      dhcp6: false
      interfaces: [ens3]
      addresses: [192.168.7.2/24]
      gateway4: 192.168.7.1
      nameservers:
        search: [home.lan]
        addresses: [127.0.0.1, 192.168.7.1, 8.8.8.8]
      parameters:
        stp: true
        forward-delay: 2
        hello-time: 2
        max-age: 20

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

network:
  version: 2
  renderer: networkd
  ethernets:
    ens3:
      dhcp4: false
      dhcp6: false
  bridges:
    br0:
      dhcp4: true
      dhcp6: true
      interfaces: [ens3]
      parameters:
        stp: true
        forward-delay: 2
        hello-time: 2
        max-age: 20

В файлах конфигурации указываем свои адреса, имена интерфейсов и доменов и после тщательной проверки применяем сетевые настройки:

sudo netplan apply

Виртульные сети (NAT forwarding)

Каждая стандартная установка libvirt обеспечивает подключение виртуальных машин на основе NAT из коробки. Это так называемая виртуальная сеть по умолчанию. Вы можете проверить, что она доступна таким образом:

sudo virsh net-list --all
Name                 State      Autostart     Persistent
----------------------------------------------------------
default              active     yes           yes 

Для того, чтобы виртуальные машины с сетевым интерфейсом NAT могли выходить в интернет необходимо настроить перенаправление сетевого трафика. Для этого надо убрать комментарий строки #net.ipv4.ip_forward=1 в файле /etc/sysctl.d/99-sysctl.conf и сохранить настройки:

sudo vim /etc/sysctl.d/99-sysctl.conf
sudo sysctl -p /etc/sysctl.d/99-sysctl.conf

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

Для создания виртуальной машины нам понадобятся две утилиты: osinfo-query — для получения списка доступных для установки вариантов операционных систем и virt-install — непосредственно для самой установки.

Итак, создадим нашу первую виртуальную виртуальную машину с ОС Ubuntu 16.04, 1024MiB ОЗУ, 1 процессором, сетью через мост и 12GiB жестким диском.

sudo virt-install \
--name ubuntu1604s \
--os-type=linux --os-variant=ubuntu16.04 \
--vcpus=1 \
--ram 1024 \
--network network=bridge:br0 \
--disk path=/kvm/hdd/ubuntu1604s.qcow2,format=qcow2,size=12,bus=virtio \
--cdrom=/kvm/iso/ubuntu-16.04.6-server-amd64.iso \
--graphics vnc,listen=0.0.0.0 --noautoconsole \
--hvm --virt-type=kvm

Обратите внимание на параметр —os-variant. Он указывает гипервизору под какую именно ОС следует адаптировать настройки.
Список доступных вариантов можно получить, выполнив команду:

osinfo-query os

Подробнее с параметрами virt-install вы можете ознакомиться на страницах руководства, а я приведу команду создания ВМ c сетью через NAT:

sudo virt-install \
--name ubuntu1604s \
--os-type=linux --os-variant=ubuntu16.04 \
--autostart \
--vcpus=2 --cpu host --check-cpu \
--ram 2048 \
--network network=default,model=virtio \
--disk path=/kvm/vhdd/ubuntu1604s.qcow2,format=qcow2,size=12,bus=virtio \
--cdrom=/kvm/iso/ubuntu-16.04.6-server-amd64.iso \
--graphics vnc,listen=0.0.0.0,password=vncpwd --noautoconsole \
--hvm --virt-type=kvm

После запуска установки в консоли сервера вы увидите текст похожий на этот:

Domain installation still in progress. Waiting for installation to complete.

Значит все нормально и для продолжения установки ОС в виртуальной машине нам нужно соединиться к ней по VNC. Чтобы узнать номер порта на котором он поднят для нашей ВМ откройте новую консоль или в текущей переведите задание в фоновый режим с помощью CTRL+Z, bg и выполните команду:

sudo virsh dumpxml ubuntu1604s | grep graphics

В моем случае это порт 5903:

<graphics type='vnc' port='5903' autoport='yes' listen='0.0.0.0'>

или выполнив команду

sudo virsh vncdisplay ubuntu1604s

вы получите примерно такой результат:

:3

Это число нужно сложить с базовым портом 5900.

Далее подключаемся с помощью клиента VNC (Remmina, TightVNC) к нашему серверу по полученному порту и устанавливаем Ubuntu 16.04 в нашей ВМ.

Установка Ubuntu в виртуальной машине QEMU/KVM через VNC

После успешного завершения установки в консоли вы увидите примерно следующее:

Domain has shutdown. Continuing.
Domain creation completed.
Restarting guest.

Управление виртуальной машиной

Для управления гостевыми системами и гипервизором существует текстовая утилита virsh. Она использует libvirt API и служит альтернативой графическому менеджеру виртуальных машин virt-manager.

Я коснусь только основных команд управления ВМ, так как описание всех возможностей утилиты — тема для отдельной статьи.

Список всех доступных команд вы можете увидеть так:

virsh help

Описание параметров отдельной команды:

virsh help command

где command — это команда из списка, который мы получили выше.

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

sudo vish list --all

Вот что она показала у меня:

 Id    Name                           State
----------------------------------------------------
 1     ubuntu16                       running
 3     centos8                        running
 6     ubuntu18                       running
 10    ubuntu1604server               running
 -     win10                          shut off
 -     win2k16                        shut off
 -     win2k16-2                      shut off
 -     win7                           shut off

Если же вам нужны только работающие в данный момент виртуалки, то введите:

sudo virsh list

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

sudo virsh start domain

где domain — имя виртуальной машины из списка, который мы получили выше.

Для выключения:

sudo virsh shutdown domain

И для ее перезагрузки:

sudo virsh reboot domain

Редактирование конфигурации ВМ:

sudo virsh edit domain

5 комментариев к “Установка и настройка QEMU/KVM в Ubuntu

  1. Добрый день!
    А возможно ли организовать WIFI-мост на QEMU/KVM?
    Сколько инфы на эту тему не находил, никакой конкретики, сплошная философия из разряда «может да, но скорее нет, хотя и да…».

    1. Константин, здравствуйте. Спасибо за интересный вопрос. Сразу оговорюсь, что в моей практике на машинах где есть QEMU/KVM есть и wired сетевой интерфейс и кейсов, которые требуют организации моста с wifi интерфейсом просто не возникало. Но так как мы имеем дело с Linux, то нет ничего невозможного. Конечно, это не будет мост в привычном нам понимании, который мы создаем и управляем утилитами из bridge-utils, но это решение будет работать подобно мосту и его будет достаточно, например, для экспериментов с виртуальными машинами на ноутбуке с wifi. Я постараюсь на днях опубликовать короткую статью по этому поводу. Если кратко — это сеть меньшего размера + proxy_arp.
      Upd: Как и обещал — Настройка сети KVM в режиме bridge для Wi-Fi

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *