Installare Virtualbox su un server headless CentOS 7 e gestirlo con l’aiuto di phpVirtualBox

Con questa guida andrò a installare un server per la virtualizzazione con gestione tramite interfaccia web, il sistema finito tenta di ricreare un sistema simile a quello che ci troveremmo davanti installando VMware vSphere. La domanda che sorge spontanea dopo questa prima premessa è: “Perché non sfruttare VMware vSphere in versione gratuita, senza sbattersi troppo?”

La risposta è che vSphere e in dettaglio l’ultima versione dell’hypervisor ESXi 5.5 ha requisiti hardware molto stringenti per quanto riguarda l’hardware supportato, come ad esempio il supporto solo ad alcuni controller hardware RAID, quasi nessuna possibilità di creare un RAID software, compatibilità limitata con NIC “consumer”, ma molto diffuse anche su server low-end, utilizzo di un file system “particolare” come VMFS5, ecc.

Se si rispettano tali requisiti è un ottimo sistema hypervisor, ma tentare di farlo funzionare con hardware non supportato ufficialmente mi ha portato più problemi di quelli che risolvevo.

Per cominciare, perché CentOS? Perché è una distribuzione derivata da Red Hat Enterprise Linux, la stessa distribuzione che VMware ha scelto come base per costruirci sopra ESXi, ha la possibilità di fare un installazione minimale e include SELinux e Firewalld. Credo che sia un ottima base per partire con un server più snello possibile e al contempo sicuro, è possibile che in alcuni passaggi eccederò con le spiegazioni anche di cose ovvie ai più, ma meglio abundare quam deficere.

Come ulteriore premessa aggiungo che non mi limiterò a fare come consigliano tante guide che ho trovato che si limitano a dirvi “Disattivate SELinux e firewalld” si grazie, ma se ci sono programmi per aumentare la sicurezza è buona norma tenerli attivi e ben configurati, non disattivarli.

Installazione di CentOS, pacchetti necessari e repository aggiuntivi

Come premesso partirò dall’installazione minimale di CentOS 7, per questo non posso che suggerirvi la lettura di https://www.liberiangeek.net/2014/07/install-centos-7-via-netinstall/ se non siete molto pratici nell’uso dell’installer.

In breve una volta fatto partire l’installer e selezionato la lingua, abilitate la scheda di rete per la connessione ad internet, selezionate la partizione del disco desiderata, il mio consiglio se lo utilizzate in ambiente produttivo è di fare un RAID 1 hardware o software, con tre partizioni, lo swap se necessario, una partizione di 8gb circa con mount ‘/’, ed una che riempie il disco restante con punto di mount /VirtualMachines, che potrete mettere come cartella di default per le macchine virtuali, inserite poi http://mirror.centos.org/centos/7/os/x86_64/ come repository, per i pacchetti da installare lasciate selezionata la prima voce, “Installazione minimale”; fatto questo impostate la password di root e la creazione di un nuovo utente se deriderato.

Come riferimento per le partizioni che ho utilizzato nell’esempio, con due dischi 160GB

raid-centos

Nota possibile bug tastiera: Premetto fin dall’inizio che pare che in alcuni casi la tastiera non venga configurata come “it”, ma come “it2”, non ho trovato workaroud validi, ma non ci ho sprecato troppo tempo perché si applica solo alla tastiera attaccata direttamente al server e non alle connessioni SSH (metodo prevalente con cui lavoro finita l’installazione) in ogni caso potete risolvere temporaneamente fino al riavvio digitando

Finita l’installazione proseguiremo con l’aggiornamento dei pacchetti installati (è un passaggio abbastanza importante perché più avanti quando scaricherete i pacchetti riguardanti gli header del kernel linux, verranno scaricati automaticamente quelli della versione più recente, non tenendo conto della versione che avete effettivamente installato) scrivendo

L’opzione -y è per evitare il prompt che chiede se vogliamo proseguire ad ogni passo, se volete controllare i pacchetti che verranno effettivamente aggiornati omettetelo.

Proseguiamo ad installare i pacchetti che ci serviranno più avanti, come breve spiegazione, ‘Development Tools’ installa la maggior parte dei programmi atti alla compilazione dei sorgenti,  vim e nano sono due editor testuali, potete usare quello che preferite, net-tools installa programmi per gestire la rete fra cui ifconfig, kernel-devel include kernel-headers, ma preferisco ridondare in questo caso, servono per la compilazione dei moduli di VirtualBox, SDL installa le librerie di sviluppo software, policycoreutils-python installa i programmi di gestione per SELinux, yum-plugin-priorities come dice il nome è un plugin di yum che ci aiuta a gestire l’integrità del repository al momento che aggiungeremo un repository di terze parti, wget è un programma che ci permette di recuperare file da server web.

Una volta fatto recuperiamo i file di configurazione del repository EPEL, che contiene dkms, un programma che serve alla generazione automatica dei moduli di VirtualBox, ma che non è incluso nei repository di CentOS

Se riceverete un Error 404, con buona probabilità significa che il pacchetto è stato aggiornato ad una versione più recente, potete consultare con un browser  http://dl.fedoraproject.org/pub/epel/7/x86_64/e e prelevate il nome della versione corrente.

Proseguiamo con l’installazione dei repository EPEL e VirtualBox e la loro configurazione

Nelle prime righe troverete enabled=1, cambiatelo con enabled=0, questo indica a yum di abilitare il repository solo a seguito di una richiesta esplicita con –enable-repo, accodate ad ogni sezione priority=10 e uscite con CTRL+X confermate il salvataggio.
Il vostro file dovrebbe assomigliare al seguente

Proseguiamo con

In questo file dobbiamo solamente accodare priority=1 ad ogni sezione in modo simile alla precedente, questo ci permette di evitare che un pacchetto proveniente da EPEL sovrascriva uno presente nel repository CentOS.

Installazione di VirtualBox 4.3, Extension Pack

Installiamo ora dkms, e VirtualBox 4.3

Per quanto ho potuto notare, il repository di VirtualBox è instabile, ignorate i possibili avvisi del tipo

VirtualBox-4.3-4.3.20_96996_el FAILED
http://download.virtualbox.org/virtualbox/rpm/el/7/x86_64/VirtualBox-4.3-4.3.20_96996_el7-1.x86_64.rpm:[Errno 12] Timeout on http://download.virtualbox.org/virtualbox/rpm/el/7/x86_64/VirtualBox-4.3-4.3.20_96996_el7-1.x86_64.rpm: (28, 'Operation too slow. Less than 1000 bytes/sec transferred the last 30 seconds')

yum tenterà nuove conessioni fino ad avvenuto scaricamento.
A questo punto va conclusa l’installazione del modulo kernel di VirtualBox, per fare ciò dobbiamo prima invocare setenforce 0 che disabiliterà SELinux fino a riavvio o come nel nostro caso fino alla riattivazione tramite setenforce 1 per permettere a dkms di lavorare senza preoccuparsi delle policy di sicurezza del sistema e senza doverci preoccupare di doverne inserire di temporanee.

Se per qualsiasi ragione durante vboxdrv setup doveste incontrare l’errore seguente
Your kernel headers for kernel 3.10.0-123.el7.x86_64 cannot be found at
/lib/modules/3.10.0-123.el7.x86_64/build or /lib/modules/3.10.0-123.el7.x86_64/source.

procedete ad un riavvio e ritentate ripartendo da setenforce, o alternativamente se dovesse persistere l’errore tentate un set della variabile ambientale con (cambiate opportunamente il nome del kernel)

Proseguiamo con l’installazione dell’Extension Pack per VirtualBox

Nota: Assicuratevi che la versione dell’Extension Pack corrisponda a quella di VirtualBox, potete trovare la directory con tutte le versioni a http://dlc-cdn.sun.com/virtualbox

La configurazione di base di VirtualBox si conclude con quest’ultimo passaggio….ma manca sempre l’interfaccia utente!!

Installazione e configurazione di Apache 2 e PHP

Per installarla provvediamo a installare e successivamente configurare, httpd server web Apache2, php e relative librerie necessarie.


 

La parte che segue prevede di cambiare la porta di httpd ad una diversa dalla 80, se non siete interessati passate oltre

Apriamo il file di configurazione httpd.conf

Nel file dobbiamo sostituire alla linea Listen 80 che troverere nella sezione seguente

una porta di nostra scelta, ad es. nel mio caso ho scelto Listen 7443. Vi suggerisco di scegliere una porta non assegnata ufficialmente dalla IANA (Internet Assigned Numbers Authority) per evitare eventuali problemi in futuro se doveste installare altro sul server, una lista delle porte assegnate potete trovarla su Wikipedia http://en.wikipedia.org/wiki/List_of_TCP_and_UDP_port_numbers
A questo punto dobbiamo configurare SELinux per permettere a httpd di aprire la nuova porta


E autorizziamo anche php-soap ad aprire la propria porta di default 18083

Controlliamo l’avvenuto inserimento con

come nello specchietto qua sotto
http_cache_port_t tcp 8080, 8118, 8123, 10001-10010
http_cache_port_t udp 3130
http_port_t tcp 18083, 7443, 80, 81, 443, 488, 8008, 8009, 8443, 9000
pegasus_http_port_t tcp 5988
pegasus_https_port_t tcp 5989

Possiamo ora attivare l’avvio al boot di httpd e riavviarlo

Se dovesse apparire l’errore
Job for httpd.service failed. See 'systemctl status httpd.service' and 'journalctl -xn' for details.
C’è una buona probabilità che abbiate inserito in maniera errata la porta o in httpd.conf o tramite semanage

Per essere raggiungibili al di fuori del localhost aggiungiamo l’eccezione al firewall con

Per ulteriori informazioni sul firewall di CentOS potete leggere https://access.redhat.com/documentation/en-US/Red_Hat_Enterprise_Linux/7/html/Security_Guide/sec-Using_Firewalls.html

Testate l’accessibilità del web server collegandovi http://ip_del_server:porta_scelta se è andato tutto secondo i piani dovrebbe accogliervi la pagina di default di CentOS.

E se avete lasciato la scheda di rete in DHCP e non trovate facilmente l’ip? Nessun problema, eseguendo

vi verrà presentato un riepilogo delle schede di rete collegate tipo il seguente
inet 192.168.3.118 netmask 255.255.255.0 broadcast 192.168.3.255
inet 127.0.0.1 netmask 255.0.0.0
inet6 ::1 prefixlen 128 scopeid 0x10

dove sono elencati i vari ip collegati.

Installazione e configurazione phpVirtualBox

Passiamo ora a installare e configurare phpVirtualBox, creiamo innanzitutto l’utente

Scegliete una password e annotatevela per dopo, se doveste incappare in
PASSWORD ERRATA: La password non supera il controllo del dizionario - Si basa su un termine di dizionario
oppure
PASSWORD ERRATA: La password è più corta di 8 caratteri
significa solo che avete scelto una password “debole”, ma potete proseguire.
Aggiungiamo l’utente appena creato al gruppo autorizzato a usare VirtualBox con

Vi consiglio di collegarvi almeno una volta come tale utente al fine di assicurarvi della corretta creazione della cartella home, potete farlo anche con

la password richiesta è quella dell’utente vbuser che avete poc’anzi inserito.

Scarichiamo e spostiamo l’ultima versione disponibile di phpVirtualBox nella cartella del server web, e aggiustiamo il contesto di sicurezza

Configuriamo phpVirtualBox

e inseriamo al posto di vbox e pass

Nota sicurezza: Sì come avete notato il sistema si basa sul salvataggio di una password in chiaro, è ovvio che questa può essere una possibile falla nella sicurezza, nel caso cerchiate un metodo più sicuro potete dare un occhiata al link seguente se può fare al caso vostro http://www.xqus.com/blog/phpvirtbox-vboxauthsimple

Creiamo il file seguente

e inseriamoci utente e posizione del file di log

Aggiungiamo l’avvio al boot di vboxweb

Se incontrate l’errore
Starting vboxweb-service (via systemctl): Job for vboxweb-service.service failed. See 'systemctl status vboxweb-service.service' and 'journalctl -xn' for details.
molto probabilmente avete posizionato il file di log in una posizione non scrivibile per l’utente vbuser, cambiatela o togliete la direttiva VBOXWEB_LOGFILE e riprovate.

Concludiamo con l’apertura delle porte nel firewall per l’RDP

Così potremo assegnare a ogni macchina virtuale una porta dalla 9000 alla 9020 per poter essere gestita, potete cambiarle in base alle vostre esigenze

Se avete messo una partizione separata per le macchine virtuali ricordatevi di cambiarla nelle impostazioni tramite phpvirtualbox

default-machine-folder

Ma soprattutto di aggiungere vbuser come proprietario con

Link utili

Per la stesura mi sono fornito di diverse fonti, le più rilevanti ve le elenco qua sotto: