Установите и настройте 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