Встановлюємо KVM
Власне, ми дісталися до встановлення віртуалізації KVM, емулятора QEMU та супутніх інструментів.
Встановлюємо необхідні пакети:
# yum install qemu-kvm libvirt libvirt-python libguestfs-tools virt-install # systemctl enable libvirtd && systemctl start libvirtd
Зберігати образи віртуальних машин ми будемо в новій папці /vms
# mkdir /vms
Додаємо відповідний контекст для нашої папки, щоб SELinux не обурювалася:
# semanage fcontext --add -t virt_image_t '/vms(/.*)?'
Перевіряємо:
# semanage fcontext -l | grep virt_image_t /var/lib/imagefactory/images(/.*)? all files system_u:object_r:virt_image_t:s0 /var/lib/libvirt/images(/.*)? all files system_u:object_r:virt_image_t:s0 /vms(/.*)? all files system_u:object_r:virt_image_t:s0
Застосовуємо зміни:
# restorecon -R -v /vms
і перевіряємо, чи застосувалися вони:
# ls -aZ /vms drwxr-xr-x. root root unconfined_u:object_r:virt_image_t:s0 . dr-xr-xr-x. root root system_u:object_r:root_t:s0 ..
Ок, завантажуємо з мережі образ iso для тієї ОС, яка буде встановлена на вірт. машині, наприклад, той самий CentOS 7 minimal для майбутнього веб-сервера? Чи Tails? Хто знає :)
Створюємо першу віртуальну машину
Після вищеперелічених дій для віртуальних машин на хості створено мережевий інтерфейс virbr0 з IP 192.168.122.1:
# ip addr
Також створено віртуальну мережу default:
# virsh net-list Name State Autostart Persistent ---------------------------------------------------------- default active yes yes
Мережу можна редагувати:
# virsh net-edit default <network> <name>default</name> <uuid>745f121b-3c89-1281-a19a-aa62808c4241</uuid> <forward mode="nat"> <bridge delay="0" name="virbr0" stp="on"> <mac address="16:18:00:21:8c:15"> <ip address="192.168.122.1" netmask="255.255.255.0"> <dhcp> <range end="192.168.122.254" start="192.168.122.2"> </range></dhcp> </ip> </mac></bridge></forward></network>
Поки що давайте не будемо нічого змінювати і створимо віртуальну машину, підключену з мережі default:
# virt-install --network network=default --name vm1 --ram=2048 --vcpus=1 --disk path=/vms/vm1.img,size=30,format=qcow2 --graphics vnc,password=vm1password --cdrom /vms-iso/CentOS-7-x86_64-Minimal-1503-01.iso --boot cdrom,hd,menu=on
Опис опцій:
--graphics vnc,password=vm1password
Тут ми вказуємо пароль і можливість підключитися до терміналу віртуальної машини через VNC. Пароль може засвітитися в логах, тож не пишіть сюди щось важливе.
--network network=default - підключаємо нашу віртуальну машину до віртуальної мережі з іменем default (з нею ми вже знайомі).
М.б. --network bridge:br0, наприклад, якби ми створили bridge з іменем br0 для варіанта номер 2.
Вказана вище команда може бути введена відразу, одним рядком, тут вже як зручніше:
virt-install --network network=default --name vm1 --ram=2048 --vcpus=1 --disk path=/vms/vm1.img,size=30,format=qcow2 --graphics vnc,password=vm1password --cdrom /vms-iso/CentOS-7-x86_64-Minimal-1503-01.iso --boot cdrom,hd,menu=on
Після виконання команди можете побачити повідомлення:
WARNING Unable to connect to graphical console: virt-viewer not installed. Please install the 'virt-viewer' package. WARNING No console to launch for the guest, defaulting to --wait -1
Нам і не треба, адже у нас все одно хост віртуальних машин не має віконного менеджера. У мене так, принаймні.
Starting install...
Allocating 'vm1.img'
| 30 GB 00:00:00
Creating domain...
| 0 B 00:00:00
Domain installation still in progress. Waiting for installation to complete.
Мужньо чекаємо. Процес займе якийсь час.
Після завершення команди подивимося список віртуальних машин:
# virsh list Id Name State ---------------------------------------------------- 2 vm1 running
Вірт. машини можна запускати (virsh start vm1), призупиняти (virsh suspend vm1), відновлювати (virsh resume vm1), вимикати (virsh shutdown vm1) і багато чого ще з ними робити. Отже, машина vm1 запущена (перевірити можна командою virsh domstate vm1). Як до неї підключитися?
Підключаємося до віртуальної машини по VNC
На попередньому етапі ви створили віртуальну машину, вказали їй CDROM з операційною системою, а далі що? Як ви плануєте встановити та налаштувати ОС? Так, є варіанти. Можна підготувати інфраструктуру і заливати готові образи та ін. Але ми з вами вчимося і у нас немає нічого, крім нещодавно завантаженого з інтернету файлу образу диска iso. Насправді все не складно. Ми вказали на попередньому кроці параметр "--graphics vnc,password=vm1password". Він означає, що ми можемо підключитися до терміналу (читай - екрану) віртуальної машини через VNC, наприклад, програмою TightVNC, вказавши IP хоста віртуальних машин і порт для підключення.
Нашій віртуальній машині був призначений порт VNC, підключившись до якого ми побачимо "екран" віртуальної машини. Дізнатися, який порт призначений конкретній vm1, можна командою:
# virsh vncdisplay vm1 127.0.0.1:0
Це означає, що порт VNC 5900+0=5900. Якби результат був "127.0.0.1:1", порт VNC був би 5901. І т.д.
Підключатися до порту 5900 треба до хоста віртуальних машин. Це на ньому відкритий цей порт, а не на віртуальній машині vm1.
За замовчуванням, хост віртуальних машин (у нас це CentOS 7 minimal) не повинен дозволяти підключення до будь-якого порту крім ssh (22/tcp). Не раджу вам відкривати доступ до портів VNC ззовні. Це небезпечно. Для того, щоб отримати доступ до екрану віртуальної машини з робочої станції Windows, з якої я все налаштовую, я зробив тунелювання порту в Putty: 5900 -> 127.0.0.1:5900.

Після успішного логіну по ssh, можна запустити TightVNC і вказати порт 127.0.0.1::5900 (зверніть увагу на подвійну двокрапку).
Якщо після перезавантаження машини потрібно знову підключити до неї образ iso, це можна зробити командою:
# virsh attach-disk vm1 /vms-iso/CentOS-7-x86_64-Minimal-1503-01.iso hdb --type cdrom --mode readonly
де hdb - ім'я блочного пристрою CDROM. Це ім'я можна дізнатися, переглянувши конфіг вірт. машини (virsh edit vm1).
Керувати віртуальними машинами з хоста можна консольним набором virsh. З деякими командами ви вже познайомилися. Наберіть у консолі:
# virsh help
і ви побачите, скільки всього можна зробити.
Увімкнення/вимкнення віртуальних машин
Якщо ви створите віртуальну машину і спробуєте її вимкнути, то незважаючи на рапорт про виконання, машина може не вимкнутися:
# virsh domstate vm1 running # virsh shutdown vm1 Domain vm1 is being shutdown # virsh domstate vm1 running
Тут справа в підтримці acpi з боку віртуальної машини. Не у всіх випадках вірт. машина обробить сигнал про вимкнення або перезавантаження (virsh shutdown/restart vm1). У цій ситуації можуть бути такі варіанти:
Висмикування кабелю живлення:
# virsh destroy vm1 Domain vm1 destroyed
Ви чудово розумієте, до чого це може призвести. Хоча на початковому етапі, поки ОС не встановлена, поява помилок
Призупинення роботи вірт. машини:
virsh suspend vm1
Не завжди буває необхідно вимикати або перезавантажувати машину ззовні. Для обслуговування може бути достатньо призупинення. Не факт, але все ж.
Увімкнення підтримки acpi у віртуальній машині.
Тут можуть бути різні рецепти, наприклад так (виконати у вірт. машині, а не на хості):
yum install acpid chkconfig acpid on service acpid start
Автостарт віртуальних машин
Для того, щоб при перезапуску хоста віртуальна машина vm1 запускалася автоматично:
# virsh autostart vm1 Domain vm1 marked as autostarted
Вимкнути автозапуск для vm1:
# virsh autostart vm1 --disable Domain vm1 unmarked as autostarted
Контроль мережевої активності віртуальної машини KVM
Може бути корисним оцінювати мережеву активність віртуальної машини - наприклад, скільки трафіку вона спожила. Також це може допомогти при налагодженні мережі або пошуку витоків трафіку. Наприклад:
# virsh domifstat vm1 vnet0 vnet0 rx_bytes 3063962 vnet0 rx_packets 3412 vnet0 rx_errs 0 vnet0 rx_drop 0 vnet0 tx_bytes 591996 vnet0 tx_packets 1731 vnet0 tx_errs 0 vnet0 tx_drop 0
Тут все зрозуміло, крім того, звідки взяти назву адаптера vnet0. Можна в дампі конфігурації вірт. машини (virsh dumpxml vm1) знайти секцію network і в ній параметр dev:
<interface type='network'> <mac address='52:54:00:98:6c:e6'/> <source network='default' bridge='virbr0'/> <target dev='vnet0'/> <model type='rtl8139'/> <alias name='net0'/> <address type='pci' domain='0x0000' bus='0x00' slot='0x03' function='0x0'/> </interface>
Підключення та відключення приводу cdrom
Підключити до vm3 iso-образ як cdrom:
# virsh attach-disk vm3 /data/vms-iso/CentOS-7-x86_64-Minimal-1511.iso hda --type cdrom --mode readonly Disk attached successfully
Тут треба бути уважним, оскільки після шляху до iso-файлу на хості йде зазначення імені пристрою cdrom у віртуальної машини vm3. Якщо ви не впевнені, яке ім'я пристрою треба вказати (hda, hdb або ін.), звіртеся з конфігурацією віртуальної машини:
# virsh edit vm3
Відключити iso-образ (не видалити пристрій з гостя, а просто "витягти cd-диск з приводу"):
# virsh attach-disk vm5 "" hda --type cdrom --mode readonly
