Virtualizzare con Linux e KVM

La virtualizzazione oggi è la prospettiva che ogni azienda si prefigge. Il motivo che spinge verso la virtualizzazione è la proliferazione dei server. Per rispondere ai picchi di necessità tipicamente si risponde aumentando il numero di server, con il risultato pratico che oggi l’utilizzo effettivo di un server è tra il 15% e il 20% della sua potenza. Con la virtualizzazione si consolidano un gran numero di server in un’unica “scatola” che può essere sfruttata in maniera più efficiente. La Gartner Group, la più autorevole società di analisi del mondo IT, stima che questo modus operandi porti a una diminuzione dei costi del 65% e lo raccomanda. Tuttavia la realtà quotidiana mostra che la faccenda non è poi cosi semplice, oltre ai costi dell’hardware si devono mettere in conto i costi di licenza se si utilizzano sistemi commerciali come VMWare, Microsoft Hyper-V o con Xen, a questi poi si devono aggiungere i costi di licenza di eventuali applicativi e sistemi operativi proprietari, consulenze a favore ovviamente un costo energetico minore, per cui non è sempre detto che virtualizzare sia un affare; è opportuno affrontare il tema caso per caso e valutarne attentamente pro e contro.

Se un’azienda ha un sistema AS/400 e 3 macchine dedicate alla contabilità pienamente sfruttate e tutto funziona al meglio, non c’è motivo di virtualizzare. Un’azienda con un print server e un pc dedicato ai backup che lavora solo di notte, ha invece sicuramente margini per ottimizzare le risorse.

L’elemento chiave che deve spingere verso la valutazione di un piano di virtualizzazione è la possibilità di utilizzare meglio le risorse attuali.

Se in una rete o in una sala macchine c’è la possibilità di migliorare e aumentare l’efficienza, allora ha senso prendere in considerazione la virtualizzazione.

E la parola migliorare l’efficienza può avere molte sfaccettature: potrebbe voler dire migliorare la disponibilità dei sistemi, ottimizzare l’uso delle risorse di calcolo disponibili o anche ridurre i consumi per risparmiare denaro sulle bollette della corrente.

In sintesi, la virtualizzazione è una opportunità concreta: se pensate che la vostra infrastruttura IT possa diventare più efficiente, il mio consiglio è di procedere con uno studio di fattibilità che porti serenamente a valutare i pro e i contro dell’operazione.

In questa guida vi mostrerò come creare a costo quasi zero un sistema di virtualizzazione, (non parlero di come collegare ad esso una SAN o un NAS) quasi zero perchè per virtualizzare l’hardware deve avere delle particolarità che le macchine comuni non hanno prima di tutto i processori devono essere multi core da un minimo di 4 a 12 questo dipende dal quantitativo di macchine avete necessità d’installare e dalla loro potenza di calcolo e i processori devono permettere la paravirtualizzazione questa funzionalità è disponibile per i processori che includono un’opzione di virtualizzazione, nello specifico processori con tecnologia Intel VT o AMD Virtualization (AMD-V). Detto questo gli host che conterranno le macchine virtuali dovranno disporre di molta memoria ram, anche questa dipende dalle macchine virtuali che vi necessitano anche qui di solito si può già lavorare bene con macchine che dispongono di min. 64 GB di memoria ram, il sistema operativo che funge da hypervisor deve essere il più leggero e robusto possibile e con architettura a 64 bit e per ultimo ci serve un contenitore di dischi da condividere per l’inserimento delle macchine virtuali e questo influirà molto sui costi, se abbiamo poche macchine da virtualizzare e non ci interessano performance da gran premio un buon NAS co diversi tera di spazio disco potrebbe essere la scelta migliore, ma se necessitiamo di performance elevate allora dobbiamo spostare la nostra attenzione su una SAN. Il sistema che utilizzeremo è sempre tutto opensource

Preparare l’host di virtualizzazione

Iniziamo con l’installare una versione di CentOS 7 a 64 bit, installando la versione minima ovvero senza interfaccia grafica, creando le partizioni necessarie al funzionamento (vedere le guide in questo blog) una cosa sola lo swap con sistemi che dispongono molta memoria questa non è necessaria anche se viene consigliato comunque di creare una zona di swap di 1024 MB per stabilizzare tutto il sistema.

Pre-requisiti

KVM è sinonimo di Kernel Based Virtual Machine, è un software di virtualizzazione che fornisce la capacità di eseguire più sistemi operativi guest con l’aiuto di estensioni di virtualizzazione hardware. Esso supporta un’ampia varietà di sistema operativi guest come Linux, Windows, Solaris, Haiku, REACT e molto altro ancora.

KVM può essere gestito tramite riga di comando o strumenti grafici disponibili. Virt-Manager (Virtual Machine Manager) è l’applicazione più utilizzata per la gestione di macchine virtuali basate su KVM, che supporta la creazione, la modifica, l’avvio e l’arresto delle macchine virtuali basate KVM, così come migrazione live o a freddo di macchine guest tra gli host.

Come detto in precedenza, KVM funziona solo se la CPU ha un supporto di virtualizzazione hardware, sia Intel VT o AMD-V. Per controllare se la vostra CPU supporta funzioni VT, eseguire il seguente comando.

# grep ‘(vmx|svm)’ /proc/cpuinfo

Se il comando di cui sopra mostra un output con qualsiasi uscita mostrando vmx o svm allora l’hardware supporta la virtualizzazione, se cosi non fosse il vostro sistema non supporta la virtualizzazione.

Installate KVM

Per installare KVM eseguiamo il seguente comando, con esso installeremo qemu, virt-manager, quest’ultimo fornirà un interfaccia grafica per gestire le macchine virtuali.

# yum install qemu-kvm qemu-img virt-manager libvirt libvirt-python libvirt-client virt-install virt-viewer
  • qemu-kvm = QEMU emulatore

  • qemu-img = QEMU gestore immagine disco

  • virt-install = Strumento a riga di comando per creare macchine virtuali

  • libvirt = Fornisce il daemone libvirtd che gestisce le macchine virtuali e i controlli hypervisor.

  • libvirt-client = fornisce API lato client per accedere ai server e fornisce anche l’utilità virsh che fornisce uno strumento a riga di comando per gestire le macchine virtuali.

  • virt-viewer = console grafica

Configurazione della rete Bridge

Con il bridged networking è possibile condividere il dispositivo di rete reale con macchine KVM. Questo è necessario per i server con più schede di rete e dà buone prestazioni. Si può scegliere di mettere più segmenti in un’unica rete in bridge o di dividerlo in diverse reti interconnesse da router.

Disabilitare la GUI del NetworkManager

Il NetworkManager (GUI) strumento può creare problemi con la rete in bridge disabilitiamolo come

segue, digitare:

# systemctl stop NetworkManager

# systemctl disable NetworkManager

# service network restart

Settare un IP statico

In questo caso ammettiamo che il nostro server abbia un indirizzo IP 192.168.1.100, e interessante notare che, anche se ho una interfaccia di rete enp0s7

# ifconfig enp0s7

output:

enp0s7:flags=4163<UP,BROADCAST,RUNNING,MULTICAST>mtu1500
inet 192.168.2.10 netmask 255.255.255.0 broadcast 192.168.2.255
inet6 fe80::21e:90ff:fe77:865c prefixlen 64 scopeid 0x20<link>
ether 00:1e:90:77:86:5c txqueuelen 1000 (Ethernet)
RX packets 534 bytes 45293 (44.2 KiB)
RX errors 0 dropped 0 overruns 0 frame 0
TX packets 443 bytes 61545 (60.1 KiB)
TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0
Se il file della scheda di rete non corrisponde a quanto presentato sopra “enp0s7” lanciamo questo comando per visualizzare la scheda di rete 
# ls /etc/sysconfig/network-scripts/ifcfg-*
e editiamo la nostra cheda di rete in questo modo scrivendo dopo ifcgc il none della scheda di rete cha abbiamo rivelato con il comando sopra:
# nano /etc/sysconfig/network-scripts/ifcfg-enp0s7
e modifichiamola ne modo seguente inserendo i parametri della nostra rete
DEVICE="enp0s7"
ONBOOT="yes"
NM_CONTROLLED="no"
TYPE=Ethernet
BOOTPROTO=static
IPADDR=192.168.2.100
NETMASK=255.255.255.0
GATEWAY=192.168.2.1
A questo punto salviamo , impostiamo anche i dns manualmente agendo sul file resolv.conf.
# nano /etc/resolv.conf
nameserver nostroDNS1
nameserver nostroDNS2
Salviamo e riavviamo la rete
# service network restart
installiamo ora le utility necessarie per creare il bridge di rete
# yum -y install bridge-utils ifconfig bind-utils
Avviamo o riavviamo il servizio libvirtd
# systemctl start libvirtd oppure per il riavvio sostituire start con restart
Abilitiamo poi l'avvio automatico al boot
# systemctl enable libvirtd
Se eseguiamo un ifconfig delle schede di rete noteremo che esiste già una nuova scheda chiamata virbr0, questa ha già un indirizzo IP, ma noi la ignoreremo perché volgiamo aggiungere un interfaccia diversa chiamata br0 (Bridge0)
iniziamo ora a configurare la rete, prima di tutto creiamo una backup della rete originale
# cp /etc/sysconfig/network-scripts/ifcfg-enp0s7 /etc/sysconfig/network-scripts/ifcfg-enp0s7.bak
ora eseguiamo la modifica alla scheda di rete commentando le righe come nel esempio qui sotto:
cat /etc/sysconfig/network-scripts/ifcfg-enp0s7
DEVICE="enp0s7"
ONBOOT="yes"
NM_CONTROLLED="no"
TYPE=Ethernet
BOOTPROTO=static
IPADDR=192.168.2.100
NETMASK=255.255.255.0
GATEWAY=192.168.2.1
in 
DEVICE="enp0s7"
ONBOOT="yes"
NM_CONTROLLED="no"
#TYPE=Ethernet
BRIDGE=bridge0
BOOTPROTO=static
#IPADDR=192.168.2.100
#NETMASK=255.255.255.0
#GATEWAY=192.168.2.1
Creiamo ora il file Bridge e aggiungiamo quanto seguente
nano /etc/sysconfig/network-scripts/ifcfg-br0
DEVICE="br0"
ONBOOT="yes"
TYPE=Bridge
BOOTPROTO=static
IPADDR=192.168.2.100
NETMASK=255.255.255.0
Si noti che la linea Gateway è stata spostata da entrambi le reti e la inseriremo in /etc/sysconfig/network
# nano /etc/sysconfig/network
# Created by anaconda
GATEWAY=192.168.2.1
Salviamo e riavviamo la rete
# service network restart
output
Restarting network (via systemctl):		[OK]
il risultato dovrebbe essere simile al seguente output
ifconfig enp0s7
enp0s7: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1500
inet6 fe80::21e:90ff:fe77:865c prefixlen 64 scopeid 0x20<link>
ether 00:1e:90:77:86:5c txqueuelen 1000 (Ethernet)
RX packets 804 bytes 103470 (101.0 KiB)
RX errors 0 dropped 0 overruns 0 frame 0
TX packets 475 bytes 61930 (60.4 KiB)
TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0
La Bridge interface:
ifconfig br0
bridge0:flags=4163<UP,BROADCAST,RUNNING,MULTICAST>mtu 1500
inet 192.168.2.100 netmask 255.255.255.0 broadcast 192.168.2.255
inet6 fe80::21e:90ff:fe77:865c prefixlen 64 scopeid 0x20<link>
ether 00:1e:90:77:86:5c txqueuelen 0 (Ethernet)
RX packets 398 bytes 27098 (26.4 KiB)
RX errors 0 dropped 0 overruns 0 frame 0
TX packets 250 bytes 32824 (32.0 KiB)
TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0
Il router deve risultare pingabile e il DNS deve essere risolto

Creare una Macchina Virtuale

Una volta installato KVM e gli altri strumenti, è tutto pronto per iniziare a creare macchine virtuali. Vedremo la creazione di macchine virtuali sia in linea di comando e modalità grafica.

Creazione da linea di comando

virt-install viene utilizzato per creare macchine virtuali utilizzando la riga di comando, il comando ha bisogno di più ingressi ovvero dobbiamo indicare quali proprietà hardware deve avere la macchina virtuale come CPU, memoria, disco, rete, posizione dei supporti, tipo di sistema operativo e altro ancora.

# virt-install --name=itzgeekguest --ram=1024 --vcpus=1 --cdrom=/tmp/CentOS-6.5-x86_64-minimal.iso --os-type=linux --os-variant=rhel6 --network bridge=br0 --graphics=vnc --disk path=/var/lib/libvirt/images/Centosguest.dsk,size=4
  • Name = Nome della macchina virtuale
  • ram = Dimensione della memoria in MB
  • vcpus = numero delle cpu virtuli da attribuire alla macchina
  • cdrom = Locazione dell’immagino ISO
  • os-type = tipo di sistema operativo che si va ad installare (Linux, Windows ecc..)
  • os-variant = variante del sistema operativo (rhel, solaris, centos Ubuntu ecc…)
  • network = scheda di rete
  • grafica = settaggio del display grafico
  • disk path = locazione e dimensione del disco

Dopo aver lanciato il comando precedente, virt-install creerà una macchina virtuale e con Viewer virt si potrà seguire l’installazione del sistema operativo.

Creazione della macchina virtuale in modalità grafica

Installare su un pc il virt-manager da https://virt-manager.org/download la gui è disponibile sia per linux che per Windows.

Per linux basta aprire la console e digitare:

se si usa Ubuntu # apt-get install virt-manager

se si uda centos # yum install virt-manager

L’applicativo appena installato su linux dovremmo trovarlo in questo percorso, Applicazioni → Tools di Sistema → Virtual Machine Manager, oppure prendo una console ci basterà digitare

# virt-manager

È possibile che venga chiesto di inserire la password, se non si dispone di un accesso di root.

Una volta che si apre, fare clic File e aggiungiamo una connessione, ora alla voce Hypervisor teniamo selezionata la voce QEMU/KVM, mettere la spunta su connessione a host remoto, selezionare il metodo di connessione, “SSH” e poi inseriamo le credenziali d’accesso della macchina remota (le credenziali di root) e poi il nome o l’ip dell’host, a questo punto clicchiamo su connetti. A connessione avvenuta, vederemo l’ip o il nome host sulla maschera principale ora non ci resta che fare click con il tasto destro del mouse e fare clic su Nuovo. Virtual Machine Manager inizierà una nuova procedura guidata per la creazione di macchine virtuali.

Fase 1: Le opzioni di installazione sono molteplice, Qui ho scelto di installarlo da immagine ISO o CD-ROM.

CentOS-7-Virt-Manager-Create-VM

Fase 2: Inserire la posizione dell’immagine ISO come CD-ROM e non dimenticate di scegliere il tipo di sistema operativo e la versione.

CentOS-7-Installation-Media

Fase 3: Configurare la CPU e la memoria per macchina virtuale.

CentOS-7-Virt-Manager-Memory-and-CPU

Fase 4: Impostare la quantità di spazio di archiviazione che si desidera assegnare a una macchina virtuale, Spuntare la voce “allocare l’intero disco ora”, questo impedirà di allocazione tutto il disco alla creazione di macchine virtuali. Il Formato del disco verrà allocata dinamicamente a seconda dell’utilizzo della macchina virtuale.

CentOS-7-Virt-Manager-Allocating-Storage

Fase 5: Sintesi di tutte le impostazioni, fare clic su Impostazioni avanzate per selezionare il networking in bridge in modo da consentire di macchina virtuale per comunicare al di fuori della rete. Fare clic su Fine.

CentOS-7-Virt-Manager-Summary

Fase 6: KVM inizierà a creare una macchina virtuale, una volta creato vm. Virt Manager avvierà una console per l’installazione del sistema operativo. La schermata seguente mostra la schermata di installazione di CentOS 6.

CentOS-7-Virt-Manager-VM-Console

Gestione delle virtual Machine

Con il Virtual Machine Manager, è possibile eseguire le azioni del ciclo di vita di vm, come avvio, spegnimento, reset, clonare e migrare facendo clic destro sulla macchina virtuale selezionata.

CentOS-7-Virt-Manager

Gestire macchine virtuali usando virt direttore è molto semplice, è sufficiente fare clic sull’icona “lampadina” nella console vm. Qui è possibile aggiungere, modificare e rimuovere i dispositivi.

CentOS-7-Virt-Manager-Managing-VM

Installare WebVirtMgr

WebvirtMgr è un interfaccia web based per gestire le macchine virtuali tramite browser.

Installazione

per installare l’interfaccia web, prima abbiamo bisogno di alcuni accorgimenti, ovvero installare le dovute librerie e i necessari repository:

# yum -y install http://dl.fedoraproject.org/pub/epel/7/x86_64/e/epel-release-7-5.noarch.rpm
# yum -y install git python-pip libvirt-python libxml2-python python-websockify supervisor nginx
# yum -y install gcc python-devel
# pip install numpy

Installare i requisiti di Python e configuriamo Django

# git clone git://github.com/retspen/webvirtmgr.git

# cd webvirtmgr # pip install -r requirements.txt

# or python-pip (RedHat, Fedora, CentOS, OpenSuse)

# ./manage.py syncdb
# ./manage.py collectstatic

Inseriamo ora le informazioni utente

You just installed Django's auth system, which means you don't have any superusers defined.
Would you like to create one now? (yes/no): yes (digitare: yes)
Username (Leave blank to use 'admin'): admin (digitare: la vostra username or login)
E-mail address: [email protected] (digitare: la vostra email)
Password: xxxxxx (digitare: la vostra password)
Password (again): xxxxxx (digitare: conferma password)
Superuser created successfully.

Aggiunta di super utenti aggiuntivi

#./manage.py createsuperuser

Setup Nginx

Attenzione: Generalmente WebVirtMgr è disponibile solo da localhost sulla porta 8000. Questa operazione renderà WebVirtMgr a disposizione di tutti sulla porta 80. Il che significa che tutti possono vedere le credenziali di accesso!

Volendo si può anche saltare questo passaggio senza installare nginx. Con il semplice reindirizzando la porta 8000 sulla macchina locale via SSH. Questo è molto più sicuro perché WebVirtMgr non è a disposizione del pubblico ed è possibile accedervi solo tramite una connessione criptata.

Per esempio:

# ssh user@server:port -L localhost:8000:localhost:8000 -L localhost:6080:localhost:6080

Si dovrebbe essere in grado di accedere a WebVirtMgr da localhost digitando: 8000 nel browser dopo aver completato l’installazione. La porta 6080 viene inoltrato per l’uso di noVNC.

Sentitevi comunque liberi di ignorare l’avviso di sicurezza e continuate a impostare il redirect con nginx.

# cd ..
# mv webvirtmgr /var/www/          

Aggiungiamo il file webvirtmgr.conf in /etc/nginx/conf.d

server {
    listen 80 default_server;

server_name $hostname;

    #access_log /var/log/nginx/webvirtmgr_access_log; 

    location /static/ {
        root /var/www/webvirtmgr/webvirtmgr; # or /srv instead of /var
        expires max;
    }

    location / {
        proxy_pass http://127.0.0.1:8000;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-for $proxy_add_x_forwarded_for;
        proxy_set_header Host $host:$server_port;
        proxy_set_header X-Forwarded-Proto $scheme;
        proxy_connect_timeout 600;
        proxy_read_timeout 600;
        proxy_send_timeout 600;
        client_max_body_size 1024M; # Set higher depending on your needs 
    }
}

Aprire il file nginx.conf:

# nano /etc/nginx/nginx.conf

Commentare la sezione server come mostrato qui sotto:

#    server {
#        listen       80 default_server;
#        server_name  localhost;
#        root         /usr/share/nginx/html;
#
#        #charset koi8-r;
#
#        #access_log  /var/log/nginx/host.access.log  main;
#
#        # Load configuration files for the default server block.
#        include /etc/nginx/default.d/*.conf;
#
#        location / {
#        }
#
#        # redirect server error pages to the static page /40x.html
#        #
#        error_page  404              /404.html;
#        location = /40x.html {
#        }
#
#        # redirect server error pages to the static page /50x.html
#        #
#        error_page   500 502 503 504  /50x.html;
#        location = /50x.html {
#        }
#    }

Riavviamo ora il servizio nginx

# service nginx restart

Aggiorniamo ora la policy di SELiunx

# /usr/sbin/setsebool httpd_can_network_connect true 

Facciamo in modo che il servizio si avvii in modo permanente

# chkconfig supervisord on

Setup del supervisor

# chown -R nginx:nginx /var/www/webvirtmgr

Aggiungiamo queste righe alla fine del file /etc/supervisord.conf

# nano /etc/supervisord.conf

[program:webvirtmgr]
command=/usr/bin/python /var/www/webvirtmgr/manage.py run_gunicorn -c /var/www/webvirtmgr/conf/gunicorn.conf.py
directory=/var/www/webvirtmgr
autostart=true
autorestart=true
logfile=/var/log/supervisor/webvirtmgr.log
log_stderr=true
user=nginx
[program:webvirtmgr-console]
command=/usr/bin/python /var/www/webvirtmgr/console/webvirtmgr-console
directory=/var/www/webvirtmgr
autostart=true
autorestart=true
stdout_logfile=/var/log/supervisor/webvirtmgr-console.log
redirect_stderr=true
user=nginx

Riavviare il demone del Supervisor

$ sudo service supervisord stop
$ sudo service supervisord start

Se il panello non si avvia, accediamo all cartella

# cd /var/www/webvirtmgr

e digitiamo

# ./manage.py runserver 0:8000

ora tramite browser digitiamo http://ip_server:8000

Fine
 
 
 
 
 
 


Pubblicato da appuntidiadam

Sistemista informatico, e grande appasionato di astronomia e fisica, ricercatore indipendente in cosmologia

Lascia un commento

Il tuo indirizzo email non sarà pubblicato. I campi obbligatori sono contrassegnati *

Questo sito usa Akismet per ridurre lo spam. Scopri come i tuoi dati vengono elaborati.