Thank you for reading this post, don't forget to subscribe!
Подготовка сервера
Проверяем наличие поддержки со стороны процессора:
cat /proc/cpuinfo | egrep "(vmx|svm)"
Если команда ничего не вернет, на сервере отсутствует поддержка виртуализации или она отключена в настройках БИОС. Сам KVM поставить на такой сервер можно, но при попытке ввести команду управления гипервизором мы получим ошибку «WARNING KVM acceleration not available, using 'qemu'». В таком случае необходимо перезагрузить сервер, войти в БИОС, найти поддержку технологии виртуализации (Intel VT или AMD-V) и включить ее.
Создадим каталоги, в которых будем хранить все, что касается виртуализации (предлагаемые по умолчанию не удобные):
mkdir -p /kvm/{images,iso}
* каталог /kvm/images для виртуальных дисков; /kvm/iso — для iso-образов.
Установка и запуск
Установка выполняется из репозитория следующей командой:
yum install qemu-kvm libvirt virt-install
* где qemu-kvm — сам гипервизор; libvirt — библиотека управления виртуализацией; virt-install — утилита для управления виртуальными машинами.
Разрешаем автозапуск:
systemctl enable libvirtd
Запускаем KVM:
systemctl start libvirtd
Настройка сети
В данной инструкции рассмотрим использование сетевого моста.
Настраивая сетевой мост через удаленное подключение, внимательно проверяйте вводимые данные. В случае ошибки соединение будет прервано.
Устанавливаем пакет для работы с bridge:
yum install bridge-utils
Смотрим список сетевых интерфейсов и их настроек:
ip a
В моем примере были следующие данные:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 |
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN qlen 1 link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00 inet 127.0.0.1/8 scope host lo valid_lft forever preferred_lft forever inet6 ::1/128 scope host valid_lft forever preferred_lft forever 2: enp4s0f0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP qlen 1000 link/ether 00:16:76:04:26:c6 brd ff:ff:ff:ff:ff:ff inet 192.168.1.24/24 brd 192.168.1.255 scope global enp4s0f0 valid_lft forever preferred_lft forever inet6 fe80::216:76ff:fe04:26c6/64 scope link valid_lft forever preferred_lft forever 3: enp5s5: <NO-CARRIER,BROADCAST,MULTICAST,UP> mtu 1500 qdisc pfifo_fast state DOWN qlen 1000 link/ether 00:16:76:04:26:c7 brd ff:ff:ff:ff:ff:ff 4: virbr0: <NO-CARRIER,BROADCAST,MULTICAST,UP> mtu 1500 qdisc noqueue state DOWN qlen 1000 link/ether 52:54:00:cd:86:98 brd ff:ff:ff:ff:ff:ff inet 192.168.122.1/24 brd 192.168.122.255 scope global virbr0 valid_lft forever preferred_lft forever 5: virbr0-nic: <BROADCAST,MULTICAST> mtu 1500 qdisc pfifo_fast master virbr0 state DOWN qlen 1000 link/ether 52:54:00:cd:86:98 brd ff:ff:ff:ff:ff:ff |
* из этого для нас важны enp4s0f0 — реальный сетевой интерфейс с настроенным IP-адресом 192.168.1.24, через который идет подключение сервера к локальной сети (из него мы будем делать мост); 00:16:76:04:26:c6 — mac-адрес реального ethernet адаптера; virbr0 — виртуальный сетевой адаптер.
Редактируем настройки реального адаптера:
vi /etc/sysconfig/network-scripts/ifcfg-enp4s0f0
Приводим его к виду:
1 2 3 4 5 |
ONBOOT=yes BRIDGE=br0 TYPE=Ethernet DEVICE=enp4s0f0 BOOTPROTO=none |
Создаем интерфейс для сетевого моста:
vi /etc/sysconfig/network-scripts/ifcfg-br0
1 2 3 4 5 6 7 8 9 |
DEVICE=br0 TYPE=Bridge ONBOOT=yes BOOTPROTO=static IPADDR=192.168.1.24 NETMASK=255.255.255.0 GATEWAY=192.168.1.1 DNS1=8.8.8.8 DNS2=77.88.8.8 |
Перезапускаем сетевую службу:
systemctl restart network
Сетевые настройки должны измениться — в моем случае:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 |
2: enp4s0f0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast master br0 state UP qlen 1000 link/ether 00:16:76:04:26:c6 brd ff:ff:ff:ff:ff:ff 3: enp5s5: <NO-CARRIER,BROADCAST,MULTICAST,UP> mtu 1500 qdisc pfifo_fast state DOWN qlen 1000 link/ether 00:16:76:04:26:c7 brd ff:ff:ff:ff:ff:ff 4: virbr0: <NO-CARRIER,BROADCAST,MULTICAST,UP> mtu 1500 qdisc noqueue state DOWN qlen 1000 link/ether 52:54:00:cd:86:98 brd ff:ff:ff:ff:ff:ff inet 192.168.122.1/24 brd 192.168.122.255 scope global virbr0 valid_lft forever preferred_lft forever 5: virbr0-nic: <BROADCAST,MULTICAST> mtu 1500 qdisc pfifo_fast master virbr0 state DOWN qlen 1000 link/ether 52:54:00:cd:86:98 brd ff:ff:ff:ff:ff:ff 6: br0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP qlen 1000 link/ether 00:16:76:04:26:c6 brd ff:ff:ff:ff:ff:ff inet 192.168.1.24/24 brd 192.168.1.255 scope global br0 valid_lft forever preferred_lft forever inet6 fe80::216:76ff:fe04:26c6/64 scope link valid_lft forever preferred_lft forever |
Настаиваем перенаправления сетевого трафика:
vi /etc/sysctl.d/99-sysctl.conf
1 |
net.ipv4.ip_forward=1 |
Применяем настройки:
sysctl -p /etc/sysctl.d/99-sysctl.conf
Перезапускаем libvirtd:
systemctl restart libvirtd
Создание виртуальной машины
Смотрим доступные варианты гостевых операционных систем:
osinfo-query os
Для создания первой виртуальной машины вводим следующую команду:
1 2 3 4 5 6 7 8 9 10 |
virt-install -n FirstTest \ --autostart \ --noautoconsole \ --network=bridge:br0 \ --ram 1024 --arch=x86_64 \ --vcpus=1 --cpu host --check-cpu \ --disk path=/kvm/images/FirstTest-disk1.img,size=16 \ --cdrom /kvm/iso/CentOS-7-x86_64-Minimal-1611.iso \ --graphics vnc,listen=0.0.0.0,password=my_password \ --os-type linux --os-variant=rhel7 --boot cdrom,hd,menu=on |
* где:
- FirstTest — имя создаваемой машины;
- autostart — виртуальная машина будет автоматически запускаться вместе с сервером KVM;
- noautoconsole — после создания не подключается автоматически к консоли виртуальной машины;
- network — тип сети (в нашем примере сетевой мост);
- ram — объем оперативной памяти, который будет выделен;
- vcpus — количество виртуальных процессоров;
- disk — виртуальный диск: path — путь до диска; size — его объем;
- cdrom — виртуальный привод с образом системы;
- graphics — параметры подключения к виртуальной машины с помощью графической консоли (в данном примере используем vnc); listen — на какой адресе принимает запросы vnc (в нашем примере на всех); password — пароль для подключения при помощи vnc;
- os-variant — гостевая операционная система (весь список мы получали командой osinfo-query os, в данном примере устанавливаем Reв Hat 7 / CentOS 7).
Дожидаемся создание виртуальной машины. И переходим к подключению по VNC.
Подключение к виртуальной машине
Для установки операционной системы скачиваем VNC-клиент на компьютер администратора, например, TightVNC и устанавливаем его.
На сервере смотрим, на каком порту слушает VNC созданной машины:
virsh vncdisplay FirstTest
в моем случае было:
:0
Это значит, что нужно к 5900 прибавить 0. Если результат команды будет :1 — 5900 + 1 = 5901 и так далее.
Открываем порт на брандмауэре:
firewall-cmd --permanent --add-port=5900-5905/tcp
firewall-cmd --reload
* в данном примере добавлено сразу 6 tcp-портов от 5900 до 5905.
Запускаем установленный TightVNC Viewer, в открывшемся окне вводим IP-адрес сервера KVM и порт, на котором слушает наша ВМ (в данном примере, 5900):
Нажимаем Connect. Программа запросит пароль — вводим тот, что указали при создании ВМ, (в данном примере, my_password). Мы подключимся к виртуальной машине, как будто, к ней подключен монитор или удаленная консоль KVM.
Устанавливаем операционную систему. Если это будет Windows, то проверяем корректность определения драйверов и, при наличии неустановленных устройств, выполняем установку драйверов KVM для гостевой Windows.
После установки гостевой операционной системы Windows на гипервизор KVM мы можем столкнуться с проблемой отсутствия драйверов. Как правило, больше всего неудобств вызывает отсутствие сетевых драйверов. Мы рассмотрим универсальный способ установки драйверов на Windows, который установлен на виртуальную машину KVM.
Предполагается, что наш KVM установлен на операционную систему семейства Linux, например, CentOS или Ubuntu. Все команды в данной инструкции будут выполняться из командной строки.
Загрузка драйверов и их монтирование
Первым делом загрузим ISO образ с набором драйверов и примонтируем его к операционной системе. Для этого заходим на хост виртуализации по SSH и вводим команду:
wget https://fedorapeople.org/groups/virt/virtio-win/direct-downloads/stable-virtio/virtio-win.iso -P /data/kvm/iso/
* где https://fedorapeople.org/groups/virt/virtio-win/direct-downloads/stable-virtio/virtio-win.iso — источник файла iso с драйверами KVM; /data/kvm/iso/ — каталог на сервере, в который мы загрузим образ.
* если при вводе команды система выдаст ошибку, необходимо установить wget командой yum install wget или apt-get install wget.
Дожидаемся загрузки файла на сервер, после чего создаем конфигурационный файл для монтирования образа в операционную систему:
vi /etc/libvirt/qemu/guest-virtio-drivers.xml
Добавляем в него следующее:
1 2 3 4 5 6 7 |
<disk type='file' device='cdrom'> <driver name='qemu' type='raw'/> <source file='/data/kvm/iso/virtio-win.iso'/> <target dev='hdb' bus='ide'/> <readonly/> <address type='drive' controller='0' bus='0' target='0' unit='1'/> </disk> |
* /data/kvm/iso/virtio-win.iso — путь до файла, который мы загрузили на сервер. В данном файле мы создали описание для монтирования устройства cdrom.
С помощью созданного файла XML мы монтируем ISO образ в CDROM на виртуальной машине:
virsh update-device WIN /etc/libvirt/qemu/guest-virtio-drivers.xml
* где WIN — имя виртуальной машины.
Установка драйверов
Подключаемся к виртуальной машине с помощью VNC. Мы должны увидеть примонтированный CD-ROM с драйверами virtio:
Кликаем правой кнопкой мыши по пуск и выбираем Диспетчер устройств:
* в ранних версиях Windows необходимо кликнуть правой кнопкой мыши по Мой компьютер - Управление - Диспетчер устройств.
В разделе «Другие устройства» кликаем правой кнопкой мыши по устройству, для которого необходим драйвер и выбираем Обновить драйверы:
В открывшемся окне выбираем Выполнить поиск драйверов на этом компьютере:
… и выбираем наш CD-ROM с драйверами:
Если система выдаст предупреждение безопасности, кликаем по Установить:
Драйвер установлен. Повторяем процедуру для каждого устройства, для которого система не смогла установить драйвер.
Базовые команды управления ВМ
1. Получить список созданных машин:
virsh list --all
2. Включить / перезагрузить / выключить.
а) включить виртуальную машину можно командой:
virsh start FirstTest
* где FirstTest — имя созданной машины.
б) перезагрузить:
virsh reboot FirstTest
* посылает команду операционной системе на корректную перезагрузку.
в) выключить корректно:
virsh shutdown FirstTest
* посылает команду операционной системе на корректное выключение.
г) выключить принудительно:
virsh destroy FirstTest
* грубо выключает ВМ. Может привести к потере данных. Способ стоит применять при полном зависании виртуалки.
д) приостановить:
virsh suspend FirstTest
Для возобновления работы вводим команду:
virsh resume FirstTest
е) отправить команду всем гостевым операционным системам:
for i in $(virsh list --name --state-shutoff); do virsh start $i; done
for i in $(virsh list --name --state-running); do virsh shutdown $i; done
* первыя команда запустит все ВМ, вторая — отправит команду на выключение.
3. Разрешаем автостарт для созданной ВМ:
virsh autostart FirstTest
4. Удаление виртуальной машины:
Удаляем виртуальную машину:
virsh undefine FirstTest
Удаляем виртуальный жесткий диск:
rm -f /kvm/images/FirstTest-disk1.img
* где /kvm/images — папка, где хранится диск; FirstTest-disk1.img — имя виртуальног диска для удаленной машины.
5. Редактирование конфигурации виртуальной машины:
Открыть редактор для изменения конфигурации:
virsh edit FirstTest
Также можно менять параметры из командной строки. Приведем несколько примеров для работы с виртуальной машиной FirstTest.
а) изменить количество процессоров:
virsh setvcpus FirstTest 2 --config --maximum
virsh setvcpus FirstTest 2 --config
б) изменить объем оперативной памяти:
virsh setmaxmem FirstTest 2G --config
virsh setmem FirstTest 2G --config
6. Работа со снапшотами
а) Создать снимок виртуальной машины можно командой:
virsh snapshot-create-as --domain FirstTest --name FirstTest_snapshot_2020-03-21
* где FirstTest — название виртуальной машины; FirstTest_snapshot_2020-03-21 — название для снапшота.
б) Список снапшотов можно посмотреть командой:
virsh snapshot-list --domain FirstTest
* данной командой мы просмотрим список всех снапшотов для виртуальной машины FirstTest.
в) Для применения снапшота, сначала мы должны остановить виртуальную машину. Для этого можно либо выполнить выключение в операционной системе или ввести команду:
virsh shutdown FirstTest
После вводим:
virsh snapshot-revert --domain FirstTest --snapshotname FirstTest_snapshot_2020-03-21 --running
* где FirstTest — имя виртуальной машины; FirstTest_snapshot_2020-03-21 — имя созданного снапшота.
г) Удалить снапшот можно так:
virsh snapshot-delete --domain FirstTest --snapshotname FirstTest_snapshot_2020-03-21
7. Клонирование виртуальных машин
Для примера, склонируем виртуальную машину FirstTest и создадим новую SecondTest.
Для начала, мы должны остановить виртуалку:
virsh suspend FirstTest
После можно клонировать:
virt-clone --original FirstTest --name SecondTest --file /kvm/images/SecondTest-disk1.img
* итого, мы склонируем виртуальную машину FirstTest. Новая машина будет иметь название SecondTest, а путь до диска будет /kvm/images/SecondTest-disk1.img.
Восстанавливаем работу FirstTest:
virsh resume FirstTest
Управление дисками
Отдельно рассмотрим процесс работы с виртуальными дисками.
Добавление диска
Создаем файл для нового диска:
qemu-img create -f raw /kvm/images/FirstTest-disk2.img 4G
* в данном примере мы создадим файл формата raw по полному пути /kvm/images/FirstTest-disk2.img размером 4 Гб.
Меняем размер блочного устройства:
virsh blockresize VMname /kvm/images/FirstTest-disk2.img 4G
* где 4G — новый окончательный размер диска.
Теперь подключим данный диск к виртуальной машине:
virsh attach-disk --persistent VMname /kvm/images/FirstTest-disk2.img vdb --cache none
* в данном примере мы подключили его к машине VMname в качестве диска vdb.
Готово. Подключаемся к виртуальной машине и проверяем, что у нас появился новый диск. Например, в Linux можно посмотреть командой:
lsblk
Пример ответа:
1 2 3 4 5 6 7 |
NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINT sr0 11:0 1 1024M 0 rom vda 252:0 0 24G 0 disk -- vda1 252:1 0 24G 0 part -- ubuntu--vg-root 253:0 0 23G 0 lvm / -- ubuntu--vg-swap_1 253:1 0 980M 0 lvm [SWAP] vdb |
Увеличение диска
Получаем список дисков для виртуальной машины:
virsh domblklist FirstTest
Останавливаем виртуальную машину:
virsh shutdown FirstTest
Увеличиваем размер диска:
qemu-img resize /kvm/images/FirstTest-disk1.img +100G
* данной командой мы расширим дисковое пространство виртуального диска /kvm/images/FirstTest-disk1.img на 100 Гигабайт.
Запускаем виртуальную машину:
virsh start FirstTest
Меняем размер блочного устройства:
virsh blockresize FirstTest /kvm/images/FirstTest-disk1.img 200G
* где 200G — новый окончательный размер диска.
Получаем информацию о виртуальном диске:
qemu-img info /kvm/images/FirstTest-disk1.img
После необходимо увеличить диск внутри операционной системы.
Управление через веб-интерфейс
Существуют различные веб-интерфейсы для управления гипервизором KVM. В данной инструкции мы рассмотрим oVirt.
Для его установки вводим команды:
yum install http://resources.ovirt.org/pub/yum-repo/ovirt-release41.rpm
yum install ovirt-engine
После разворачиваем и настраиваем портал:
engine-setup
* после запуска команды система задаст ряд вопросов, на все, кроме ввода пароля, можно ответить по умолчанию (просто нажать Enter).
После окончания установки в браузере вводим https://kvm/ovirt-engine/sso/, где kvm — имя сервера. В открывшемся окне вводим логин admin и пароль, который создали при выполнении команды engine-setup. После успешного входа можно управлять виртуальными машинами через веб-интерфейс.
Обновление базы операционный систем
Ранее мы использовали команду:
osinfo-query os
… для получения вариантов возможных операционных систем. Со временем данные список устаревает и его необходимо обновлять. Для этого переходим на страницу releases.pagure.org/libosinfo и копируем ссылку на самую последнюю базу:
Используя скопированную ссылку, загружаем базу на сервер:
wget https://releases.pagure.org/libosinfo/osinfo-db-20210621.tar.xz
* в моем примере это версия 20210621.
Теперь импортируем изменения в систему:
osinfo-db-import --system osinfo-db-20210621.tar.xz
Готово.