Differences

This shows you the differences between two versions of the page.

Link to this comparison view

saisp:labs:08:contents:01 [2014/01/24 18:59]
127.0.0.1 external edit
saisp:labs:08:contents:01 [2014/03/09 12:32] (current)
mihai.carabas [01. [15p] Kernel-based Virtual Machine (KVM)]
Line 1: Line 1:
-==== 01. Kernel-based Virtual Machine (KVM) ====+==== 01. [15p] Kernel-based Virtual Machine (KVM) ====
  
-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 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.+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: 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:
     * INTEL - **vmx** (Virtual Machine eXtensions)     * INTEL - **vmx** (Virtual Machine eXtensions)
     * AMD - **svm** (Secure Virtual Machine)     * AMD - **svm** (Secure Virtual Machine)
-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):<​code>​+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):<​code ​bash>
 root@saisp:​~$ cat /​proc/​cpuinfo |grep vmx root@saisp:​~$ cat /​proc/​cpuinfo |grep vmx
 flags           : ... ds_cpl **vmx** smx... flags           : ... ds_cpl **vmx** smx...
 </​code>​ </​code>​
  
-Pentru a folosit ​KVM trebuie să instalăm pachetul ''​qemu-kvm'',​ **qemu** fiind utilitarul din userspace ​folosit pentru a porni mașinile virtuale și transmite parametri doriți hypervisorului:<​code>​+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:<​code ​bash>
 root@saisp:​~#​ apt-get install qemu-kvm root@saisp:​~#​ apt-get install qemu-kvm
 [...] [...]
 </​code>​ </​code>​
  
-Înainte de a porni o mașina virtuală bazată pe KVM, trebuie să verificăm dacă modulul de kernel este încărcat:<​code>​+Înainte de a porni o mașina virtuală bazată pe KVM, trebuie să verificăm dacă modulul de kernel este încărcat:<​code ​bash>
 root@saisp:​~#​ lsmod|grep kvm root@saisp:​~#​ lsmod|grep kvm
 kvm_intel ​            ​121968 ​ 0 kvm_intel ​            ​121968 ​ 0
 kvm                   ​287572 ​ 1 kvm_intel kvm                   ​287572 ​ 1 kvm_intel
 </​code>​ </​code>​
-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'':<​code>​+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'':<​code ​bash>
 root@saisp:​~#​ ls -l /dev/kvm root@saisp:​~#​ ls -l /dev/kvm
 crw-rw---T 1 root kvm 10, 232 Jan  5 21:34 /dev/kvm crw-rw---T 1 root kvm 10, 232 Jan  5 21:34 /dev/kvm
 </​code>​ </​code>​
  
-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 ''​kvm''​:<​code>​ +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. 
-root@saisp:​~#​ id mihai + 
-uid=1001(mihaigid=1001(mihaigroups=1001(mihai) +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'':<​code bash> 
-root@saisp:​~#​ usermod ​-G kvm mihai +root@saisp:​~#​ kvm -hda base.qcow2 -m 256 -smp 2
-root@saisp:​~# ​id mihai +
-uid=1001(mihai) gid=1001(mihai) groups=1001(mihai),​107(kvm)+
 </​code>​ </​code>​
-Vom crea o mașină virtuală având 256MB RAM (parametrul ​''​-m''​), 2 procesoare (numărul este de parametrul ​''​-smp''​) și va avea ca dispozitiv de stocare ​imagine virtuală denumită ''​sda.qcow2''​ (mai multe detalii în exercițiul următor), specificată cu parametrul ​''​-hda'':<​code>​ +În acest moment se va deschide ​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''​
-root@saisp:​~#​ kvm -hda sda.qcow2 -m 256 -smp 2+<​solution -hidden>​ 
 +<code bash> 
 +root@VM:~# cat /​proc/​cpuinfo 
 +[...] 
 +root@VM:~# free -m 
 +[...] 
 +</​code>​ 
 +</​solution>​ 
 + 
 +Deschidem ​nouă consolă și vom afișa numărul de thread-uri ​''​kvm'' ​prezente în sistem:<​code ​bash
 +root@saisp:​~# ​ps -eLf |grep kvm
 </​code>​ </​code>​
-Î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ă). 
  
 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. 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.
 <​solution -hidden> <​solution -hidden>
-root@saisp:​~#​ kvm -hda sda.qcow2 -m 512 -smp 4 +<code bash> 
-</​solution+root@saisp:​~#​ kvm -hda base.qcow2 -m 512 -smp 4 
 +</​code>​ 
 +</​solution>
  
-Deschidem o nouă consolă și vom afișa numărul de procese ​''​kvm''​ prezente în sistem:<​code>​ +Deschidem o nouă consolă și vom afișa numărul de thread-uri ​''​kvm''​ prezente în sistem:<​code ​bash
-root@saisp:​~#​ ps aux |grep kvm+root@saisp:​~#​ ps -eLf |grep kvm
 </​code>​ </​code>​
  
-Observați că fiecare nou procesor adăugat în mașina virtuală ​este reprezentat de un proces ​în sistemul gazdă.+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:<​code>​ +=== Exportare display prin VNC === 
-root@saisp:​~#​ kvm -hda sda.qcow2 -m 512 -smp 4 -vnc 1+ 
 +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:<​code ​bash
 +root@saisp:​~#​ kvm -hda base.qcow2 -m 512 -smp 4 -vnc :1
 </​code>​ </​code>​
-Observați în continuare că procesul ''​kvm''​ nu a intrat în background. Pentru acest lucru trebuie să mai adăugăm parametroul ''​-daemonize'':<​code>​ +Observați în continuare că procesul ''​kvm''​ nu a intrat în background. Pentru acest lucru trebuie să mai adăugăm parametroul ''​-daemonize'':<​code ​bash
-root@saisp:​~#​ kvm -hda sda.qcow2 -m 512 -smp 4 -vnc 1 -daemonize+root@saisp:​~#​ kvm -hda base.qcow2 -m 512 -smp 4 -vnc :1 -daemonize
 </​code>​ </​code>​
-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'':<​code>​+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'':<​code ​bash>
 root@saisp:​~#​ netstat -ntpl root@saisp:​~#​ netstat -ntpl
 </​code>​ </​code>​
  
-Î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'':<​code>​+Î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''​):<​code ​bash>
 root@saisp:​~#​ vncviewer localhost:​5901 root@saisp:​~#​ vncviewer localhost:​5901
 </​code>​ </​code>​
  
-Închideți mașina virtuală executând comanda ''​poweroff''​ în consola acesteia. Porniți-o din nou având 256MB RAM și 2 procesoare.+Î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). 
 +<​solution -hidden>​ 
 +<code bash> 
 +root@saisp:​~#​ kill -9 $(pidof kvm) 
 +</​code>​ 
 +</​solution>​
saisp/labs/08/contents/01.1390582784.txt.gz · Last modified: 2014/01/25 12:04 (external edit)
CC Attribution-Share Alike 3.0 Unported
www.chimeric.de Valid CSS Driven by DokuWiki do yourself a favour and use a real browser - get firefox!! Recent changes RSS feed Valid XHTML 1.0