Virtualizarea este folosită pe scară largă în centrele de date întrucât oferă flexibilitate foarte mare în managementul resurselor. Pentru a nu afecta perfomanța, producătorii de procesoare au introdus facilități de virtualizare pentru a permite sistemelor de operare să ruleze nemodificate. Entitatea software care folosește aceste facilități se numește hypervisor. KVM este un hypervisor ce oferă suport pentru virtualizarea nativă (implementează facilități de virtualizare). În continuare vom prezenta modul de lucru cu soluția implementată de KVM.
Trebuie să verificăm dacă hardware-ul are suport pentru virtualizare nativă (mai poartă denumirea și de extensie de virtualizare). Numele extensiilor de virtualizare diferă de la un producător la altul astfel:
Pentru a verifica prezența extensiilor de mai sus trebuie să ne uităm în /proc/cpuinfo
dacă câmpul Flags conține numele extensiei (vmx pentru Intel sau svm pentru AMD):
root@saisp:~$ cat /proc/cpuinfo |grep vmx flags : ... ds_cpl **vmx** smx...
Pentru a folosi KVM trebuie să instalăm pachetul qemu-kvm
, qemu fiind utilitarul din userspace ce porneste mașinile virtuale și transmite parametri doriți hypervisorului:
root@saisp:~# apt-get install qemu-kvm [...]
Înainte de a porni o mașina virtuală bazată pe KVM, trebuie să verificăm dacă modulul de kernel este încărcat:
root@saisp:~# lsmod|grep kvm kvm_intel 121968 0 kvm 287572 1 kvm_intel
Observați în acest caz folosirea unei arhitecturi Intel. Pentru fiecare arhitectură există un modul separat. Încărcarea modului de kernel atrage după sine crearea unui device /dev/kvm
prin care se controlează modulul de kernel folosind operații de tip ioctl
:
root@saisp:~# ls -l /dev/kvm crw-rw---T 1 root kvm 10, 232 Jan 5 21:34 /dev/kvm
Pentru a porni o mașină virtuală vom folosi comanda kvm
. Utilizatorul care execută comanda (dorește să pornească o mașină virtuală) trebuie să fie cel privilegiat (root
) sau să facă parte din grupul setat ca owner pe device-ul /dev/kvm
(în cazul de fată kvm
). În cadrul laboratorului vom lucra cu utilizatorul privilegiat, dacă nu se specifică altfel.
Vom crea o mașină virtuală având 256MB RAM (parametrul -m
), 2 procesoare (numărul este dat de parametrul -smp
) și va avea ca dispozitiv de stocare o imagine virtuală denumită base.qcow2
(mai multe detalii în exercițiul următor), specificată cu parametrul -hda
:
root@saisp:~# kvm -hda base.qcow2 -m 256 -smp 2
În acest moment se va deschide o fereastră în care se va afișa output-ul consolei mașinii virtuale (veți vedea cum bootează). Verificați că resursele mașinii virtuale coincid cu parametri trimiși comenzii kvm
inspectând sistemul de fișiere /proc
.
Deschidem o nouă consolă și vom afișa numărul de thread-uri kvm
prezente în sistem:
root@saisp:~# ps -eLf |grep kvm
Opriți rularea mașinii virtuale rulând Ctrl+c
în consola unde ați rulat comanda kvm
. Porniți-o din nou cu 4 procesoare și 512MB RAM.
Deschidem o nouă consolă și vom afișa numărul de thread-uri kvm
prezente în sistem:
root@saisp:~# ps -eLf |grep kvm
Observați că fiecare nou procesor adăugat în mașina virtuală crește numărul thread-urilor kvm
în sistemul gazdă (numărul de thread-uri este mai mare decât numărul de procesoare din cauza existenței unor thread-uri de management necesare procesului kvm
).
De cele mai multe ori nu dorim deschiderea unei console în sesiunea curentă ci dorim rularea mașinii în background, iar la nevoie să putem accesa consola acesteia. Acest lucru este posibil folosind parametrul -vnc
al comenzii kvm
care va porni un server de VNC prin care se va exporta consola mașinii virtuale:
root@saisp:~# kvm -hda base.qcow2 -m 512 -smp 4 -vnc :1
Observați în continuare că procesul kvm
nu a intrat în background. Pentru acest lucru trebuie să mai adăugăm parametroul -daemonize
:
root@saisp:~# kvm -hda base.qcow2 -m 512 -smp 4 -vnc :1 -daemonize
Parametrul -vnc :1
activează serverul VNC pe portul 1 al protocolului. Pentru a afla portul TCP pe care ascultă serverul de VNC prin care este exportată consola trebuie să adunați 5900 la numărul pe care l-ați pus parametrului -vnc
, în cazul nostru 5901
. Pentru a verifica acest lucru executați comanda netstat
:
root@saisp:~# netstat -ntpl
În acest moment mașina virtuală KVM rulează în background, singura modalitate de interacțiune cu aceasta fiind prin consola VNC. Ne vom conecta la portul 5901
folosind utilitarul vncviewer
(instalați-l dacă este cazul folosind apt-get install xtightvncviewer
):
root@saisp:~# vncviewer localhost:5901
Închideți mașina virtuală executând comanda poweroff
în consola acesteia. Porniți-o din nou având 256MB RAM și 2 procesoare, tot în background (-daemonize
). Găsiți o modalitate de a opri mașina virtuală executând o comanda pe mașina fizică (cea pe care lucrați voi).