Установка виртуальных машин QEMU/KVM на рабочей станции или сервере

некоторые особенности и нюансы по установке виртуальных машин на рабочей станции

Зачем я использую виртуализацию?

Виртуализация — это когда на одном физическом компьютере работает несколько отдельных компьютеров одновременно. Или скорее мне это понадобилось, когда активно изучал загрузчик GRUB со всеми тонкостями. Так вообще хватает контейнеров, но для тестирования новой версии linux отличная идея.

Как это работает:

  • Есть реальный компьютер (хост)
  • На нём запускают специальную программу (гипервизор)
  • Эта программа создаёт виртуальные компьютеры (гостевые ВМ)
  • Каждая ВМ имеет свой процессор, память, диск, сеть (виртуальные)

Зачем нужно:

  • Тестирование ПО без риска для основной системы
  • Запуск Windows на Linux и наоборот
  • Изоляция приложений

VirtualBox

Что это: Программа для виртуализации от Oracle. Бесплатная, простая, кроссплатформенная.

vb

Плюсы:

  • Очень простой интерфейс
  • Работает на Windows, Linux, macOS
  • Подходит для новичков
  • Не требует включения VT-x в BIOS (это конструктивные особенности материнской платы вашего компьютера поддерживать виртуализацию, зайдите в BIOS и включите ее если она выключена)

Минусы:

  • Медленнее чем KVM
  • Проблемы с 3D-графикой
  • Нет официальной поддержки в RHEL/CentOS (для меня не так существенно, хоть и очень люблю fedora)

virt-manager (KVM/QEMU)

Что это: Графическая программа для управления виртуализацией KVM/QEMU в Linux. Стандарт для RHEL/Fedora/CentOS.

vm

Плюсы:

  • Очень высокая производительность (почти как на реальном железе)
  • Встроен в ядро Linux
  • Поддержка огромных серверных конфигураций
  • Тонкая настройка всех параметров

Минусы:

  • Только для Linux
  • Сложнее для новичков
  • Требует включения виртуализации в BIOS (я про это написал выше)

Можно использовать: Для серверов, production-среды, ресурсоёмких ВМ, работы с Docker и Podman вместе с ВМ.

Установка VirtualBox на Fedora — пошаговая инструкция

Шаг 1: Удалите старые версии (если были)

sudo dnf remove VirtualBox virtualbox

Шаг 2: Установите зависимости

sudo dnf install kernel-devel kernel-headers dkms gcc make perl elfutils-libelf-devel

Важно: Перезагрузите систему после установки kernel-devel:

sudo reboot

Шаг 3: Добавьте репозиторий VirtualBox

sudo dnf config-manager --add-repo https://download.virtualbox.org/virtualbox/rpm/fedora/virtualbox.repo

Если нет config-manager:

sudo dnf install dnf-plugins-core

Шаг 4: Импортируйте ключ GPG

sudo rpm --import https://www.virtualbox.org/download/oracle_vbox.asc

Шаг 5: Установите VirtualBox

sudo dnf install VirtualBox-7.2.6

Шаг 6: Добавьте пользователя в группу vboxusers

sudo usermod -aG vboxusers $USER

Шаг 7: Соберите модули ядра

sudo /sbin/vboxconfig

Шаг 8: Перезагрузите систему

sudo reboot

Шаг 9: Проверьте установку

# Проверить загрузку модулей
lsmod | grep vbox

# Запустить VirtualBox
virtualbox

Если Secure Boot включён — два варианта:

Вариант А — Отключить Secure Boot (проще)

  1. Войдите в BIOS/UEFI (F2, F10, F12, Del)
  2. Найдите Secure Boot → Disable
  3. Сохраните и выйдите

Вариант Б — Подписать модули (безопаснее)

sudo dnf install kmodtool
sudo kmodgenca -a
sudo mokutil --import /etc/pki/akmods/certs/public_key.der
sudo reboot

При загрузке появится синий экран MOK — выберите “Enroll MOK” и подтвердите.

Установка Extension Pack (дополнительно)

Для USB 2.0/3.0, RDP, NVMe:

wget https://download.virtualbox.org/virtualbox/7.2.6/Oracle_VM_VirtualBox_Extension_Pack-7.2.6.vbox-extpack
sudo VBoxManage extpack install Oracle_VM_VirtualBox_Extension_Pack-7.2.6.vbox-extpack

Версию уточните на virtualbox.org


Гостевые дополнения (Guest Additions)

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

Устройства → Подключить образ Guest Additions → Запустить

Проверка после установки:

vboxmanage --version
systemctl status vboxdrv
groups | grep vboxusers

VirtualBox установлен и готов к созданию виртуальных машин.

Установка QEMU/KVM на Fedora — пошаговая инструкция

Шаг 1: Проверьте поддержку виртуализации

# Проверка, включена ли виртуализация в BIOS
grep -E "vmx|svm" /proc/cpuinfo

Если есть вывод с vmx (Intel) или svm (AMD) — виртуализация включена.

Если вывод пустой:

  • Войдите в BIOS/UEFI (F2, F10, F12, Del)
  • Включите Intel VT-x / AMD-V
  • Сохраните и перезагрузитесь

Шаг 2: Установите группу пакетов виртуализации

sudo dnf install @virtualization

Эта команда установит:

  • qemu-kvm — основной эмулятор
  • libvirt — управление виртуализацией
  • virt-manager — графический интерфейс
  • virt-install — создание ВМ из терминала
  • И другие необходимые компоненты

Шаг 3: Запустите и включите службу libvirtd

sudo systemctl start libvirtd
sudo systemctl enable libvirtd

Шаг 4: Добавьте пользователя в группу libvirt

sudo usermod -aG libvirt $USER

Важно! После этой команды нужно выйти из системы и зайти снова или перезагрузить компьютер:

sudo reboot

Шаг 5: Проверьте установку

# Проверить статус службы
systemctl status libvirtd

# Проверить, что пользователь в группе
groups | grep libvirt

# Проверить виртуальную сеть
virsh net-list --all
virsh net-start default
virsh net-autostart default

Шаг 6: Запустите virt-manager

virt-manager

Или через меню приложений

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

Через графический интерфейс (virt-manager):

  1. Нажмите кнопку “Создать новую виртуальную машину”
  2. Выберите источник установки:
    • Локальный ISO-файл
    • Сетевая установка (HTTP/FTP)
    • Импорт существующего образа
  3. Выберите ISO-образ ОС
  4. Настройте RAM и CPU
  5. Создайте виртуальный диск
  6. Завершите настройку и начните установку

Через терминал (virt-install):

sudo virt-install \
  --name fedora-vm \
  --ram 2048 \
  --vcpus 2 \
  --disk path=/var/lib/libvirt/images/fedora-vm.qcow2,size=20 \
  --os-variant fedora38 \
  --network network=default \
  --graphics spice \
  --cdrom /путь/к/fedora.iso

Полезные команды для управления

# Список виртуальных машин
virsh list --all

# Запустить ВМ
virsh start имя_вм

# Остановить ВМ
virsh shutdown имя_вм

# Принудительно выключить
virsh destroy имя_вм

# Удалить ВМ
virsh undefine имя_вм
virsh vol-delete --pool default имя_вм.qcow2

# Войти в консоль ВМ
virsh console имя_вм

Настройка сети (если нужно)

Мост (bridge) для внешнего доступа:

# Создать bridge
nmcli connection add type bridge ifname br0

# Подключить Ethernet к мосту
nmcli connection add type ethernet slave-type bridge con-name bridge-br0 ifname enp0s3 master br0

# Включить мост
nmcli connection up br0

Проброс USB-устройств

В virt-manager:

  1. Откройте настройки ВМ
  2. Добавить оборудование → USB Host Device
  3. Выберите устройство из списка

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

Включите hugepages:

echo 1024 | sudo tee /proc/sys/vm/nr_hugepages

Используйте virtio драйверы:

  • Диски: virtio-scsi или virtio-blk
  • Сеть: virtio-net
  • Это даёт прирост производительности ~30%

Удаление KVM/libvirt

sudo dnf remove @virtualization
sudo rm -rf /var/lib/libvirt
sudo rm -rf /etc/libvirt

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

  • Виртуализация включена в BIOS
  • Пакеты установлены: dnf groupinfo virtualization
  • Служба работает: systemctl status libvirtd
  • Пользователь в группе: groups | grep libvirt
  • Сеть работает: virsh net-list --all
  • virt-manager запускается

QEMU/KVM установлен и готов к работе.

Команда sudo dnf install @virtualization устанавливает группу пакетов (пакетную группу) для виртуализации.

Что значит @ ?

Символ @ в DNF означает группу пакетов, а не отдельный пакет.

Что устанавливается:

Группа @virtualization включает все необходимые пакеты для работы с KVM/QEMU:

Основные компоненты:

  • qemu-kvm — основной эмулятор
  • libvirt — библиотека для управления виртуализацией
  • virt-install — утилита для создания ВМ из командной строки
  • virt-viewer — клиент для просмотра ВМ
  • virt-manager — графический интерфейс (GUI)
  • libvirt-client — клиентские утилиты
  • libvirt-daemon-config-network — сетевые настройки
  • libvirt-daemon-config-nwfilter — фильтры сети
  • edk2-ovmf — UEFI поддержка
  • guestfs-tools — инструменты для работы с образами дисков

Как посмотреть состав группы:

# Список всех групп
dnf group list

# Информация о группе virtualization
dnf group info virtualization

# Показать пакеты в группе
dnf group info virtualization | grep -E "Mandatory|Default|Optional"

Без GUI (только командная строка):

sudo dnf install @virtualization-headless

Установка отдельных компонентов:

# Только ядро виртуализации
sudo dnf install qemu-kvm libvirt

# Только virt-manager (GUI)
sudo dnf install virt-manager

После установки:

# Запустить libvirtd
sudo systemctl start libvirtd
sudo systemctl enable libvirtd

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

# Проверить установку
virsh list --all

Краткий справочник команд QEMU/KVM (CLI)

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

# Список ВМ
virsh list                 # запущенные
virsh list --all          # все

# Управление состоянием
virsh start vm-name       # запуск
virsh shutdown vm-name    # выключение (ACPI)
virsh destroy vm-name     # принудительно
virsh reboot vm-name      # перезагрузка
virsh reset vm-name       # аппаратный сброс
virsh suspend vm-name     # пауза
virsh resume vm-name      # возобновить

# Удаление
virsh undefine vm-name           # удалить конфиг
virsh undefine --remove-all-storage vm-name  # удалить с диском

# Консоль
virsh console vm-name    # подключиться к serial console
virsh vncdisplay vm-name # показать порт VNC

Создание ВМ (virt-install)

# Базовая установка с ISO
virt-install \
  --name vm-name \
  --ram 2048 \
  --vcpus 2 \
  --disk path=/var/lib/libvirt/images/vm.qcow2,size=20 \
  --os-variant fedora38 \
  --network network=default \
  --graphics spice \
  --cdrom /path/to/os.iso

# Без графики (текстовый режим)
virt-install \
  --name vm-name \
  --ram 2048 \
  --vcpus 2 \
  --disk size=10 \
  --os-variant ubuntu22.04 \
  --network default \
  --graphics none \
  --console pty,target_type=serial \
  --location 'http://archive.ubuntu.com/ubuntu/dists/jammy/main/installer-amd64/'

# Импорт существующего образа
virt-install \
  --name vm-name \
  --ram 2048 \
  --vcpus 2 \
  --disk /var/lib/libvirt/images/existing.qcow2 \
  --import \
  --network default \
  --os-variant fedora38

Управление образами дисков (qemu-img)

# Создать образ
qemu-img create -f qcow2 disk.qcow2 20G

# Информация об образе
qemu-img info disk.qcow2

# Увеличить размер
qemu-img resize disk.qcow2 +10G

# Конвертировать форматы
qemu-img convert -f qcow2 -O raw disk.qcow2 disk.raw

# Создать снапшот (qcow2)
qemu-img snapshot -c snap1 disk.qcow2

# Список снапшотов
qemu-img snapshot -l disk.qcow2

# Откатить снапшот
qemu-img snapshot -a snap1 disk.qcow2

Управление сетью

# NAT сеть (default)
virsh net-list --all
virsh net-start default
virsh net-autostart default

# Создать изолированную сеть
virsh net-define isolated-network.xml
virsh net-start isolated
virsh net-autostart isolated

# Мост (bridge)
brctl show
nmcli connection add type bridge ifname br0
nmcli connection add type ethernet slave-type bridge con-name br0-slave ifname eth0 master br0

# Информация о интерфейсах ВМ
virsh domiflist vm-name
virsh domifaddr vm-name  # IP адреса

isolated-network.xml:

<network>
  <name>isolated</name>
  <bridge name='virbr1'/>
  <ip address='192.168.100.1' netmask='255.255.255.0'>
    <dhcp>
      <range start='192.168.100.10' end='192.168.100.100'/>
    </dhcp>
  </ip>
</network>

Управление хранилищем

# Список пулов
virsh pool-list --all

# Информация о пуле
virsh pool-info default

# Список томов
virsh vol-list --pool default

# Создать том
virsh vol-create-as default newvm.qcow2 20G --format qcow2

# Клонировать том
virsh vol-clone --pool default source.qcow2 clone.qcow2

# Удалить том
virsh vol-delete --pool default vm.qcow2

Настройка ВМ (virsh edit)

# Редактировать конфиг
virsh edit vm-name

# Добавить CPU (горячее подключение)
virsh setvcpus vm-name 4 --live

# Добавить память
virsh setmem vm-name 4G --live

# Добавить диск
virsh attach-disk vm-name /path/to/disk.qcow2 vdb --live

# Отключить диск
virsh detach-disk vm-name vdb

# Добавить сетевой интерфейс
virsh attach-interface vm-name bridge virbr0 --live

# Проброс USB
virsh attach-device vm-name usb-device.xml

usb-device.xml:

<hostdev mode='subsystem' type='usb'>
  <source>
    <vendor id='0x1234'/>
    <product id='0x5678'/>
  </source>
</hostdev>

Снапшоты

# Создать снапшот
virsh snapshot-create-as vm-name snap1 "Описание"

# Список снапшотов
virsh snapshot-list vm-name

# Информация о снапшоте
virsh snapshot-info vm-name --snapshotname snap1

# Откатить
virsh snapshot-revert vm-name snap1

# Удалить снапшот
virsh snapshot-delete vm-name snap1

Мониторинг и отладка

# Статистика
virsh domstats vm-name
virsh dommemstat vm-name
virsh domblkstat vm-name
virsh domifstat vm-name vm-net

# Информация о ВМ
virsh dominfo vm-name
virsh vcpuinfo vm-name
virsh domblklist vm-name
virsh domiflist vm-name

# Логи
journalctl -u libvirtd -f
dmesg | grep -i kvm

Прямой запуск QEMU (без libvirt)

# Минимальный запуск
qemu-system-x86_64 \
  -name vm1 \
  -m 1024 \
  -drive file=disk.qcow2,format=qcow2 \
  -netdev user,id=net0 \
  -device virtio-net-pci,netdev=net0

# С CD-ROM и загрузкой с него
qemu-system-x86_64 \
  -cdrom os.iso \
  -boot d \
  -hda disk.qcow2 \
  -m 2048 \
  -enable-kvm

Полезные однострочники

# Узнать OS-variant
osinfo-query os

# Показать IP всех ВМ
for vm in $(virsh list --name); do echo "$vm: $(virsh domifaddr $vm | grep ipv4 | awk '{print $4}')"; done

# Завершить все ВМ
virsh list --name | xargs -I {} virsh shutdown {}

# Удалить все выключенные ВМ
virsh list --all --name | xargs -I {} virsh undefine {} --remove-all-storage

# Бэкап диска ВМ
virsh dumpxml vm-name > vm-backup.xml
cp /var/lib/libvirt/images/vm.qcow2 vm-backup.qcow2

Краткий справочник

ДействиеКоманда
Создать ВМvirt-install ...
Запуститьvirsh start vm
Остановитьvirsh shutdown vm
Удалитьvirsh undefine --remove-all-storage vm
Список ВМvirsh list --all
Консольvirsh console vm
Создать дискqemu-img create -f qcow2 disk.qcow2 20G
Инфо о дискеqemu-img info disk.qcow2
Редакт. конфигvirsh edit vm
Снапшотvirsh snapshot-create-as vm snap1
Откатvirsh snapshot-revert vm snap1