«`text

Как использовать KVM виртуализацию? Полное руководство

Виртуализация KVM (Kernel-based Virtual Machine) – это мощная технология виртуализации, встроенная непосредственно в ядро Linux. Она позволяет создавать и запускать несколько виртуальных машин (ВМ) на одном физическом сервере, что значительно повышает эффективность использования ресурсов и снижает затраты. Это руководство, написанное опытным системным администратором, проведет вас через все этапы настройки и использования KVM, начиная с установки и заканчивая оптимизацией производительности. Мы подробно рассмотрим установку необходимых пакетов, создание и настройку виртуальных машин, управление ими, а также устранение распространенных проблем. Независимо от того, являетесь ли вы новичком в виртуализации или опытным пользователем, это руководство предоставит вам все необходимые знания и практические навыки для успешного использования KVM.

Содержание

Устанавливаем KVM и необходимые пакеты

Как использовать KVM виртуализацию? - Installing KVM packages on Ubuntu/Debian/CentOS/RHEL. Show package manager commands for each OS.
Первым шагом является установка необходимых пакетов KVM. Процесс установки немного отличается в зависимости от используемого дистрибутива Linux. Рассмотрим примеры для Ubuntu/Debian и CentOS/RHEL.

Установка на Ubuntu/Debian Для установки KVM и связанных с ним инструментов на Ubuntu или Debian, выполните следующие команды в терминале:

sudo apt update
sudo apt install -y qemu-kvm libvirt-daemon-system libvirt-clients bridge-utils virtinst
* qemu-kvm: Основной пакет для эмуляции KVM. * libvirt-daemon-system: Демон libvirtd, управляющий виртуальными машинами. * libvirt-clients: Клиентские инструменты для управления libvirtd. * bridge-utils: Утилиты для создания сетевых мостов. * virtinst: Инструменты для создания виртуальных машин из командной строки.
VPS хостинг

Виртуальные серверы с гарантированными ресурсами

Выбрать VPS

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

egrep -c '(vmx|svm)' /proc/cpuinfo
Если вывод команды больше 0, значит виртуализация поддерживается.

Далее, добавьте своего пользователя в группу libvirt, чтобы получить доступ к управлению виртуальными машинами без использования sudo:

sudo usermod -a -G libvirt $USER
newgrp libvirt
Теперь проверьте статус службы libvirtd:

systemctl status libvirtd
Вы должны увидеть, что служба запущена и активна. Если нет, запустите ее:

sudo systemctl start libvirtd
sudo systemctl enable libvirtd
Установка на CentOS/RHEL Для установки KVM на CentOS или RHEL, выполните следующие команды:

sudo yum install -y qemu-kvm libvirt virt-install bridge-utils
* qemu-kvm: Основной пакет для эмуляции KVM. * libvirt: Пакет, содержащий демона libvirtd и клиентские инструменты. * virt-install: Инструменты для создания виртуальных машин из командной строки. * bridge-utils: Утилиты для создания сетевых мостов.

Проверка поддержки виртуализации на процессоре аналогична Ubuntu/Debian:

egrep -c '(vmx|svm)' /proc/cpuinfo
Добавьте своего пользователя в группу libvirt:

sudo usermod -a -G libvirt $USER
newgrp libvirt
Проверьте статус службы libvirtd:

sudo systemctl status libvirtd
Если служба не запущена, запустите и включите ее:

sudo systemctl start libvirtd
sudo systemctl enable libvirtd
**Совет:** Убедитесь, что в BIOS вашего сервера включена виртуализация (Intel VT-x или AMD-V). Без этого KVM не сможет работать.

**Предупреждение:** Неправильная настройка сетевых мостов может привести к потере сетевого подключения на хост-системе. Будьте внимательны при настройке сети!

Виртуализация позволяет эффективно использовать вычислительные ресурсы, снижая потребность в физических серверах и упрощая управление инфраструктурой.

Дмитрий Иванов, системный архитектор
Теперь, когда KVM установлен и настроен, перейдем к созданию первой виртуальной машины.

Создаем первую виртуальную машину

Как использовать KVM виртуализацию? - Screenshot of virt-manager GUI or command line creation of a VM.
Существует несколько способов создания виртуальной машины KVM: с помощью графического интерфейса (virt-manager) или из командной строки (virt-install). Рассмотрим оба варианта.

Создание VM с помощью virt-manager Virt-manager – это графический инструмент для управления виртуальными машинами. Если он еще не установлен, установите его:

sudo apt install -y virt-manager   # Ubuntu/Debian
sudo yum install -y virt-manager   # CentOS/RHEL
Запустите virt-manager:

virt-manager
В главном окне нажмите кнопку «Создать новую виртуальную машину». Следуйте инструкциям мастера. Вам потребуется указать:

  • Имя виртуальной машины.
  • Способ установки операционной системы (ISO-образ, сетевая установка, и т.д.).
  • Объем выделенной оперативной памяти и количество виртуальных процессоров.
  • Размер диска виртуальной машины.
  • Сетевые настройки.
**Пример:** Создание виртуальной машины Ubuntu 20.04 из ISO-образа.

Создание VM с помощью virt-install Virt-install – это утилита командной строки для создания виртуальных машин. Она предоставляет больше гибкости и возможностей для автоматизации.

**Пример:** Создание виртуальной машины CentOS 7 из ISO-образа:

virt-install \
--name=centos7-vm \
--ram=2048 \
--vcpus=2 \
--os-variant=centos7.0 \
--cdrom=/path/to/CentOS-7-x86_64-DVD-2009.iso \
--disk path=/var/lib/libvirt/images/centos7-vm.img,size=20 \
--network bridge=virbr0,model=virtio \
--graphics vnc,listen=0.0.0.0 --noautoconsole
Разберем параметры команды:

  • --name: Имя виртуальной машины (centos7-vm).
  • --ram: Объем выделенной оперативной памяти в МБ (2048).
  • --vcpus: Количество виртуальных процессоров (2).
  • --os-variant: Вариант операционной системы (centos7.0). Укажите наиболее подходящий вариант для вашей ОС. Список доступных вариантов можно получить командой osinfo-query os.
  • --cdrom: Путь к ISO-образу установочного диска (/path/to/CentOS-7-x86_64-DVD-2009.iso). Замените на свой путь.
  • --disk: Параметры диска виртуальной машины. path – путь к файлу образа диска (/var/lib/libvirt/images/centos7-vm.img), size – размер диска в ГБ (20).
  • --network: Настройка сети. bridge=virbr0 – подключение к сетевому мосту virbr0 (по умолчанию), model=virtio – использование драйвера virtio для сетевой карты (обеспечивает лучшую производительность).
  • --graphics: Настройка графического интерфейса. vnc,listen=0.0.0.0 – использование VNC для подключения к виртуальной машине. listen=0.0.0.0 означает, что VNC сервер будет слушать на всех IP-адресах. --noautoconsole отключает автоматическое подключение к консоли.
После выполнения команды начнется процесс установки операционной системы. Вы можете подключиться к виртуальной машине через VNC-клиент, указав IP-адрес хост-системы и порт VNC (по умолчанию 5900). Если вы используете firewall, убедитесь, что порт VNC открыт.

sudo firewall-cmd --permanent --add-port=5900/tcp
sudo firewall-cmd --reload
**Совет:** Используйте драйверы virtio для дисков и сетевых карт в виртуальных машинах. Они обеспечивают значительно лучшую производительность по сравнению с эмулированными драйверами.

**Предупреждение:** Выделение слишком большого количества ресурсов виртуальной машине может привести к снижению производительности хост-системы.

Правильное планирование ресурсов – ключ к успешной виртуализации. Учитывайте потребности как хост-системы, так и виртуальных машин.

Елена Смирнова, DevOps инженер
Теперь, когда вы создали виртуальную машину, перейдем к управлению ими.

Управление виртуальными машинами

Управление виртуальными машинами KVM осуществляется с помощью утилиты virsh (command-line interface for libvirt). Она предоставляет широкий набор команд для выполнения различных операций.

Основные команды virsh * **Список виртуальных машин:**

virsh list --all
Эта команда отображает список всех виртуальных машин, включая запущенные и выключенные.

* **Запуск виртуальной машины:**

virsh start centos7-vm
Замените centos7-vm на имя вашей виртуальной машины.

* **Остановка виртуальной машины:**

virsh shutdown centos7-vm
Эта команда отправляет сигнал ACPI shutdown в виртуальную машину, что позволяет ей корректно завершить работу.

* **Принудительная остановка виртуальной машины:**

virsh destroy centos7-vm
Эта команда немедленно завершает работу виртуальной машины, что может привести к потере данных. Используйте ее только в крайнем случае.

* **Перезагрузка виртуальной машины:**

virsh reboot centos7-vm
* **Подключение к консоли виртуальной машины:**

virsh console centos7-vm
Эта команда позволяет подключиться к текстовой консоли виртуальной машины. Для выхода из консоли нажмите Ctrl+].

* **Получение информации о виртуальной машине:**

virsh dominfo centos7-vm
Эта команда отображает подробную информацию о виртуальной машине, включая имя, ID, состояние, использование CPU и памяти.

* **Редактирование конфигурации виртуальной машины:**

virsh edit centos7-vm
Эта команда открывает конфигурационный файл виртуальной машины в текстовом редакторе. Изменение конфигурации может повлиять на работу виртуальной машины, поэтому будьте осторожны.

**Пример конфигурационного файла виртуальной машины (centos7-vm.xml):**

<domain type='kvm' id='1'>
  <name>centos7-vm</name>
  <uuid>9690f123-58c4-4b1e-b917-7b76474930a4</uuid>
  <memory unit='KiB'>2097152</memory>
  <currentMemory unit='KiB'>2097152</currentMemory>
  <vcpu placement='static'>2</vcpu>
  <os>
    <type arch='x86_64' machine='pc-i440fx-rhel7.6.0'>hvm</type>
    <boot dev='cdrom'/>
    <boot dev='hd'/>
  </os>
  <features>
    <acpi/>
    <apic/>
    <vmport state='off'/>
  </features>
  <cpu mode='host-model' check='partial'>
    <model fallback='allow'/>
  </cpu>
  <clock offset='utc'/>
  <on_poweroff>destroy</on_poweroff>
  <on_reboot>restart</on_reboot>
  <on_crash>destroy</on_crash>
  <devices>
    <emulator>/usr/bin/qemu-kvm</emulator>
    <disk type='file' device='disk'>
      <driver name='qemu' type='qcow2'/>
      <source file='/var/lib/libvirt/images/centos7-vm.img'/>
      <target dev='vda' bus='virtio'/>
      <address type='pci' domain='0x0000' bus='0x00' slot='0x04' function='0x0'/>
    </disk>
    <disk type='file' device='cdrom'>
      <driver name='qemu' type='raw'/>
      <source file='/path/to/CentOS-7-x86_64-DVD-2009.iso'/>
      <target dev='hdc' bus='ide'/>
      <readonly/>
      <address type='drive' controller='0' bus='1' target='0' unit='0'/>
    </disk>
    <interface type='bridge'>
      <mac address='52:54:00:7f:b8:e9'/>
      <source bridge='virbr0'/>
      <model type='virtio'/>
      <address type='pci' domain='0x0000' bus='0x00' slot='0x03' function='0x0'/>
    </interface>
    <serial type='pty'>
      <target port='0'/>
    </serial>
    <console type='pty'>
      <target type='serial' port='0'/>
    </console>
    <input type='tablet' bus='usb'/>
    <input type='mouse' bus='ps2'/>
    <graphics type='vnc' port='5900' autoport='no' listen='0.0.0.0'>
      <listen type='address' address='0.0.0.0'/>
    </graphics>
    <sound model='ich6'/>
    <video>
      <model type='cirrus' vram='16384' heads='1' primary='yes'/>
      <address type='pci' domain='0x0000' bus='0x00' slot='0x02' function='0x0'/>
    </video>
    <memballoon model='virtio'>
      <address type='pci' domain='0x0000' bus='0x00' slot='0x05' function='0x0'/>
    </memballoon>
  </devices>
</domain>
Замените /path/to/CentOS-7-x86_64-DVD-2009.iso на актуальный путь к вашему ISO-образу.

**Совет:** Создавайте резервные копии конфигурационных файлов виртуальных машин перед внесением изменений.

**Предупреждение:** Неправильная настройка конфигурации виртуальной машины может привести к ее неработоспособности.

Автоматизация задач управления виртуальными машинами позволяет значительно снизить административные издержки и повысить надежность инфраструктуры.

Red Hat KVM Documentation
Теперь рассмотрим настройку сети для виртуальных машин.

Сети и подключение к VM

Настройка сети является важным аспектом виртуализации. KVM поддерживает различные варианты сетевых конфигураций, включая сетевые мосты (bridged networking) и NAT (Network Address Translation).

Сетевой мост (Bridged Networking) Сетевой мост позволяет виртуальной машине напрямую подключаться к физической сети. Виртуальная машина получает IP-адрес из той же подсети, что и хост-система.

По умолчанию, libvirt создает сетевой мост virbr0 с NAT. Для использования сетевого моста, необходимо создать bridge-интерфейс на хост-системе и назначить ему IP-адрес физического интерфейса.

**Пример настройки сетевого моста на Ubuntu/Debian:**

Предположим, у вас есть сетевой интерфейс enp0s3 с IP-адресом 192.168.1.100. Создайте файл /etc/network/interfaces.d/br0.cfg:

auto br0
iface br0 inet static
    address 192.168.1.100
    netmask 255.255.255.0
    gateway 192.168.1.1
    bridge_ports enp0s3
    bridge_stp off
    bridge_fd 0
    bridge_maxwait 0
Разберем параметры:

  • auto br0: Включает интерфейс br0 при загрузке системы.
  • iface br0 inet static: Указывает, что интерфейс br0 использует статический IP-адрес.
  • address: IP-адрес интерфейса br0 (192.168.1.100).
  • netmask: Маска подсети (255.255.255.0).
  • gateway: IP-адрес шлюза (192.168.1.1).
  • bridge_ports enp0s3: Указывает, что интерфейс enp0s3 является членом моста br0.
  • bridge_stp off: Отключает протокол STP (Spanning Tree Protocol).
  • bridge_fd 0: Устанавливает время пересылки (forward delay) в 0 секунд.
  • bridge_maxwait 0: Устанавливает максимальное время ожидания перед активацией моста в 0 секунд.
Затем отредактируйте файл /etc/network/interfaces, закомментировав или удалив настройки для интерфейса enp0s3:

#auto enp0s3
#iface enp0s3 inet static
#    address 192.168.1.100
#    netmask 255.255.255.0
#    gateway 192.168.1.1
Перезагрузите сетевые интерфейсы:

sudo ifdown enp0s3
sudo ifup br0
Теперь виртуальные машины, подключенные к мосту br0, будут получать IP-адреса из той же подсети, что и хост-система.

**Пример настройки сетевого моста на CentOS/RHEL:**

Создайте файл /etc/sysconfig/network-scripts/ifcfg-br0:

DEVICE=br0
TYPE=Bridge
BOOTPROTO=static
IPADDR=192.168.1.100
NETMASK=255.255.255.0
GATEWAY=192.168.1.1
ONBOOT=yes
Отредактируйте файл /etc/sysconfig/network-scripts/ifcfg-enp0s3 (замените enp0s3 на имя вашего физического интерфейса):

DEVICE=enp0s3
TYPE=Ethernet
BOOTPROTO=none
ONBOOT=yes
BRIDGE=br0
Перезапустите сетевую службу:

sudo systemctl restart network
NAT (Network Address Translation) NAT позволяет виртуальным машинам получать доступ в интернет через IP-адрес хост-системы. Виртуальные машины получают IP-адреса из частной подсети, созданной libvirt (по умолчанию 192.168.122.0/24).

Для использования NAT достаточно подключить виртуальную машину к сетевому мосту virbr0 (по умолчанию). Libvirt автоматически настраивает NAT и маршрутизацию.

**Проверка сетевого подключения:**

Внутри виртуальной машины выполните команду:

ping 8.8.8.8
Если пинг проходит успешно, значит виртуальная машина имеет доступ в интернет.

**Совет:** Используйте DNSmasq для автоматического назначения IP-адресов виртуальным машинам в сети NAT.

**Предупреждение:** Неправильная настройка маршрутизации может привести к недоступности виртуальных машин извне.

Правильная настройка сети – залог стабильной и безопасной работы виртуальной инфраструктуры.

Ubuntu KVM Documentation
Теперь перейдем к оптимизации производительности KVM.

Оптимизация производительности KVM

Оптимизация производительности KVM – важный этап, позволяющий получить максимальную отдачу от виртуализации. Существует несколько способов улучшить производительность виртуальных машин.

Использование драйверов VirtIO VirtIO – это набор драйверов виртуализации, разработанных для улучшения производительности виртуальных машин. Они обеспечивают прямую связь между виртуальной машиной и хост-системой, минимизируя накладные расходы на эмуляцию.

Убедитесь, что при создании виртуальной машины вы используете драйверы VirtIO для дисков и сетевых карт. В большинстве дистрибутивов Linux драйверы VirtIO устанавливаются по умолчанию. Если это не так, установите их вручную:

sudo apt install -y virtio-blk virtio-net  # Ubuntu/Debian
sudo yum install -y virtio-win            # CentOS/RHEL (для Windows VM)
Выделение ресурсов CPU и памяти Правильное выделение ресурсов CPU и памяти играет важную роль в производительности виртуальных машин. Выделите достаточное количество ресурсов для каждой виртуальной машины, но не переусердствуйте, чтобы не снизить производительность хост-системы.

* **CPU:** Выделите каждой виртуальной машине столько виртуальных процессоров, сколько ей необходимо для выполнения задач. Начните с небольшого количества и увеличьте, если это необходимо. * **Память:** Выделите каждой виртуальной машине достаточно оперативной памяти, чтобы она могла работать без использования swap. Избегайте выделения слишком большого объема памяти, так как это может привести к снижению производительности хост-системы.

Вы можете изменить количество выделенных ресурсов CPU и памяти с помощью команды virsh edit или в графическом интерфейсе virt-manager.

Использование KVM-clock KVM-clock – это виртуальный источник времени, разработанный для повышения точности времени в виртуальных машинах. Он обеспечивает более стабильную и точную синхронизацию времени по сравнению с эмулированными источниками времени.

Чтобы включить KVM-clock, добавьте следующие строки в конфигурационный файл виртуальной машины (с помощью virsh edit):

<clock offset='utc'>
    <timer name='kvmclock' present='yes'/>
</clock>
**При