Содержание

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

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

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

Шаг 1 - Проверка сервера на поддержку технологии 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 я запустил на виртуальном сервере (VPS), а не на выделенном сервере (dedicated) как требует технология виртуализации KVM. Ели вы уверены, что используете настоящий:-) физический сервер и видите подобную ошибку - проверьте настройки BIOS, возможно эта опция выключена там.

Шаг 2 - Установка гипервизора

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

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

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

sudo gpasswd -a $USER libvirt

Шаг 3 - Проверка демона libvirt-daemon

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

sudo systemctl status libvirtd

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

sudo systemctl enable libvirtd

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

lsmod | grep -i kvm

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

Узнаем параметр для сети. При установке 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

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

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

Шаг 5 - Запуск, останов, администрирование виртуальной машины

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

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

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

  1. Перечитываем конфиг VPS
    virsh define /etc/libvirt/qemu/vm408166.xml
  2. Запускаем
    virsh start vm408166
  3. Проверяем
    # virsh list | grep vm408166
     254   vm408166                       работает

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: "