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


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

Сложно себе представить в наше время физический сервер без установленной на нем той или иной системы виртуализации. Я расскажу, как установить и настроить популярный гипервизор kvm на сервер под управлением Ubuntu. Это решение является open source, так что можно свободно использовать где угодно.

Что такое KVM?

KVM (Kernel-based Virtual Machine) — гипервизор виртуальных машин для Linux. Не стоит его путать с системами контейнеризации, такими как докер или lxc. Это принципиально разные вещи. Гипервизор дает полную изоляцию рабочего окружения, в том числе и железа. Находясь в виртуальной машине, вы имеете в своем распоряжении полноценную операционную систему, принадлежащую только вам.

Существует несколько популярных гипервизоров, как бесплатных, так и за деньги. KVM является полностью бесплатным решением, которое очень активно используют хостеры, в том числе предоставляющие услуги облачных технологий. Так же есть неплохая реализация полноценного гипервизора kvm с интерфейсом управления — proxmox. Это готовый продукт на базе дистрибутива дебиан.

Я сегодня не буду рассматривать готовые сборки гипервизоров, а вручную установлю на Ubuntu Server нативный гипервизор KVM с минимальными надстройками над ним. У нас на выходе будет сам гипервизор, локальная сеть для его корректной работы и средства управления гипервизором и виртуальными машинами. Если вам интересно, почему мой выбор пал на именно на убунту, читайте мой обзор этой системы, а так же статью про установку ubuntu.

Установка KVM в Ubuntu

Прежде чем начать установку гипервизора KVM в Ubuntu, проверим, поддерживает ли наш процессор виртуализацию. Для этого существует утилита kvm-ok. Если у вас нет ее в системе, установите пакет, который ее содержит.

Если ваш процессор не поддерживает виртуализацию, то получите сообщение:

INFO: Your CPU does not support KVM extensions
KVM acceleration can NOT be used

Если же все ОК, то информация будет следующая.

В этом случае можно приступать к установке виртуализации kvm.

Установка KVM на Ubuntu

Я устанавливаю следующие компоненты kvm:

  1. qemu и qemu-kvm — сам гипервизор
  2. libvirt-daemon-system и virtinst — утилиты для управления гипервизором и виртуальными машинами
  3. libosinfo-bin — пакет с информацией о поддержки гипервизорами различных операционных систем.

Запустим и добавим в автозагрузку сервис управления kvm:

В целом, все. Установка KVM на Ubuntu на этом и заканчивается. Можно проверить, загрузились ли у вас модули ядра kvm.

Все в порядке, гипервизор kvm готов к работе.

Сетевой Bridge для kvm

Настройка сети для виртуальных машин kvm может быть настроена различными способами. Я как минимум 3 наиболее популярных знаю:

  1. Виртуальные машины выходят во внешний мир через сам хост kvm, на котором настроен NAT. Этот вариант вам будет доступен сразу после установки kvm. Ничего дополнительно настраивать не надо, так как сетевой бридж для этого virbr0 уже будет добавлен в систему. А в правилах iptables будет добавлен MASQUERADE для NAT.
  2. Одна из виртуальных машин превращается в шлюз и через нее осуществляется доступ во внешний мир для всех виртуальных машин. Наиболее гибкий способ управления сетью для vm, но в то же время требует больше времени на настройку и набор знаний по работе с сетями.
  3. Для виртуальных машин kvm создается отдельный сетевой бридж во внешнюю сеть. Они напрямую получают в нее сетевой доступ.

Последний вариант наиболее простой и удобный, поэтому настроим сеть для виртуальных машин таким образом. Для этого нам нужно установить дополнительный пакет на host.

Настройка Bridge для kvm

Теперь на хосте приводим сетевые настройки в /etc/netplan к следующему виду.

Здесь будьте очень внимательны. Не выполняйте изменения сетевых настроек, не имея прямого доступа к консоли сервера. Очень высок шанс того, что что-то пойдет не так и вы потеряете удаленный доступ к серверу.

В предложенном наборе правил netplan у меня один сетевой интерфейс на хосте гипервизора — ens18. Он изначально получал настройки по dhcp. Мы добавили новый сетевой бридж br0, в него добавили интерфейс ens18. Так же мы указали, что br0 будет получать сетевые настройки по dhcp. Я указал mac адрес для того, чтобы он не менялся после перезагрузки. Такое может происходить. Адрес можно указать любой, не принципиально. Я сделал похожий на адрес физического сетевого интерфейса.

Теперь надо применить новые настройки.

Сразу после этого вы потеряете доступ к серверу по старому адресу. Интерфейс ens18 перейдет в состав bridge br0 и потеряет свои настройки. А в это время бридж br0 получит новые сетевые настройки по dhcp. IP адрес будет отличаться от того, что был перед этим на интерфейсе ens18. Чтобы снова подключиться удаленно к гипервизору kvm, вам надо будет пойти на dhcp сервер и посмотреть, какой новый ip адрес ему назначен.

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

В этом случае после применения новых настроек, гипервизор kvm будет доступен по адресу 192.168.25.2.

Обращайте внимание на все отступы в конфигурационном файле netplan. Они важны. В случае ошибок, настройки сети применены не будут. Иногда эта тема очень напрягает, так как не получается сразу понять, где именно в отступах ошибка. В этом плане yaml файл для настроек сети гипервизора как-то не очень удобен.

Далее еще один важный момент. Чтобы наш kvm хост мог осуществлять транзит пакетов через себя, надо это явно разрешить в sysctl. Добавляем в /etc/sysctl.d/99-sysctl.conf новый параметр. Он там уже есть, надо только снять пометку комментария.

Применяем новую настройку ядра.

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

Настройка KVM в Ubuntu Server

В целом, какой-то особенной настройки для гипервизора kvm после установки делать не нужно. Я обычно выношу в отдельные директории диски виртуальных машин и iso образы. Например, в /mnt/kvm . Это позволяет подмонтировать туда любые внешние хранилища, если будет такая необходимость.

Теперь при создании виртуальных машин можно указывать эти директории.

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

Настройка KVM

kvm passthrough

Гипервизор KVM поддерживает так называемый проброс оборудования в виртуальную машину. Называется эта технология passthrough. Для того, чтобы это было возможно, ваше железо должно поддерживать технологию IOMMU. С ее помощью можно, к примеру, пробросить в виртуальную машину видеокарту.

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

port forwarding

Если вы не создаете свой отдельный сетевой бридж для виртуальных машин, с помощью которого они будут автоматически попадать во внешнюю сеть, вам необходимо будет пробрасывать порты внутрь виртуалок. Я считаю это не очень удобным, поэтому выше и описал способ сразу вывести виртуальную машину во внешнюю сеть. Но если вам по каким-то причинам не хочется это делать и вы остаетесь на дефолтной настройке сети в kvm, то вам придется с помощью iptables делать проброс портов. Это не очень сложно, если вы умеете работать с iptables. Если же нет, то это может стать проблемой.

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

В этом примере я пробросил внешний tcp порт 22122 хоста в виртуальную машину 192.168.122.11, порт 22. В данном случае virbr0 дефолтный бридж, который был автоматически создан при установке kvm на хост.

Основные команды KVM

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

Просмотр всех виртуальных машин:

Запустить неактивную виртуальную машину:

Выключить vm штатно через возможности ОС:

Мгновенная остановка виртуальной машины. Например, если она зависла.

Информация о дисках vm:

Посмотреть информацию о vm:

Краткая информация о хосте гипервизора kvm:

Информация о файле образа диска vm:

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

Давайте теперь создадим и запустим нашу первую виртуальную машину на гипервизоре kvm. Для этого нам достаточно только консоли системы ubuntu и команды virt-install. Но перед тем, как создать саму машину, сделаем для нее диск в формате qcow2.

Отлично, теперь создаем виртуальную машину для гипервизора kvm:

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

Я получил предупреждение о том, что слишком мало выделил оперативной памяти для виртуальной машины Ubuntu20.04

WARNING Requested memory 1024 MiB is less than the recommended 2048 MiB for OS ubuntu20.04

На самом деле это не страшно. Для минимальной конфигурации хватит и таких ресурсов. Рассмотрим теперь подробно параметры, которые я указал при создании vm.

noautoconsole параметр указывает на то, что не надо подключаться к консоли vm. Мы и не сможем это сделать, так как на сервере не установлено графическое окружение
vcpus, cpu, check-cpu параметры cpu — количество виртуальных процессоров и их описание. В моем примере один процессор, а описание берется с хоста.
ram объем оперативной памяти для новой виртуальной машины
arch тип архитектуры
network параметры сети. В данном случае подключаем к виртуальной машине созданный ранее сетевой бридж в локальную сеть.
cdrom указываем образ диска, с которого будет выполняться установка системы
disk путь к диску, который мы создали ранее для виртуальной машины
graphics параметры подключения к консоли виртуальной машины. В данном случае подключение будет возможно по vnc с паролем parol.
os-type, os-variant тип операционной системы на новосозданной виртуальной машине
boot параметры загрузки системы. Сначала грузимся с cd, потом с диска.

После создания и запуска виртуальной машины, можно подключиться к ее консоли. Для этого надо узнать, к какому порту VNC осуществлять подключение. Запускаем в консоли гипервизора команду:

Вывод :0 означает, что нет отступа от дефолтного порта vnc 5900. Если бы в выводе было :1, значит подключаться нужно было бы к порту 5901. В нашем случае подключаемся через любой vnc клиент к ip адресу гипервизора по порту 5900.

Подключение к консоли виртуальной машины

Вводим пароль, который указали при создании VM. Если вы его забыли, то можно подсмотреть в конфигурационном файле виртуальной машины. Он находится тут — /etc/libvirt/qemu/vmserver01.xml .

Пароль для доступа по vnc

После подключения к консоли виртуальной машины, увидим традиционный установщик Ubuntu.

Консоль виртуальной машины с ubuntu в kvm

Можно продолжать установку непосредственно системы внутри vm. На этом установку новой виртуальной машины в kvm закончим. Рассмотрим дополнительно некоторые важные параметры, касающиеся управления.

Автозапуск виртуальной машины

Для того, что виртуальная машина kvm автоматически запускалась при старте гипервизора, можно явно это указать в самом начале. Во время создания vm надо добавить параметр autostart примерно так:

Если не сделали это сразу, не беда. За автозапуск виртуальных машин в kvm отвечает наличие символьной ссылки на конфигурацию vm в соответствующей директории — /etc/libvirt/qemu/autostart . Так что просто создайте ее.

Либо воспользуйтесь встроенной командой:

После этого виртуальная машина vmserver01 будет автоматически запускаться после перезагрузки хоста kvm.

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

Теперь рассмотрим ситуацию, когда вам надо удалить виртуальную машину в kvm, используя только консоль. Сделать это не сложно. Для начала посмотрим на список всех виртуальных машин хоста:

Останавливаем виртуальную машину vmserver01:

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

Теперь уже виртуальную машину можно удалить:

Эта команда по сути просто удаляет конфигурацию vm из директории /etc/libvirt/qemu . Для полного удаления виртуальной машины вам необходимо отдельно удалить ее диск. Сделайте это вручную сами в зависимости от того, где располагался диск. Если это был обычный qcow2 или raw файл, то удалите его командой rm.

Будьте внимательны с именем файла. Не удалите случайно диск от другой виртуальной машины.

Увеличение размера диска

Для увеличения диска виртуальной машины в kvm достаточно воспользоваться консольной утилитой qemu-img. Если вы не знаете, где располагается диск виртуальной машины, посмотреть можно так:

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

Увеличил размер диска на 1G. Посмотрим информацию о диске:

Информация о диске virtual machine

В моем примере размер диска vm был изначально 2G, я увеличил его до 3-х.

KVM Agent

Для того, чтобы гипервизор мог получать информацию о виртуальной машине и взаимодействовать с ней, на нее необходимо установить qemu-guest-agent. Он нужен, например, для корректного завершения работы системы командой от гипервизора. Или для создания снепшота диска виртуалки без ее остановки. Для этого в свойствах виртуальной машины его нужно включить.

Сделать это можно отредактировав конфиг виртуальной машины. В него нужно добавить дополнительный channel. Сделаем это.

Добавляем в конфиг:

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

После этого в самой виртуальной машине нужно установить пакет qemu-guest-agent. Обычно он присутствует в стандартных репозиториях всех популярных систем. Для windows нужно отдельно скачать образ диска virtio-win и установить агента оттуда. Скачать образ можно тут, ссылки для windows в конце.

Установка Windows 10 в KVM

Для того, чтобы установить виртуальную машину с Windows 10 в KVM ничего особенного делать не надо. Кладем iso образы системы и virtio драйверов на kvm хост и запускаем виртуальную машину.

Дальше подключаемся по vnc и выполняем установку Windows 10. Узнать порт vnc для подключения можно командой:

В данном случае порт будет 5900. Число после двоеточия добавляется к стандартному порту 5900. Если бы там было :5, то подключаться нужно было бы по порту 5905. Если во время установки в списке дисков будет пусто, необходимо загрузить драйвер с образа virtio-win.iso. Сам драйвер находится в папке E:\viostor\w10\amd64.

После установки Windows 10 на KVM, зайдите в систему и установите драйвера для всего неопознанного оборудования. Драйвер можно поставить автопоиском с диска virtio-win. В самом конце с этого же диска установите Qemu Guest Agent. Он там в отдельной директории лежит в виде приложения.

На этом все, система с Windows 10 готова работать на гипервизоре KVM. Установка немного посложнее, чем в других гипервизорах из-за того, что в стандартном образе виндовс нет драйверов для дисков kvm.

Snapshot виртуальной машины KVM

Отдельно расскажу, как сделать snapshot виртуальной машины в kvm. Для того, чтобы функционал снимков был доступен, ваши диски должны быть в формате qcow2. Именно он поддерживает снэпшоты. Если диски raw, то сделать снимок не получится. Так же необходимо, чтобы в системе был установлен qemu-guest-agent. Если его не будет, то при создании снимка работающей vm получите ошибку:

error: Guest agent is not responding: QEMU guest agent is not connected

Прежде чем делать snapshot, посмотрим на имя диска виртуальной машины:

Отлично, имя диска vda. Теперь делаем его snapshot:

vmserver01 имя виртуальной машины, для которой делаем снэпшот
snapshot-name название самого снепшота, актуально, когда их несколько
vda имя диска виртуальной машины
vmserver01-disk1-snapshot.qcow2 имя и путь для снепшота

После этого в директории /mnt/kvm/disk появится файл vmserver01-disk1-snapshot.qcow2 , куда будут писаться все изменения диска. Сам же диск останется в неизменном виде. В этой ситуации его удобно забэкапить. Рассмотрим это позже. Если сейчас посмотреть список дисков виртуальной машины, то в качестве диска там будет указан снэпшот.

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

Проверьте список дисков. У вас должен исчезнуть snapshot, а основной диск вернется на прежнее место.

Бэкап виртуальной машины

Бэкап виртуальной машины kvm может быть выполнен по-разному. По своей сути это просто копия диска и экспорт настроек vm. Если вы хотите делать backup без остановки виртуальной машины, то необходимо воспользоваться снепшотом. Как его сделать, я показал выше. После того, как снэпшот сделан, вам достаточно просто скопировать основной диск vm. Сделать это можно любым доступным способом. Например, можно его сразу же сжать и положить в директорию с бэкапами.

Мы сжали диск виртуальной машины с помощью tar и gz и положили его в директорию с бэкапами /mnt/backup/ . Для полноты бэкапа, положим туда же и настройки виртуальной машины.

После того, как сделаете backup виртуальной машины, не забудьте объединить снэпшот с основными диском. Не допускайте роста числа снэпшотов. Это приводит к сильному снижению производительности, а когда снимков станет слишком много, могут быть ошибки работы с диском.

Если у вас есть возможность остановить виртуальную машину для создания архива, то снимки вам не нужны. Просто останавливайте виртуалку и копируйте ее диски. А потом запускайте снова. Можно все эти действия объединить в скрипт. Примерно так:

Это просто набросок. По хорошему, сюда нужно добавлять проверки, отправку отчета на почту и т.д.

Web интерфейс (gui) для KVM

Выше я показал, как управлять виртуальными машинами через консоль. В целом, весь необходимый функционал доступен. Но если вам хочется управлять виртуальными машинами kvm через браузер, то можно поставить простую панель управления для этого. В качестве KVM Web Interface я предлагаю использовать VMDashboard. Это обычное веб приложение, написанное на php. В работе использует базу данных MySQL.

Устанавливаем необходимые компоненты сервера для работы Web Interface.

Для того, чтобы работало подключение к консолям виртуальных машин через web интерфейс, необходимо раскомментировать один параметр в /etc/libvirt/qemu.conf .

Продолжаем настройку web панели для kvm. Добавляем пользователя www-data в группу libvirt:

Переходим в директорию www и загружаем исходники панели:

Распаковываем их и готовим к запуску:

Теперь нам нужно создать mysql базу для веб панели.

Далее нужно перезагрузить kvm сервер:

После перезагрузки идем в web интерфейс по адресу http://10.20.1.40/vmdashboard/ и настраиваем подключение к панели управления виртуальными машинами. Используем данные о созданной ранее базе данных и пользователе.

Web интерфейс для KVM

На этом установка и настройка веб панели управления для kvm закончена. Можно переходить в интерфейс и управлять виртуалками.

kvm gui

Заключение

Постарался всесторонне рассмотреть вопрос установки и настройки гипервизора kvm на ubuntu server. Если забыл что-то важное, напомните в комментариях. Я дополню статью.

4 комментариев к записи « Установка и настройка KVM в Ubuntu »

Отличная статья. Всё получилось. Первый раз KVM разворачиваю. Чего пришлось искать:
1. Пришлось искать дополнительно команду отсоединения cdrom (vm не хотела перегружаться).
2. http://192.168.89.37/vmdashboard/index.php выдает:
Cannot open connection to hypervisor. Please check to make sure that the Qemu service is running.
При этом qemu-kvm.service запущен.

Спасибо за обратную связь. Странно, что vmdashboard не заработал. У меня обычно нет проблем с его настройкой. Ничего особенного настраивать не надо. Сходу все запускается.

Статья очень полезная! Учился разворачивать линукс гипервизор и гостевые ос — ваша подробная инструкция очень помогла. Конечно приходилось искать ответы на некоторые вопросы самостоятельно, но это нормальный рабочий (учебный) процесс. Жду еще больше материалов и желаю развития вашему сайту. Спасибо за ваш труд!

Пишет на этапе создания виртуальной машины:
ERROR Validating install media ‘/mnt/kvm/iso/ubuntu-20.04.1-live-server-amd64.iso’ failed: Must specify storage creation parameters for non-existent path ‘/mnt/kvm/iso/ubuntu-20.04.1-live-server-amd64.iso’.
Что делать?


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

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