KVM + libvirt в production: от голого железа до живой миграции
Меня зовут Семёнов Евгений Сергеевич, директор АйТи Фреш. За 15+ лет эксплуатации Linux-серверов я пришёл к простому правилу: если вам нужна гибкая виртуализация без лицензионных отчислений и вы умеете читать логи, KVM+libvirt — лучший выбор. В отличие от готовых решений вроде VMware ESXi или Proxmox, чистый KVM требует понимания того, что вы делаете, но взамен даёт полный контроль и производительность, близкую к bare-metal.
Почему KVM+libvirt, а не Proxmox или ESXi
Прежде чем поставить голый KVM, стоит понять, зачем это нужно. Proxmox VE — отличное решение, когда вам нужен веб-интерфейс из коробки и кластеризация без возни. VMware ESXi — выбор корпоратов с бюджетом на лицензии и желанием получить сертифицированную поддержку. Но у обоих есть минусы.
Proxmox навязывает свою модель кластера с corosync и ограничивает в выборе storage. ESXi с 2024 года становится всё менее дружелюбным к малому бизнесу по лицензиям, а после сделки Broadcom — и того хуже. Голый KVM+libvirt даёт свободу: любая сеть, любой storage, любой оркестратор сверху (OpenStack, oVirt, Harvester) или вообще ручное управление через virsh.
Подготовка железа и BIOS
Я всегда начинаю с проверки железа. Минимум для прод-хоста: серверный процессор с поддержкой Intel VT-x/VT-d или AMD-V/AMD-Vi, включённые в BIOS. Плюс оперативная память с ECC — без неё один битфлип в памяти положит виртуалку с базой данных.
У нас на практике типовой прод-сервер — это Dell PowerEdge R750 с парой Xeon Platinum 8280 (28 ядер/56 потоков на сокет), 384 ГБ DDR4 ECC, RAID-контроллер PERC H755 с BBU и NVMe-дисками в RAID-10. Сеть — 40G Mellanox ConnectX-5, обязательно в bond с LACP для отказоустойчивости. Такая конфигурация тянет 30-40 средних виртуалок без напряга.
# Проверка поддержки виртуализации на Ubuntu/Debian
egrep -c '(vmx|svm)' /proc/cpuinfo
# Должно быть больше нуля
# Проверка IOMMU для passthrough
dmesg | grep -e DMAR -e IOMMU
lsmod | grep kvm
Установка KVM и libvirt на Ubuntu 24.04
Я предпочитаю Ubuntu Server LTS как хост-ОС — долгая поддержка, свежие ядра в HWE, огромное сообщество. Debian тоже хорош, но обновляется консервативнее.
sudo apt update && sudo apt upgrade -y
sudo apt install -y qemu-kvm libvirt-daemon-system libvirt-clients \
bridge-utils virt-manager virtinst cpu-checker ovmf cloud-image-utils
# Проверка готовности
sudo kvm-ok
sudo systemctl enable --now libvirtd
sudo usermod -aG libvirt,kvm $USER
newgrp libvirt
После этого стоит перезапустить сессию. Команда virsh list --all должна показать пустой список без ошибок.
Сеть: bridge вместо NAT
По умолчанию libvirt создаёт NAT-сеть default. Для прода это не годится — виртуалки должны быть в той же подсети, что и хост, чтобы коллеги могли к ним обращаться напрямую. Настраиваем bridge через netplan:
# /etc/netplan/01-br0.yaml
network:
version: 2
renderer: networkd
ethernets:
eno1:
dhcp4: no
bridges:
br0:
interfaces: [eno1]
dhcp4: no
addresses: [192.168.10.10/24]
routes:
- to: default
via: 192.168.10.1
nameservers:
addresses: [192.168.10.1, 1.1.1.1]
parameters:
stp: false
forward-delay: 0
sudo netplan apply
# Создаём libvirt-сеть с этим bridge
cat > /tmp/br0.xml <<EOF
<network>
<name>br0-net</name>
<forward mode="bridge"/>
<bridge name="br0"/>
</network>
EOF
sudo virsh net-define /tmp/br0.xml
sudo virsh net-autostart br0-net
sudo virsh net-start br0-net
Storage: LVM и qcow2-пулы
Для продакшна я делаю два storage-пула. Первый — LVM на RAID-10 для виртуалок с БД и нагруженных сервисов. Второй — qcow2-файлы на ZFS для менее требовательных машин, где важна мобильность.
| Пул | Тип | Для чего | Снимки |
|---|---|---|---|
| fast-lvm | LVM thin pool | БД, высокая нагрузка | LVM snapshots |
| bulk-qcow2 | dir на ZFS dataset | Офисные ВМ, dev | qcow2 internal + ZFS |
| iso-pool | dir | Дистрибутивы и образы | — |
# Создание LVM thin pool
sudo pvcreate /dev/nvme0n1p1 /dev/nvme1n1p1
sudo vgcreate vg_kvm /dev/nvme0n1p1 /dev/nvme1n1p1
sudo lvcreate -L 1.5T -T vg_kvm/thin_kvm
# Регистрация пула в libvirt
sudo virsh pool-define-as fast-lvm logical --source-name vg_kvm --target /dev/vg_kvm
sudo virsh pool-autostart fast-lvm
sudo virsh pool-start fast-lvm
Создание первой виртуалки
Удобнее всего через cloud-init. Скачиваем официальный cloud-образ Ubuntu, клонируем, пишем user-data и запускаем:
cd /var/lib/libvirt/images
sudo wget https://cloud-images.ubuntu.com/noble/current/noble-server-cloudimg-amd64.img
sudo qemu-img resize noble-server-cloudimg-amd64.img 40G
# user-data
cat > user-data <<EOF
#cloud-config
hostname: web01
users:
- name: admin
sudo: ALL=(ALL) NOPASSWD:ALL
ssh_authorized_keys:
- ssh-ed25519 AAAA...
package_update: true
packages: [nginx, htop]
EOF
cloud-localds user-data.img user-data
sudo virt-install --name web01 --memory 4096 --vcpus 2 \
--disk noble-server-cloudimg-amd64.img,bus=virtio \
--disk user-data.img,device=cdrom \
--os-variant ubuntu24.04 --network network=br0-net,model=virtio \
--graphics none --console pty,target_type=serial --noautoconsole --import
Живая миграция между хостами
Это одна из киллер-фич KVM. Переносить работающую виртуалку с одного хоста на другой без простоя — именно то, ради чего люди платят за VMware vMotion. В KVM всё то же самое, только бесплатно.
Требования: общий storage (NFS или iSCSI с multipath), одинаковая версия QEMU на обоих хостах, совместимые CPU (или явное указание --cpu host-passthrough с флагами migratable=on), открытые порты 49152-49215 для TCP.
# На каждом хосте /etc/libvirt/qemu.conf
# migration_host = "10.0.0.11" (IP миграционного интерфейса)
# Миграция ВМ web01 с host1 на host2
virsh migrate --live --persistent --undefinesource --copy-storage-all \
web01 qemu+ssh://host2/system
В офисах мы обычно выделяем отдельный VLAN на 40G Mellanox именно под миграцию — это позволяет переносить виртуалку с 32 ГБ RAM за 15-20 секунд без видимых задержек для пользователей.
Бэкапы через virtnbdbackup
Встроенного резервного копирования в libvirt нет. Раньше делали через блокирующие virsh snapshot + virsh backup-begin, сейчас удобнее через virtnbdbackup — утилита использует QEMU NBD и dirty bitmaps для инкрементальных бэкапов без остановки ВМ.
sudo apt install virtnbdbackup
# Полный бэкап
sudo virtnbdbackup -d web01 -l full -o /backup/web01
# Инкрементальный (требует установленного dirty bitmap)
sudo virtnbdbackup -d web01 -l inc -o /backup/web01
# Восстановление
sudo virtnbdrestore -i /backup/web01 -o /var/lib/libvirt/images/restored
Мониторинг KVM-хоста
Минимальный набор для прода: node_exporter + libvirt_exporter + Grafana. Метрики, которые я всегда держу на виду:
- CPU steal time — если больше 3%, хост перегружен по CPU.
- Memory ballooning — активный балуннинг обычно означает нехватку RAM.
- I/O wait на дисках ВМ — выше 10% стабильно = проблемы с хранилищем.
- Network errors/drops на bridge-интерфейсах.
- Temperature CPU и дисков через
lm-sensorsиsmartctl.
Кейс: перевод офиса логистической компании
Осенью 2025 года мы перевели клиента — логистическая компания на 75 сотрудников в Москве — с физической инфраструктуры на два KVM-хоста. Стояли две «железки»: почтовый Exim, 1С сервер, Asterisk, файлопомойка и контроллер домена, все на отдельных серверах разной свежести. Один из серверов был 2015 года и периодически перезагружался сам по себе.
Купили два Dell PowerEdge R750 с Xeon Platinum 8280, 192 ГБ RAM и NVMe RAID-10 на 4 ТБ каждый, разместили в дата-центре МТС. На первый хост P2V-мигрировали все пять серверов через virt-p2v, настроили живую миграцию и регулярный бэкап на NFS. Второй хост работает как резерв: в случае отказа первого виртуалки запускаются вручную с общего NFS за 5 минут.
За семь месяцев — ни одного простоя из-за железа. Стоимость всего проекта: 1 650 000 руб. (два сервера + работа), плюс 22 000 руб./мес за место в стойке и канал. Клиент экономит на лицензиях VMware около 400 000 руб./год и имеет полный контроль над инфраструктурой.
Развернём KVM-хост или кластер под ключ
Подберём серверы Dell или HPE, смонтируем в дата-центре МТС, настроим KVM+libvirt с живой миграцией, бэкапами и мониторингом. Срок: 5-10 рабочих дней. Сопровождаем и обновляем инфраструктуру на постоянной основе.
Телефон: +7 903 729-62-41
Telegram: @ITfresh_Boss
Семёнов Евгений Сергеевич, директор АйТи Фреш
FAQ — частые вопросы по KVM и libvirt
- Чем KVM отличается от Proxmox?
- KVM — модуль ядра Linux, libvirt — API для управления. Proxmox VE — готовый дистрибутив поверх Debian+KVM+LXC с веб-интерфейсом. Чистый KVM+libvirt гибче, но требует ручной настройки.
- Нужен ли аппаратный RAID для KVM-хоста?
- В проде — обязательно. Либо аппаратный RAID-контроллер с BBU, либо ZFS/mdadm RAID-10.
- Какой storage-пул лучше для ВМ: qcow2 или LVM?
- LVM даёт лучшую производительность. qcow2 удобнее для мобильности. Для прода с нагрузкой — LVM, для dev — qcow2.
- Как делать живую миграцию между двумя хостами?
- Нужен общий storage, одинаковые QEMU и совместимые CPU. Команда
virsh migrate --live --persistent --undefinesource. - Как делать бэкап ВМ без остановки?
- Через virtnbdbackup с dirty bitmaps, либо Veeam Agent for Linux в госте.
