KVM на CentOS 7

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

В моем при­ме­ре были сле­ду­ю­щие данные:

* из это­го для нас важ­ны enp4s0f0 — реаль­ный сете­вой интер­фейс с настро­ен­ным IP-адре­сом 192.168.1.24, через кото­рый идет под­клю­че­ние сер­ве­ра к локаль­ной сети (из него мы будем делать мост); 00:16:76:04:26:c6 — mac-адрес реаль­но­го ethernet адап­те­ра; virbr0 — вир­ту­аль­ный сете­вой адаптер.

Редак­ти­ру­ем настрой­ки реаль­но­го адаптера:

vi /etc/sysconfig/network-scripts/ifcfg-enp4s0f0

При­во­дим его к виду:

Созда­ем интер­фейс для сете­во­го моста:

vi /etc/sysconfig/network-scripts/ifcfg-br0

Пере­за­пус­ка­ем сете­вую службу:

systemctl restart network

Сете­вые настрой­ки долж­ны изме­нить­ся — в моем случае:

Наста­и­ва­ем пере­на­прав­ле­ния сете­во­го трафика:

vi /etc/sysctl.d/99-sysctl.conf

При­ме­ня­ем настройки:

sysctl -p /etc/sysctl.d/99-sysctl.conf

Пере­за­пус­ка­ем libvirtd:

systemctl restart libvirtd

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

Смот­рим доступ­ные вари­ан­ты госте­вых опе­ра­ци­он­ных систем:

osinfo-query os

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

* где:

  • 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

Добав­ля­ем в него следующее:

/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

При­мер ответа:

Увеличение диска

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

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

Гото­во.