В этой статье я хочу рассмотреть установку и настройку 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 .
Подготовка сервера
Во-вторых, для удобства создадим каталоги для хранения образов жестких дисков наших виртуальных машин и образов 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 и виртуальными машинами мы рассмотрим в следующей статье.
Настройка сети
Итак, виртуальные машины могут работать через свою виртуальную сеть с 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 — сетевой интерфейс, через который будет работать мост.
Если вы получаете адрес динамически через 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 в нашей ВМ.
После успешного завершения установки в консоли вы увидите примерно следующее:
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
Добрый день!
А возможно ли организовать WIFI-мост на QEMU/KVM?
Сколько инфы на эту тему не находил, никакой конкретики, сплошная философия из разряда «может да, но скорее нет, хотя и да…».
Константин, здравствуйте. Спасибо за интересный вопрос. Сразу оговорюсь, что в моей практике на машинах где есть QEMU/KVM есть и wired сетевой интерфейс и кейсов, которые требуют организации моста с wifi интерфейсом просто не возникало. Но так как мы имеем дело с Linux, то нет ничего невозможного. Конечно, это не будет мост в привычном нам понимании, который мы создаем и управляем утилитами из bridge-utils, но это решение будет работать подобно мосту и его будет достаточно, например, для экспериментов с виртуальными машинами на ноутбуке с wifi. Я постараюсь на днях опубликовать короткую статью по этому поводу. Если кратко — это сеть меньшего размера + proxy_arp.
Upd: Как и обещал — Настройка сети KVM в режиме bridge для Wi-Fi
очень интересная тема!
Кстати, вот только сегодня кейс в тему
https://forum.ubuntu.ru/index.php?topic=316115.0
Для AMD-V — флаг svm, а не svx