09/02/2021
Создать хост виртуализации в операционной системе Ubuntu 20.04 с гипервизором kvm не составит сложности, понимая технологии которые используются при этом. Это позволяет использовать обычный физический сервер с операционной системой Linux на борту как полноценный узел виртуализации, аналогичный Vmware ESXi. При этом мы можем не думать о стоимости лицензий программного обеспечения виртуализации. Так же, как и продукты VMware, функционирование kvm требует поддержки аппаратной виртуализации со стороны центрального процессора сервера. В качестве гостевых операционных систем мы можем использовать как различные дистрибутивы Linux и BSD, так и все вариации MS Windows.
Данная статья посвящена процедуре установки и первоначальной настройки хостовой операционной системы Ubuntu Linux 20.04 и гипервизора kvm. Мы пройдем поэтапно по всем основным шагам и получим в результате работающий гипервизор виртуализации, которой можно будет полноценно использовать как в продакшене, так и для тестовых целей. Особый акцент сделан на сетевую часть. Показано как настроить виртуальную сеть kvm таким образом, чтобы обеспечить прямой доступ из физической сети к гостевым машинам.
Проверка системы
Для начала нам нужно определиться с поддержкой технологий аппаратной виртуализации со стороны физического сервера. Если такой поддержки нет, то и использовать гипервизор kvm у нас не получится. Для выяснения этого выполним следующую команду, читающую данные о процессорах сервера.
# egrep -c '(vmx|svm)' /proc/cpuinfo
8
В данном примере результат выполнения команды – 8, что больше нуля. Это значит, что у нас 8 ядер ЦПУ, которые поддерживают технологию аппаратной виртуализации. Если же мы получим в качестве вывода ноль, то работать kvm у нас на данном сервере не будет.
Также операционную систему рекомендуется проверить командой kvm-ok для уточнения совместимости с гипервизором. Чтобы установить ее, выполняем команду.
# sudo apt install cpu-checker
После этого можно проверить операционную систему на непосредственную совместимость с kvm. В нашем случае система полностью совместима и вывод команды kvm-ok представлен ниже.
# kvm-ok
INFO: /dev/kvm exists
KVM acceleration can be used
Установка KVM
Теперь мы готовы для непосредственной установки apt пакетов, которые обеспечивают работу гипервизора kvm. Это делается с помощью нижеуказанной команды.
# sudo apt install qemu qemu-kvm libvirt-daemon libvirt-clients bridge-utils virt-manager
После заверешния установки всех пакетов нам необходимо настроить автоматический запуск сервиса libvirtd в системе.
# sudo systemctl enable --now libvirtd
Смотрим статус текущего состояния сервиса libvirtd следующим образом. Как видно, все работает нормально и можно переходить к следующму этапу конфигурации гипервизора.
# systemctl status libvirtd
● libvirtd.service - Virtualization daemon
Loaded: loaded (/lib/systemd/system/libvirtd.service; enabled; vendor preset: enabled)
Active: active (running) since Thu 2021-02-04 17:07:20 TAS; 26min ago
TriggeredBy: ● libvirtd.socket
● libvirtd-admin.socket
● libvirtd-ro.socket
Docs: man:libvirtd(8)
https://libvirt.org
Main PID: 936219 (libvirtd)
Tasks: 19 (limit: 32768)
Memory: 21.9M
CGroup: /system.slice/libvirtd.service
├─936219 /usr/sbin/libvirtd
├─936348 /usr/sbin/dnsmasq --conf-file=/var/lib/libvirt/dnsmasq/default.conf --leasefile-ro --dhcp-script=/usr/lib/libvirt/libvirt_leaseshelper
└─936349 /usr/sbin/dnsmasq --conf-file=/var/lib/libvirt/dnsmasq/default.conf --leasefile-ro --dhcp-script=/usr/lib/libvirt/libvirt_leaseshelper
Feb 04 17:07:20 kvm01.andreyus.com dnsmasq-dhcp[936348]: DHCP, sockets bound exclusively to interface virbr0
Feb 04 17:07:20 kvm01.andreyus.com dnsmasq[936348]: reading /etc/resolv.conf
Feb 04 17:07:20 kvm01.andreyus.com dnsmasq[936348]: using nameserver 127.0.0.53#53
Feb 04 17:07:20 kvm01.andreyus.com dnsmasq[936348]: read /etc/hosts - 9 addresses
Feb 04 17:07:20 kvm01.andreyus.com dnsmasq[936348]: read /var/lib/libvirt/dnsmasq/default.addnhosts - 0 addresses
Feb 04 17:07:20 kvm01.andreyus.com dnsmasq-dhcp[936348]: read /var/lib/libvirt/dnsmasq/default.hostsfile
Feb 04 17:07:20 kvm01.andreyus.com dnsmasq[936348]: reading /etc/resolv.conf
Feb 04 17:07:20 kvm01.andreyus.com dnsmasq[936348]: using nameserver 127.0.0.53#53
Feb 04 17:07:20 kvm01.andreyus.com dnsmasq[936348]: reading /etc/resolv.conf
Feb 04 17:07:20 kvm01.andreyus.com dnsmasq[936348]: using nameserver 127.0.0.53#53
Настройка сетевой части гипервизора
По умолчанию после установки kvm гипервизор использует один сетевой бридж, в котором выход в общую сеть для виртуальных машин закрыт за NATом. Обычно же на хостах виртуализации необходим прямой доступ с гостевых машин в сеть. Для этого нужно выполнить ряд настроек. В первую очередь создадим файл /etc/sysctl.d/12-bridge.conf, содержание которого представлено ниже и который отключает правила фильтрации IPTABLES на бриджах хостовой ОС.
net.bridge.bridge-nf-call-ip6tables=0
net.bridge.bridge-nf-call-iptables=0
net.bridge.bridge-nf-call-arptables=0
Для того, чтобы эти настройки применялись в операционной системе при загрузке создадим еще один файл – /etc/udev/rules.d/99-bridge.rules. Добавим в него одну только строчку.
ACTION=="add", SUBSYSTEM=="module", KERNEL=="br_netfilter", RUN+="/sbin/sysctl -p /etc/sysctl.d/12-bridge.conf"
После проведенных манипуляций выполним перезагрузку операционной системы хоста и продолжим настройку сетевой части гипервизора. С помощью двух последующих команд virsh удалим дефолтную виртуальную сеть default, которая была создана при установке kvm.
# virsh net-destroy default
Network default destroyed
# virsh net-undefine default
Network default has been undefined
Когда дефолтная kvm виртуальная сеть, натирующая весь трафик от виртуалок будет удалена, можно настроить новую виртуальную сеть, обеспечивающую прямой доступ в ЛВС через программный бридж в операционной системе хоста. Для этого добавим настройки бриджа в файл /etc/netplan/00-installer-config.yaml. Простейший пример такого файла с одним ethernet интерфейсом и одним программным бриджом представлен далее.
network:
ethernets:
eno1:
dhcp4: false
dhcp6: false
bridges:
br0:
interfaces: [ eno1 ]
addresses: [192.168.1.5/24]
gateway4: 192.168.1.1
mtu: 1500
nameservers:
addresses: [8.8.4.4,8.8.8.8]
search: [andreyus.com]
parameters:
stp: true
forward-delay: 4
dhcp4: no
dhcp6: no
version: 2
Когда файл будет отредактирован, выполним команду sudo netplan apply, чтобы внесенные изменения вступили в силу. Теперь у нас в операционной системе хоста будет работающий программный бридж br0, который мы задействуем для проброса трафика из гостевых машин во внешние сети. Если у нас есть несколько внешних сетевых интерфейсов, то при необходимости мы можем создать несколько бриджей, используя их для проброса трафика на виртуальные машины.
После того, как бридж у нас будет готов, мы настроим виртуальную сеть kvm, которая будет использовать данный бридж. Создадим небольшой xml файл в текущей директории с конфигурацией виртуальной сети – bridge-network.xml.
<network>
<name>bridge-network</name>
<forward mode="bridge"/>
<bridge name="br0"/>
</network>
Используя данный xml файл, выполним настройку виртуальной kvm сети с помощью утилиты virsh.
# virsh net-define ./bridge-network.xml
# virsh net-start bridge-network
# virsh net-autostart bridge-network
Проверить созданную виртуальную kvm сеть можно следующим образом.
# virsh net-list --all
Name State Autostart Persistent
------------------------------------------------
bridge-network active yes yes
На этом наши операции по установке и настройке гипервизора kvm заканчиваются. Мы проинсталировали необходимое ПО и настроили его таким образом, что можем считать поставленную задачу в названии статьи выполненной.
Что дальше
После того, как все вышеуказанные манипуляции успешно завершены, можно приступить к непосредственному созданию гостевых машин и их эксплуатации в kvm. Если Вы новичок в этом деле, рекомедую прочесть еще одну статью на моем блоге – Создание виртуалок в kvm из консоли. Она позволит преодолеть подводные камни, которые встречаются на этом пути.