Настройка виртуализации при помощи KVM

KVM (Kernel-based Virtual Machine) — это программное решение, обеспечивающее виртуализацию в среде Linux с поддержкой аппаратной виртуализации. Домашняя страница проекта Kernel Based Virtual Machine.

RHEL/CentOS исключил из дистрибутива Xen и стал использовать KVM.

Для работы KVM необходима поддержка виртуализации вашим процессором. Это означает, что требуются расширения процессора Intel-­VT(Virtualization Technology) либо AMD SVM (Secure Virtual Machine). Чтобы убедиться, поддерживает ли процессор одно из них, выполните команду:

# egrep '(vmx|svm)' /proc/cpuinfo

Результат больше 0 подразумевает, что виртуализация поддерживается.

KVM позволяет виртуальным машинам использовать немодифицированные образы дисков QEMU, VMware и других, содержащие операционные системы. Каждая виртуальная машина имеет своё собственное виртуальное аппаратное обеспечение: сетевые карты, диск, видеокарту и т.д.

Для проверки своего процессора можно использовать набор утилит cpu-checker, для установки введите в Debian, Ubuntu команду:

sudo apt install cpu-checker

И запустите утилиту kvm-ok

sudo kvm-ok
 
INFO: Your CPU does not support KVM extensions
KVM acceleration can NOT be used

Как вы видите, мой процессор не поддерживает виртуализацию KVM. Где же я нашел такой процессор в 2022 году, спросите вы? Все очень просто команду kvm-ok я запустил на виртуальном сервере (VSP), а не на выделенном сервере (dedicated) как требует технология виртуализации KVM. Ели вы уверены, что используете настоящий:-) физический сервер и видите подобную ошибку - проверьте настройки BIOS, возможно эта опция выключена там.

Подтвердив, что наша система может поддерживать виртуализацию KVM, установка гипервизора производится следующей командой:

sudo apt install -y qemu qemu-kvm libvirt-daemon libvirt-clients bridge-utils virt-manager

После того, как установка будет завершена вам необходимо добавить своего пользователя в группу libvirt:

sudo gpasswd -a $USER libvirt

Проверка, что демон виртуализации – libvirt-daemon – работает:

sudo systemctl status libvirtd

Вы можете включить его автоматический запуск при загрузке, прописав:

sudo systemctl enable libvirtd

Проверка, загружены ли модули KVM:

lsmod | grep -i kvm

Узнаем параметр для сети. При установке KVM, было создано несколько сетевых бриджей, посмотрим их командой:

ip link

Затем перейдем в папку libvirt и скачаем, при помощи утилиты wget, образ операционной системы, например для Ubuntu 20 Server можно так:

cd /var/lib/libvirt/boot/
sudo wget -O /var/lib/libvirt/boot/ubuntu20.iso https://releases.ubuntu.com/20.04/ubuntu-20.04.3-live-server-amd64.iso

Перед установкой, нужно узнать корректное наименование операционной системы для KVM, для нужно установить дополнительный пакет libosinfo-bin и запустим её:

sudo apt install libosinfo-bin
osinfo-query os | grep Ubuntu

Пример команды для создания виртуальной машины с использованием образа Ubuntu 20 ISO:

sudo virt-install --name=ubuntu-vm --os-variant=ubuntu20.04 --vcpu=1 --ram=2048 --graphics vnc --cdrom=/var/lib/libvirt/boot/ubuntu20.iso  --network bridge:virbr0,model=virtio  --disk path=/var/lib/libvirt/images/ubuntu-vm.qcow2,size=10,bus=virtio,format=qcow2

Пояснение опций запуска установки виртуального сервера:

  • –name указывает имя виртуальной машины ubuntu-vm.
  • –os-option указывает семейство ОС или производную от VM.
  • –vcpu указывает на ядра процессора, в данном случае 1 ядро.
  • –ram указывает на объем ОЗУ, равный 2048 МБ.
  • Флаг–cdrom указывает на абсолютный путь ISO-образа или смонтированное устройство с диском.
  • –network указывает адаптер, который будет использоваться виртуальной машиной
  • –disk path указывает путь, где хранится образ виртуальной машины, его размер, тип шины и формат самого образа.

Сразу после выполнения команды будет долгая установка системы, выбор дополнительных опций, создание пользователя системы, затем виртуальная машина сразу загрузится и будет доступна к авторизации и работе.

  • Логи работы виртуальных машин под KVM хранятся здесь: /var/log/libvirt/qemu
  • Конфигурация виртуальных машин хранится в xml файлах в каталоге /etc/libvirt/qemu/<имя.xml>

После установки посмотрим наличие нашей виртуальной машины командой

sudo virsh list

Также вы можете узнать параметры подключения по VNC к виртуальной машине с помощью команды:

sudo virsh vncdisplay

Для запуска виртуальной машины можно использовать команду:

sudo virsh start имя_машины

Для остановки:

sudo virsh shutdown имя_машины

Для перевода в режим сна:

sudo virsh suspend имя_машины

Для перезагрузки:

sudo virsh reboot имя_машины

Сброс:

sudo virsh reset имя_машины

Для отключения виртуальной машины:

sudo virsh destroy имя_машины

Учитывайте, что после этой команды образ виртуальной машины в папке /var/lib/libvirt/images/ останется и будет занимать место, если вы уже отключили виртуальную машину, то данный образ в папке можно удалить вручную.

Использование virsh

  • Virt-manager (Virtual Machine Manager) - приложение для управления виртуальными машинами
  • Подключение к удаленному хост- серверу:
    # virsh --connect qemu+ssh://darkfire@xxx.xxx.xxx.xxx/system
    WARNING: gnome-keyring:: couldn't connect to: /tmp/keyring-otUBG2/pkcs11: Нет такого файла или каталога
    darkfire@195.26.95.238's password: 
    Добро пожаловать в virsh — интерактивный терминал виртуализации.
    
    Введите  «help» для получения справки по командам
           «quit» для выхода
    
    virsh #
  • Выведем список всех доступных виртуальных машин с помощью virsh:
    $ virsh 'list --all'
  • Автоматический запуск/останов виртуальных машин, при включении хостового сервера
    # virsh autostart TestServer
    Domain TestServer marked as autostarted
    
    # virsh autostart --disable TestServer
    Domain TestServer unmarked as autostarted
  • Как удалить virbr0
    ip link
    virsh net-destroy default

Backup KVM

  1. При сохранении виртуальных машин KVM обязательно нужно сохранить XML файл с настройками. Обычно это файл находится /etc/libvirt/qemu, но проще и правильней выполнить команду virsh:
    # virsh dumpxml имя_машины > имя_машины.xml
  2. Останавливаем нужную виртуальную машину
    virsh shutdown имя_машины

    Имена всех машин и их состояния можно вывести так

    virsh list --all
  3. Сжимаем файл имя_машины.img при помощи Lzop.
  4. Запускаем виртуальную машину
    virsh start имя_машины
  5. Копируем файл имя_машины.img.lzo любым удобным образом на сервер бекапов.

libvirt и iptables

IPtables / firewall usage in libvirt - правила iptables определены в исходном коде libvirt

Чтобы расширить правила iptables, подгружаемые libvirt, можно создать файл с нужными правилами и прописать путь к этом файлу в rc.local. Файлы запускаемые при помощи rc.local запускаются в последнюю очередь, после инициализации всех служб. Так как способ запуска при помощи rc.local считается устаревшим, проверьте чтобы этот способ запуска не был отключен в вашем дистрибутиве, например при помощи sysv-rc-conf.

# nano /etc/rc.local
#!/bin/sh -e
 
/etc/network/iptables_rules
exit 0
# nano /etc/network/iptables_rules

#!/bin/sh

IPT="/sbin/iptables"
IFACE_LOC="lo"


$IPT -I INPUT 1 -m conntrack --ctstate ESTABLISHED,RELATED -j ACCEPT
$IPT -A OUTPUT -m conntrack --ctstate ESTABLISHED,RELATED -j ACCEPT

$IPT -I INPUT 2 -i $IFACE_LOC -j ACCEPT

#log
$IPT -A INPUT -m limit --limit 3/m --limit-burst 5  -j ULOG --ulog-prefix "IN_xxx: "

Читайте также