Crmgo Блог

KVM на CentOS

KVM на CentOS

Встановлюємо KVM Власне, ми дісталися до встановлення віртуалізації KVM, емулятора QEMU та супутніх інструментів. Встановлюємо необхідні пакети: # yum install qemu-kvm libvirt libvirt-python libguestfs-tools virt-install # systemctl enable libvirtd && systemctl start libvirtd Зберігати образи віртуальних машин ми будемо в…

KVM на CentOS

Встановлюємо 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.

Проброс портів у Putty для VNC 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

Примітка: матеріал міг бути створений за підтримки ШІ з подальшою людською редакцією. Відповідальний за зміст: Dmytro Lomaka, Kaltenkirchen.

Рубрики: KVM