Установка kvm в Ubuntu 20.04

09/02/2021

kvm install

Создать хост виртуализации в операционной системе 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 из консоли. Она позволит преодолеть подводные камни, которые встречаются на этом пути.

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

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