Поиск по сайту:

Установите и настройте KVM на сервере CentOS 8

В этом пошаговом руководстве объясняется, что такое KVM, а также как установить и настроить KVM в операционной системе CentOS 8 Linux.

Это руководство официально протестировано в минимальной серверной версии CentOS 8. Однако он также должен работать в RHEL 8 и его клонах, таких как AlmaLinux 8 и Rocky Linux 8.

Что такое КВМ?

KVM, сокращение от Kвиртуальнаявиртуальная машинана базе ядра, представляет собой модуль ядра FreeBSD и Linux, который позволяет ядро действует как гипервизор.

Начиная с версии ядра 2.6.20, KVM объединен с основной веткой ядра Linux.

Используя KVM, вы можете легко настроить среду виртуализации на машине с Linux и развернуть широкий спектр гостевых операционных систем, включая Linux, Windows, BSD, Mac OS и многие другие.

Теперь давайте посмотрим, как установить и настроить KVM в CentOS 8 Linux.

Предварительные условия

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

  • Как узнать, поддерживает ли процессор технологию виртуализации (VT)

Если ваша система поддерживает аппаратную виртуализацию, продолжайте следующие шаги.

1. Установите и настройте KVM на сервере CentOS 8.

Для целей данного руководства я буду использовать следующую систему:

Сервер виртуализации KVM:

  • ОС - минимальный сервер CentOS 8 (без графического интерфейса).
  • IP-адрес: 192.168.225.53/24

Несмотря на то, что оно протестировано на CentOS 8, это руководство также должно работать нормально и на RHEL 8.

1.1. Установите KVM в CentOS 8

Примечание. Все команды, приведенные в этом руководстве, следует запускать как корневой пользователь. Если вы вошли в систему как обычный пользователь, добавьте sudo перед всеми командами, приведенными ниже.

Установите Kvm и все необходимые зависимости для настройки среды виртуализации на сервере CentOS 8, используя команду от имени пользователя root:

dnf install qemu-kvm libvirt virt-install

Здесь,

  • emu-kvm — метапакет QEMU для поддержки KVM (т. е. полная виртуализация QEMU на оборудовании x86),
  • libvirt — программы для библиотеки libvirt,
  • virt-install — программы для создания и клонирования виртуальных машин.

После установки KVM включите и запустите службу libvertd (если она еще не запущена):

systemctl enable libvirtd
systemctl start libvirtd

Вы также можете объединить обе команды и запустить их в одну строку, как показано ниже:

systemctl enable --now libvirtd

Проверьте статус службы libvirtd с помощью команды:

systemctl status libvirtd

Пример вывода:

● libvirtd.service - Virtualization daemon
   Loaded: loaded (/usr/lib/systemd/system/libvirtd.service; enabled; vendor preset: enable>
   Active: active (running) since Wed 2020-07-15 14:27:32 IST; 5s ago
     Docs: man:libvirtd(8)
           https://libvirt.org
 Main PID: 1097 (libvirtd)
    Tasks: 17 (limit: 32768)
   Memory: 57.0M
   CGroup: /system.slice/libvirtd.service
           └─1097 /usr/sbin/libvirtd

Jul 15 14:27:28 centos8.ostechnix.lan systemd[1]: Starting Virtualization daemon...
Jul 15 14:27:32 centos8.ostechnix.lan systemd[1]: Started Virtualization daemon.

Служба libvertd запущена и работает!

Убедитесь, что модули KVM загружены:

lsmod | grep kvm

Пример вывода:

kvm_intel             294912  0
kvm                   786432  1 kvm_intel
irqbypass              16384  1 kvm

Большой! Модули KVM загружены. Давайте теперь создадим сетевой мост.

1.2. Настройка мостовой сети с KVM в CentOS

Мостовая сеть использует реальный сетевой интерфейс хост-компьютера совместно с другими виртуальными машинами для подключения к внешней сети. Поэтому каждая виртуальная машина может напрямую привязываться к любому доступному адресу IPv4 или IPv6, как и физический компьютер.

По умолчанию KVM настраивает частный виртуальный мост, чтобы все виртуальные машины могли взаимодействовать друг с другом внутри главного компьютера.

Он предоставляет собственную подсеть и DHCP для настройки гостевой сети и использует NAT для доступа к сети хоста.

Посмотрите IP-адрес виртуальных интерфейсов KVM по умолчанию с помощью команды ip:

ip a

Пример вывода:

1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000
    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
    inet 127.0.0.1/8 scope host lo
       valid_lft forever preferred_lft forever
    inet6 ::1/128 scope host 
       valid_lft forever preferred_lft forever
2: enp0s3: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc fq_codel state UP group default qlen 1000
    link/ether 08:00:27:b7:3a:84 brd ff:ff:ff:ff:ff:ff
    inet 192.168.225.52/24 brd 192.168.225.255 scope global dynamic noprefixroute enp0s3
       valid_lft 42217sec preferred_lft 42217sec
    inet6 2409:4072:918:98cf:ad3b:b969:8ec8:f9c7/64 scope global noprefixroute 
       valid_lft forever preferred_lft forever
    inet6 fe80::b404:4d52:8bee:18bf/64 scope link noprefixroute 
       valid_lft forever preferred_lft forever
3: enp0s8: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc fq_codel state UP group default qlen 1000
    link/ether 08:00:27:2a:be:53 brd ff:ff:ff:ff:ff:ff
4: enp0s9: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc fq_codel state UP group default qlen 1000
    link/ether 08:00:27:41:91:4d brd ff:ff:ff:ff:ff:ff
5: virbr0: <NO-CARRIER,BROADCAST,MULTICAST,UP> mtu 1500 qdisc noqueue state DOWN group default qlen 1000
    link/ether 52:54:00:5b:a4:cd brd ff:ff:ff:ff:ff:ff
    inet 192.168.122.1/24 brd 192.168.122.255 scope global virbr0
       valid_lft forever preferred_lft forever
6: virbr0-nic: <BROADCAST,MULTICAST> mtu 1500 qdisc fq_codel master virbr0 state DOWN group default qlen 1000
    link/ether 52:54:00:5b:a4:cd brd ff:ff:ff:ff:ff:ff

Просмотрите IP-адрес виртуального интерфейса KVM по умолчанию с помощью команды ip.

Как видите, сеть KVM по умолчанию virbr0 использует IP-адрес 192.168.122.1/24. Все виртуальные машины будут использовать IP-адрес в диапазоне 192.168.122.0/24, а операционная система хоста будет доступна по адресу 192.168.122.1.

У вас должна быть возможность подключиться по ssh к хостовой ОС (по адресу 192.168.122.1) изнутри гостевой ОС и использовать scp для копирования файлов туда и обратно.

Это нормально, если вы получаете доступ к виртуальным машинам внутри самого хоста. Однако вы не можете получить доступ к виртуальным машинам из других удаленных систем в сети.

Потому что они используют другой диапазон IP-адресов, то есть 192.168.225.0/24 в моем случае. Чтобы получить доступ к виртуальным машинам с других удаленных хостов, мы должны настроить общедоступный мост, который работает в хост-сети и использует любой внешний DHCP-сервер, находящийся в хост-сети.

Проще говоря, мы собираемся заставить все виртуальные машины использовать ту же серию IP-адресов, что и хост-система.

Перед настройкой общедоступной мостовой сети нам следует отключить Netfilter по соображениям производительности и безопасности. Netfilter в настоящее время включен на мостах по умолчанию.

Чтобы отключить сетевой фильтр, создайте файл с именем /etc/sysctl.d/bridge.conf:

vi /etc/sysctl.d/bridge.conf

Добавьте следующие строки:

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 :

vi /etc/udev/rules.d/99-bridge.rules

Добавьте следующую строку:

ACTION=="add", SUBSYSTEM=="module", KERNEL=="br_netfilter", RUN+="/sbin/sysctl -p /etc/sysctl.d/bridge.conf"

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

Далее нам следует отключить сеть по умолчанию, которую KVM установил для себя.

Найдите имена сетевых интерфейсов KVM по умолчанию с помощью команды «ip link»:

ip link

Пример вывода:

1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN mode DEFAULT group default qlen 1000
    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
2: enp0s3: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc fq_codel state UP mode DEFAULT group default qlen 1000
    link/ether 08:00:27:b7:3a:84 brd ff:ff:ff:ff:ff:ff
3: enp0s8: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc fq_codel state UP mode DEFAULT group default qlen 1000
    link/ether 08:00:27:2a:be:53 brd ff:ff:ff:ff:ff:ff
4: enp0s9: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc fq_codel state UP mode DEFAULT group default qlen 1000
    link/ether 08:00:27:41:91:4d brd ff:ff:ff:ff:ff:ff
5: virbr0: <NO-CARRIER,BROADCAST,MULTICAST,UP> mtu 1500 qdisc noqueue state DOWN mode DEFAULT group default qlen 1000
    link/ether 52:54:00:5b:a4:cd brd ff:ff:ff:ff:ff:ff
6: virbr0-nic: <BROADCAST,MULTICAST> mtu 1500 qdisc fq_codel master virbr0 state DOWN mode DEFAULT group default qlen 1000
    link/ether 52:54:00:5b:a4:cd brd ff:ff:ff:ff:ff:ff

Просмотр сетевых интерфейсов KVM по умолчанию с помощью команды ip в CentOS

Как вы видите в приведенном выше выводе, записи virbr0 и virbr0-nic представляют собой сети KVM.

Давайте удалим сеть KVM по умолчанию с помощью команды:

virsh net-destroy default

Пример вывода:

Network default destroyed

Отмените определение сети по умолчанию с помощью команды:

virsh net-undefine default

Пример вывода:

Network default has been undefined

Удалите сетевые интерфейсы KVM по умолчанию с помощью команды virsh.

Если приведенные выше команды по какой-либо причине не работают, вы можете использовать эти команды, чтобы отключить и отменить определение сети KVM по умолчанию:

ip link delete virbr0 type bridge
ip link delete virbr0-nic

Теперь снова запустите ip link, чтобы проверить, действительно ли удалены интерфейсы virbr0 и virbr0-nic:

ip link

Пример вывода:

1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN mode DEFAULT group default qlen 1000
    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
2: enp0s3: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc fq_codel state UP mode DEFAULT group default qlen 1000
    link/ether 08:00:27:b7:3a:84 brd ff:ff:ff:ff:ff:ff
3: enp0s8: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc fq_codel state UP mode DEFAULT group default qlen 1000
    link/ether 08:00:27:2a:be:53 brd ff:ff:ff:ff:ff:ff
4: enp0s9: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc fq_codel state UP mode DEFAULT group default qlen 1000
    link/ether 08:00:27:41:91:4d brd ff:ff:ff:ff:ff:ff

Что ж, сети KVM по умолчанию исчезли.

Теперь давайте настроим общедоступный мост KVM, который будет использоваться при создании новой виртуальной машины.

Создайте новый мостовой интерфейс с именем br0 с помощью команды nmcli:

nmcli connection add type bridge autoconnect yes con-name br0 ifname br0

Установите IP-адрес для интерфейса моста:

nmcli connection modify br0 ipv4.addresses 192.168.225.53/24 ipv4.method manual

Установите шлюз для интерфейса моста:

nmcli connection modify br0 ipv4.gateway 192.168.225.1

Установите DNS для интерфейса моста:

nmcli connection modify br0 ipv4.dns 192.168.225.1

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

Обратите внимание: если на вашем сервере имеется только один сетевой адаптер и вы получаете доступ к серверу через SSH, ваше соединение будет прервано после удаления сетевого адаптера. Я предлагаю вам выполнить следующие шаги в консоли вашего сервера.

Например, я собираюсь добавить интерфейс enp0s8 в качестве подчиненного к интерфейсу моста br0.

Чтобы удалить сетевой интерфейс enp0s8, запустите:

nmcli connection del enp0s8

Замените enp0s8 на свою сетевую карту.

Примечание. Не используйте карты беспроводного сетевого интерфейса в качестве мостов. Большинство беспроводных интерлейсов не поддерживают мостовое соединение. Всегда используйте проводные сетевые интерфейсы для бесперебойного подключения!

Затем добавьте enp0s8 в мост с помощью команды:

nmcli connection add type bridge-slave autoconnect yes con-name enp0s8 ifname enp0s8 master br0

Здесь сетевой интерфейс моста br0 подключен к сетевому интерфейсу хоста enp0s8. Замените имена указанных выше сетевых интерфейсов, соответствующие вашей сети.

Перезапустите сетевой менеджер, чтобы изменения вступили в силу:

systemctl restart NetworkManager

Если есть возможность, лучше перезагрузить систему:

reboot

Войдите на свой сервер и проверьте, присвоен ли IP-адрес интерфейсу моста:

ip a

Пример вывода:

1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000
    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
    inet 127.0.0.1/8 scope host lo
       valid_lft forever preferred_lft forever
    inet6 ::1/128 scope host 
       valid_lft forever preferred_lft forever
2: enp0s3: <BROADCAST,MULTICAST> mtu 1500 qdisc fq_codel state DOWN group default qlen 1000
    link/ether 08:00:27:b7:3a:84 brd ff:ff:ff:ff:ff:ff
3: enp0s8: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc fq_codel master br0 state UP group default qlen 1000
    link/ether 08:00:27:2a:be:53 brd ff:ff:ff:ff:ff:ff
4: enp0s9: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc fq_codel state UP group default qlen 1000
    link/ether 08:00:27:41:91:4d brd ff:ff:ff:ff:ff:ff
5: br0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP group default qlen 1000
    link/ether 08:00:27:2a:be:53 brd ff:ff:ff:ff:ff:ff
    inet 192.168.225.53/24 brd 192.168.225.255 scope global noprefixroute br0
       valid_lft forever preferred_lft forever
    inet6 2409:4072:6084:198:df03:d9ed:62eb:df34/64 scope global noprefixroute 
       valid_lft forever preferred_lft forever
    inet6 fe80::e8c8:e98b:7fef:5874/64 scope link noprefixroute 
       valid_lft forever preferred_lft forever

Проверьте IP-адрес моста KVM из командной строки в Linux

Как видно из приведенного выше вывода, мостовому сетевому интерфейсу br0 назначен IP-адрес 192.168.225.53 и enp0s8 . запись теперь имеет запись master br0. Это означает, что enp0s8 принадлежит мосту.

Вы также можете использовать команду bridge, чтобы показать состояние моста:

# bridge link show br0
3: enp0s8: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 master br0 state forwarding priority 32 cost 100

Мы успешно создали интерфейс моста, и он активен. Нам нужно сделать еще одну вещь.

Нам следует настроить KVM для использования этого мостового интерфейса в качестве интерфейса по умолчанию. Для этого создайте файл XML с именем host-bridge.xml:

vi host-bridge.xml

Добавьте следующие строки:

<network>
  <name>host-bridge</name>
  <forward mode="bridge"/>
  <bridge name="br0"/>
</network>

Выполните следующие команды, чтобы запустить вновь созданный мост и сделать его мостом по умолчанию для виртуальных машин:

virsh net-define host-bridge.xml
virsh net-start host-bridge
virsh net-autostart host-bridge

Настройте KVM для использования мостового интерфейса в качестве интерфейса по умолчанию для всех виртуальных машин.

Проверьте, активен ли мост и запущен ли он с помощью команды:

virsh net-list --all

Пример вывода:

Name          State    Autostart   Persistent
------------------------------------------------
 host-bridge   active   yes         yes

Проверьте состояние хост-моста KVM с помощью команды virsh

Поздравляем! Мы успешно установили и настроили KVM на безголовом сервере CentOS 8.

2. Создание гостевых машин KVM и управление ими.

Мы можем создавать виртуальные машины и управлять ими либо из командной строки, либо с помощью любых инструментов управления KVM, таких как Cockpit и Virt-manager. Дополнительные сведения см. в следующих руководствах.

  • Как управлять виртуальными машинами KVM с помощью программы Virsh
  • Управление виртуальными машинами KVM с помощью веб-консоли Cockpit
  • Как управлять виртуальными машинами KVM с помощью Virt-Manager

3. Включите доступ к консоли Virsh для виртуальных машин.

После создания гостей KVM я могу получить к ним доступ через SSH, клиент VNC, Virt-viewer, Virt-manager, веб-консоль Cockpit и т. д. Но я не смог получить к ним доступ с помощью команды virsh console. . Чтобы получить доступ к гостям KVM с помощью «консоли virsh», обратитесь к следующему руководству:

  • Как включить доступ к консоли Virsh для гостей KVM

Другие руководства по KVM в этом блоге

  • Установка и настройка KVM на безголовом сервере Ubuntu 20.04
  • Установка и настройка KVM в OpenSUSE Tumbleweed
  • Создание виртуальной машины KVM с использованием образа Qcow2 в Linux
  • Как перенести виртуальные машины Virtualbox в виртуальные машины KVM в Linux
  • Включить поддержку UEFI для виртуальных машин KVM в Linux
  • Как включить вложенную виртуализацию в KVM в Linux
  • Отображение статистики систем виртуализации с помощью Virt-top в Linux
  • Как узнать IP-адрес виртуальной машины KVM
  • Как переименовать гостевую виртуальную машину KVM
  • Доступ к образам дисков виртуальных машин и их изменение с помощью Libguestfs
  • Быстро создавайте образы виртуальных машин с помощью Virt-builder
  • Как спасти виртуальные машины с помощью Virt-Rescue
  • Как увеличить размер диска виртуальной машины KVM в Linux
  • Настройка общей папки между хостом и гостем KVM
  • Как изменить расположение пула хранения данных KVM Libvirt по умолчанию
  • [Решено] Невозможно получить доступ к файлу хранилища, в разрешении отказано. Ошибка в KVM Libvirt
  • Как экспортировать и импортировать виртуальные машины KVM в Linux

Заключение

В этом руководстве мы обсудили, как установить и настроить KVM в серверной версии CentOS 8.

Мы также рассмотрели, как создавать виртуальные машины KVM и управлять ими из командной строки с помощью инструмента virsh и инструментов с графическим интерфейсом под названием Cockpit и Virt-manager.

Наконец, мы увидели, как включить доступ к консоли virsh для виртуальных машин KVM.

На этом этапе у вас должна быть полностью работающая среда виртуализации на вашем сервере CentOS 8.

Ресурс:

  • Веб-сайт KVM

Статьи по данной тематике