Libvirt – Linux Virtualization – Ubuntu 16.04

ВИРТУАЛИЗАЦИЯТА Е ТЕХНОЛОГИЯ ЗА ЕФЕКТИВНО УПРАВЛЕНИЕ НА СЪРВЪРНИ РЕСУРСИ

Libvirt – Linux Virtualization – Ubuntu 16.04

Виртуализацията като технология значително намалява стойноста на притежаваните сървъри и предоставя възможност за работа с голям брой приложения, които се разполагат на една физическа машина.


http://libvirt.org/
http://www.linux-kvm.org/
http://wiki.qemu.org/


Конфигурираме бридж на мрежовия интерфейс

Ако искаме да виртуализираме с libvirt трябва преди да се запознаем с него да конфигурираме хостинг машината в бридж. За целта Инсталираме:

sudo apt-get install bridge-utils

И описваме мрежовия конфигурационен файл /etc/network/interfaces според нашата топология:

# This file describes the network interfaces available on your system
# and how to activate them. For more information, see interfaces(5).
 
# The loopback network interface
auto lo
iface lo inet loopback
 
# Bridge between eth0 and eth1
auto br0
iface br0 inet dhcp
# For static configuration delete or comment out the above line and uncomment the following:
# iface br0 inet static
#  address 192.168.1.10
#  netmask 255.255.255.0
#  gateway 192.168.1.1
#  dns-nameservers 192.168.1.5
#  dns-search example.com
   bridge_ports eth0 eth1
   bridge_stp off
   bridge_fd 0
   bridge_maxwait 0

Хардуера ни поддържа ли виртуализация

libvirt библиотеката се използва, за различни технологии за виртуализация. Преди да започнете с libvirt най-добре е да се уверите, че вашият хардуер поддържа необходимите разширения за виртуализация. Въведете следната команда в терминала:

kvm-ok

Отговора при мен е:

KVM acceleration can be used

Което значи: KVM (модул за виртуализация в кърнела) ускорението може да се използва.

Инсталация на Libvirt

Инсталация

sudo apt-get install qemu-kvm libvirt-bin

Потребителя трябва да влезе в групата на libvirt

sudo adduser $USER libvirtd

Трябва ни само официален iso файл с Ubuntu

Теглим iso с Ubuntu сървър от Интернет за да го използваме за инсталацията на виртуалната машина.

wget -c http://bg.archive.ubuntu.com/releases/16.04.1/ubuntu-16.04.1-server-amd64.iso

Инсталиране на virtinst

Инсталирането на virtinst е важно за да можем да направим първоначалното инсталиране на iso файла и създаването на image за виртуалната машина с параметрите който са ни нужни.

sudo apt-get install virtinst

Инсталиране и задаване на параметри

sudo virt-install -n server4 -r 4096 --vcpus=4 \
--disk path=/var/lib/libvirt/images/server4.img,bus=virtio,size=20 -c \
ubuntu-16.04.1-server-amd64.iso --network bridge:br0 \
--graphics vnc,port=5900,listen=0.0.0.0 --noautoconsole -v

където:
-n server1 името на виртуалната машина която създаваме
-r 4096 памета която ще използва виртуалната машина в мегабайти
–vcpus колко виртуални ядра ще се използват
–disk path= къде ще се намира image файла на виртуалната машина
size=20 пространството което се използва, 20 гигабйта
ubuntu-16.04.1-server-amd64.iso файла който изтеглихме от Интернет
–network bridge:br0 бриджа на хост сървъра който създадохме в началото
-graphics vnc,port=5900 VNC сървър ни отваря порт за достъп за да инсталираме
listen=0.0.0.0 VNC сървъра слуша на всички интерфейси (ако има такива)
–noautoconsole да не зарежда терминал(без логването от VNC)
-v пълна виртуализация на виртуалната машина

Свързване към виртуалната машина отдалечено

Следващата стъпка е да се свържем отдалечено с VNC клиент към виртуалната машина за да я инсталираме:

вариант 1: virt-viewer

Инсталираме virt-viewer

sudo apt-get install virt-viewer

И се свързваме с виртуалната машина

samyil@desktop:~$ virt-viewer -c qemu+ssh://192.168.60.17/system server4

virtinst1

Вариант 2: Reminna Remote

С програмата Reminna Remote Desktop Client

vnc2vnc3

Вариант 3: virt-manager

С програмата Virtual Machine Manager с която дори могат да се администрират виртуалните машини и да се следи тяхното състояние:

sudo apt-get install virt-manager

virt-manager1virt-manager2

Вариант 4: Windows с VNC Viewer

vnc-win1vnc-win2vnc-win3

Хост сървъра с инсталирани виртуални машини

Но нека се върнем при нашия сървър и видим как изглежда с няколко виртуални машини:

libvirt1

Инструмента за администриране на вече инсталираните машини се нарича virsh и е доста интуитивен:

Кой виртуални машини са старирани в момента

samyil@host5:~$ virsh list
 Id    Name                           State
----------------------------------------------------
 1     server1                        running
 2     server2                        running
 3     server3                        running
 4     odoo1                          running
 5     odoo2                          running
 8     server4                        running

Принудително гасене на виртуалната машина

samyil@host5:~$ virsh shutdown server1
Domain server1 is being shutdown

Стартиране на виртуалната машина

samyil@host5:~$ virsh start server1
Domain server1 started

Рестартиране на виртуалната машина

samyil@host5:~$ virsh reboot server1
Domain server1 is being rebooted

Стартиране при рестартиране на Хост сървъра

samyil@host5:~$ virsh autostart server1
Domain server1 marked as autostarted

Архивиране на състояние

samyil@host5:~$ virsh save server1 server1-backup1.state
Domain server1 saved to server1-backup1.state

Въстановяване от архив

samyil@host5:~$ virsh restore server1-backup1.state
Domain restored from server1-backup1.state

Спиране и унищожаване на виртуална машина

samyil@host5:~$ virsh shutdown server4
Domain server4 is being shutdown
 
samyil@host5:~$ virsh destroy server4
Domain server4 destroyed
 
samyil@host5:~$ virsh undefine server4
Domain server4 has been undefined
 
samyil@host5:~$ sudo rm /var/lib/libvirt/images/server4.img

Редактиране параметрите на виртуална машина с xml

samyil@host5:~$ virsh edit server1
Select an editor.  To change later, run 'select-editor'.
  1. /bin/ed
  2. /bin/nano        <---- easiest
  3. /usr/bin/vim.basic
  4. /usr/bin/vim.tiny

virsh ще ни попита с кой от наличните ни едитори в системата искаме да редактираме xml файла с праматетрите на виртуалната машина.

<domain type='kvm'>
  <name>server1</name>
  <uuid>83c8a956-7678-4250-87fb-962b02bc68b9</uuid>
  <memory unit='KiB'>4194304</memory>
  <currentMemory unit='KiB'>4194304</currentMemory>
  <vcpu placement='static'>8</vcpu>
  <os>
    <type arch='x86_64' machine='pc-i440fx-wily'>hvm</type>
    <boot dev='hd'/>
  </os>
  <features>
    <acpi/>
    <apic/>
  </features>
  <cpu mode='custom' match='exact'>
    <model fallback='allow'>SandyBridge</model>
  </cpu>
  <clock offset='utc'>
    <timer name='rtc' tickpolicy='catchup'/>
    <timer name='pit' tickpolicy='delay'/>
    <timer name='hpet' present='no'/>
  </clock>
  <on_poweroff>destroy</on_poweroff>
  <on_reboot>restart</on_reboot>
  <on_crash>restart</on_crash>
  <pm>
    <suspend-to-mem enabled='no'/>
    <suspend-to-disk enabled='no'/>
  </pm>
  <devices>
    <emulator>/usr/bin/kvm-spice</emulator>
    <disk type='file' device='disk'>
      <driver name='qemu' type='qcow2'/>
      <source file='/var/lib/libvirt/images/server1.img'/>
      <target dev='vda' bus='virtio'/>
      <address type='pci' domain='0x0000' bus='0x00' slot='0x04' function='0x0'/>
    </disk>
    <disk type='file' device='cdrom'>
      <driver name='qemu' type='raw'/>
      <target dev='hda' bus='ide'/>
      <readonly/>
      <address type='drive' controller='0' bus='0' target='0' unit='0'/>
    </disk>
    <controller type='usb' index='0' model='ich9-ehci1'>
      <address type='pci' domain='0x0000' bus='0x00' slot='0x05' function='0x7'/>
    </controller>
    <controller type='usb' index='0' model='ich9-uhci1'>
      <master startport='0'/>
      <address type='pci' domain='0x0000' bus='0x00' slot='0x05' function='0x0' multifunction='on'/>
    </controller>
    <controller type='usb' index='0' model='ich9-uhci2'>
      <master startport='2'/>
      <address type='pci' domain='0x0000' bus='0x00' slot='0x05' function='0x1'/>
    </controller>
    <controller type='usb' index='0' model='ich9-uhci3'>
      <master startport='4'/>
      <address type='pci' domain='0x0000' bus='0x00' slot='0x05' function='0x2'/>
    </controller>
    <controller type='pci' index='0' model='pci-root'/>
    <controller type='ide' index='0'>
      <address type='pci' domain='0x0000' bus='0x00' slot='0x01' function='0x1'/>
    </controller>
    <interface type='bridge'>
      <mac address='52:54:00:e0:b7:48'/>
      <source bridge='br0'/>
      <model type='rtl8139'/>
      <address type='pci' domain='0x0000' bus='0x00' slot='0x03' function='0x0'/>
    </interface>
    <serial type='pty'>
      <target port='0'/>
    </serial>
    <console type='pty'>
      <target type='serial' port='0'/>
    </console>
    <input type='mouse' bus='ps2'/>
    <input type='keyboard' bus='ps2'/>
    <graphics type='vnc' port='5901' autoport='no' listen='0.0.0.0'>
      <listen type='address' address='0.0.0.0'/>
    </graphics>
    <video>
      <model type='cirrus' vram='16384' heads='1'/>
      <address type='pci' domain='0x0000' bus='0x00' slot='0x02' function='0x0'/>
    </video>
    <memballoon model='virtio'>
      <address type='pci' domain='0x0000' bus='0x00' slot='0x06' function='0x0'/>
    </memballoon>
  </devices>
</domain>

Проверка на параметрите и състоянието на определена виртуална машина

samyil@host5:~$ virsh dominfo server3
Id:             3
Name:           server3
UUID:           2f3a3420-b514-4f2e-a6e4-686b03fdcbfa
OS Type:        hvm
State:          running
CPU(s):         4
CPU time:       29,9s
Max memory:     4194304 KiB
Used memory:    4194304 KiB
Persistent:     yes
Autostart:      disable
Managed save:   no
Security model: apparmor
Security DOI:   0
Security label: libvirt-2f3a3420-b514-4f2e-a6e4-686b03fdcbfa (enforcing)

Проверка на параметрите на Хостинг сървъра

samyil@host5:~$ virsh nodeinfo
CPU model:           x86_64
CPU(s):              24
CPU frequency:       2000 MHz
CPU socket(s):       1
Core(s) per socket:  6
Thread(s) per core:  2
NUMA cell(s):        2
Memory size:         198054876 KiB

Тъй като нашият хостинг сървър има 24 ядра (2 процесора x 6 ядра с hyper threading = 24 в htop) в определен случай може да имаме нужда да осигурим точно опеделени ядра за виртуалната машина. Това се прави като се редактира xml файла с virsh edit server1 и се опишат нужните ядра с vcpupin. Трябва също да се обърне внимание, че първият процесор не е “1” а е “0” и съответно “24” е “23” тоест последния. В примера по долу описвам с vcpu, че виртуалната машина ще използва 4 ядра и с vcpupin, че те ща са последните от 24-те на физическия хостинг сървър.

<vcpu placement='static'>4</vcpu>
  <cputune>
    <vcpupin vcpu='0' cpuset='23'/>
    <vcpupin vcpu='1' cpuset='22'/>
    <vcpupin vcpu='2' cpuset='21'/>
    <vcpupin vcpu='3' cpuset='20'/>
  </cputune>

По принцип изключчането на виртуалните машини от самите тях не е добавено в конфигурациония xml защото почти не се използва. Ако е нужно това може да се добавят следните редове.

features>
    <pae/>
    <acpi/>
    <apic/>
    <hap/>
    <privnet/>
    <hyperv>
      <relaxed state='on'/>
      <vapic state='on'/>
      <spinlocks state='on' retries='4096'/>
      <vpindex state='on'/>
      <runtime state='on'/>
      <synic state='on'/>
      <reset state='on'/>
      <vendor_id state='on' value='KVM Hv'/>
    </hyperv>
    <kvm>
      <hidden state='on'/>
    </kvm>
    <pvspinlock state='on'/>
    <gic version='2'/>
  </features>

Базов мониторинг на хост сървъра

sudo apt install virt-top | virt-top


Libvirt – Linux Virtualization – Ubuntu 16.04

Leave a Reply

This site uses Akismet to reduce spam. Learn how your comment data is processed.

This Post Has One Comment

  1. Майстор тричко

    Никога ме съм вярвал, че ще опра до такова ръководство, но благодаря на човека написал го, подредено, кратко и систематизирано. Във фирмата гледат и са чудят какво е това – безплатно и работи по добре от платеното – хаха 🙂