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