Серверное оборудование для бизнеса — надёжные решения для любых задач Подробнее →
Статья

KVM и libvirt: виртуализация без GUI

KVM и libvirt: виртуализация без GUI

VMware стоит денег, VirtualBox — для рабочего стола, а Proxmox тащит за собой целый веб-стек. Иногда нужно просто поднять несколько виртуальных машин на голом сервере без лишних зависимостей и красивых панелей. KVM + libvirt — это именно тот вариант: производительная виртуализация уровня ядра с управлением через командную строку.

Проверка поддержки виртуализации

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

grep -c 'vmx|svm' /proc/cpuinfo
# Если 0 — аппаратная виртуализация недоступна или отключена в BIOS

Проверка через специальный инструмент:

sudo apt install cpu-checker
sudo kvm-ok
# INFO: /dev/kvm exists
# KVM acceleration can be used

Установка KVM и libvirt

# Ubuntu/Debian
sudo apt update
sudo apt install -y qemu-kvm libvirt-daemon-system libvirt-clients bridge-utils virtinst

# Добавляем пользователя в группы
sudo usermod -aG libvirt $USER
sudo usermod -aG kvm $USER

# Перелогиниться или применить без перезапуска:
newgrp libvirt

# Проверяем статус
sudo systemctl enable --now libvirtd
virsh list --all

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

Скачиваем образ и создаём VM с помощью virt-install:

# Скачиваем Ubuntu Server
wget https://releases.ubuntu.com/22.04/ubuntu-22.04.3-live-server-amd64.iso 
  -O /var/lib/libvirt/images/ubuntu-22.04.iso

# Создаём диск
qemu-img create -f qcow2 /var/lib/libvirt/images/vm1.qcow2 20G

# Устанавливаем VM
virt-install 
  --name vm1 
  --ram 2048 
  --vcpus 2 
  --disk path=/var/lib/libvirt/images/vm1.qcow2,format=qcow2 
  --cdrom /var/lib/libvirt/images/ubuntu-22.04.iso 
  --network network=default 
  --graphics none 
  --console pty,target_type=serial 
  --extra-args 'console=ttyS0,115200n8 serial'

Основные команды virsh

# Список всех VM
virsh list --all

# Запустить / остановить / перезапустить
virsh start vm1
virsh shutdown vm1
virsh reboot vm1

# Принудительное выключение (аналог выдернуть шнур)
virsh destroy vm1

# Подключиться к консоли
virsh console vm1

# Информация о VM
virsh dominfo vm1

# Снапшот
virsh snapshot-create-as vm1 snap1 "Before update"
virsh snapshot-list vm1
virsh snapshot-revert vm1 snap1

Настройка сети: bridge

По умолчанию libvirt использует NAT-сеть. Для доступа к VM из локальной сети нужен bridge:

# /etc/netplan/00-installer-config.yaml
network:
  ethernets:
    eno1:
      dhcp4: false
  bridges:
    br0:
      interfaces: [eno1]
      dhcp4: true
      parameters:
        stp: false
        forward-delay: 0

sudo netplan apply

Создаём libvirt-сеть с этим bridge:

cat > bridge-network.xml << 'EOF'
<network>
  <name>bridge-net</name>
  <forward mode="bridge"/>
  <bridge name="br0"/>
</network>
EOF

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

Клонирование и шаблоны

Самый быстрый способ развернуть новую VM — клонировать готовый шаблон:

# Готовим шаблон (устанавливаем пакеты, настраиваем)
# Выключаем шаблонную VM
virsh shutdown template-vm

# Клонируем
virt-clone 
  --original template-vm 
  --name new-vm 
  --file /var/lib/libvirt/images/new-vm.qcow2

virsh start new-vm

Итог

KVM + libvirt — зрелая, проверенная временем платформа, которая используется в основе многих облачных провайдеров, включая OpenStack. Отсутствие GUI компенсируется полным контролем через CLI и возможностью автоматизации через скрипты.

3 Ответа

  1. Хорошая шпаргалка, особенно раздел про bridge-сеть — это первое с чем путаются новички когда хотят достучаться до VM из локалки. Советую также глянуть в сторону virsh domxml-from-native для конвертации qemu-команд в XML-конфиги.

  1. Для хранения дисков VM лучше сразу смотреть в сторону LVM-томов вместо qcow2 на обычной FS — производительность I/O заметно лучше, особенно для баз данных.

  1. Снапшоты через virsh удобны, но с qcow2 они заметно замедляют дисковые операции при большой глубине цепочки — старайтесь не накапливать больше 3−4 снапшотов на машину.