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

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
: Инструменты для создания виртуальных машин из командной строки. 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 установлен и настроен, перейдем к созданию первой виртуальной машины.Виртуализация позволяет эффективно использовать вычислительные ресурсы, снижая потребность в физических серверах и упрощая управление инфраструктурой.
Дмитрий Иванов, системный архитектор
Создаем первую виртуальную машину

sudo apt install -y virt-manager # Ubuntu/Debian
sudo yum install -y virt-manager # CentOS/RHEL
Запустите virt-manager:
virt-manager
В главном окне нажмите кнопку «Создать новую виртуальную машину». Следуйте инструкциям мастера. Вам потребуется указать:
- Имя виртуальной машины.
- Способ установки операционной системы (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
отключает автоматическое подключение к консоли.
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.
**Предупреждение:** Неправильная настройка маршрутизации может привести к недоступности виртуальных машин извне.
Теперь перейдем к оптимизации производительности KVM.Правильная настройка сети – залог стабильной и безопасной работы виртуальной инфраструктуры.
Ubuntu KVM Documentation
Оптимизация производительности 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>
**При