- Установка и настройка QEMU/KVM в Ubuntu
- Оглавление
- Введение в QEMU/KVM
- Проверка аппаратной поддержки виртуализации
- Подготовка сервера
- Установка и запуск QEMU/KVM в Ubuntu
- Настройка сети
- Настройка сетевого моста
- Виртульные сети (NAT forwarding)
- Создание виртуальной машины
- Управление виртуальной машиной
- Qemu и сетевой мост
Установка и настройка QEMU/KVM в Ubuntu
В этой статье я хочу рассмотреть установку и настройку 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, с которых будет производиться установка операционных систем.
В результате будет создан каталог /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/ 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
В файлах конфигурации указываем свои адреса, имена интерфейсов и доменов и после тщательной проверки применяем сетевые настройки:
Виртульные сети (NAT forwarding)
Каждая стандартная установка libvirt обеспечивает подключение виртуальных машин на основе NAT из коробки. Это так называемая виртуальная сеть по умолчанию. Вы можете проверить, что она доступна таким образом:
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. Он указывает гипервизору под какую именно ОС следует адаптировать настройки.
Список доступных вариантов можно получить, выполнив команду:
Подробнее с параметрами 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:
sudo virsh vncdisplay ubuntu1604s
вы получите примерно такой результат:
Это число нужно сложить с базовым портом 5900.
Далее подключаемся с помощью клиента VNC (Remmina, TightVNC) к нашему серверу по полученному порту и устанавливаем Ubuntu 16.04 в нашей ВМ.
После успешного завершения установки в консоли вы увидите примерно следующее:
Domain has shutdown. Continuing. Domain creation completed. Restarting guest.
Управление виртуальной машиной
Для управления гостевыми системами и гипервизором существует текстовая утилита virsh. Она использует libvirt API и служит альтернативой графическому менеджеру виртуальных машин virt-manager.
Я коснусь только основных команд управления ВМ, так как описание всех возможностей утилиты — тема для отдельной статьи.
Список всех доступных команд вы можете увидеть так:
Описание параметров отдельной команды:
где command — это команда из списка, который мы получили выше.
Для просмотра списка всех виртуальных машин используйте:
Вот что она показала у меня:
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
Если же вам нужны только работающие в данный момент виртуалки, то введите:
Для запуска виртуальной машины выполните в консоли:
где domain — имя виртуальной машины из списка, который мы получили выше.
sudo virsh shutdown domain
Редактирование конфигурации ВМ:
Qemu и сетевой мост
На Хосте установлен qemu и virt-manager. Как известно, в qemu по дефолту сеть за NAT’ом.
Нам хочется, чтобы и Хост и Гость в qemu имели ip адреса в одной подсети. Т.е. нам нужно настроить мост на Хосте и сетевой мост в Qemu госте.
Открываем консоль на Хосте:
Смотрим какие интерфейсы у нас имеются и работают. В данном примере enp2s0 физический интерфейс и подключен к роутеру.
Создаем подключение типа «мост» используя интерфейс br0:
nmcli con add ifname br0 type bridge con-name br0
Добавляем физический наш интерфейс (в данном случае enp2s0) в качестве подчиненного устройства к нашему только что созданному мосту br0:
nmcli con add type bridge-slave ifname enp2s0 master br0
Отключаем STP на мосту br0:
nmcli con modify br0 bridge.stp no
Отключаем наше подключение по физическому интерфейсу:
Поднимаем подключение по нашему мосту:
Смотрим что получилось, и какие соединения работают.
Запускаем наш virt-manager (Менеджер виртуальных машин)
Открываем (не запускаем), ранее созданную виртуальную машину, далее «Вид» -> «Подробности». Переходим в раздел «NIC :(MAC адрес)» , это раздел настройки сети.
В строке «Создать на базе», выбираем «Устройство моста», далее в «Название устройства» вписываем наш мост br0.
Сохраняем настройки. И можно запускать виртуальную машину.
При создании новой виртуальной машины, мы в мастере создания, в разделе «Выбор сети» выбираем «Устройство моста»
И в строке «Название устройства» прописываем наш мост br0.
Далее в мастере создаем нашу виртуальную машину.
После такой настройки, новая виртуальная машина получит ip адреса из подсети роутера и хоста.
Теперь у нас на Хосте и в Госте (в qemu), сетевые интерфейсы будут находится в одной подсети, в нашем примере 192.168.1.0/24