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>

Libvirt – Linux Virtualization – Ubuntu 16.04

One comment on “Libvirt – Linux Virtualization – Ubuntu 16.04

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

Leave a Reply

Your email address will not be published. Required fields are marked *