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.
Fase 2: Inserire la posizione dell’immagine ISO come CD-ROM e non dimenticate di scegliere il tipo di sistema operativo e la versione.
Fase 3: Configurare la CPU e la memoria per macchina virtuale.
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.
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.
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.
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.
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.
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
: conf
erma
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