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
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
1 |
loadkeys it |
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
1 2 |
sudo yum update -y sudo reboot |
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.
1 2 3 |
sudo yum groupinstall 'Development Tools' -y sudo yum install vim nano net-tools kernel-devel kernel-headers SDL policycoreutils-python yum-plugin-priorities wget -y sudo reboot |
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
1 2 |
cd /tmp wget http://dl.fedoraproject.org/pub/epel/7/x86_64/e/epel-release-7-5.noarch.rpm |
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
1 2 3 4 |
sudo rpm -Uvh epel-release-7*.rpm cd /etc/yum.repos.d sudo wget http://download.virtualbox.org/virtualbox/rpm/el/virtualbox.repo sudo nano /etc/yum.repos.d/epel.repo |
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
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 |
[epel] name=Extra Packages for Enterprise Linux 7 - $basearch #baseurl=http://download.fedoraproject.org/pub/epel/7/$basearch mirrorlist=https://mirrors.fedoraproject.org/metalink?repo=epel-7&arch=$basearch failovermethod=priority enabled=0 gpgcheck=1 gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-EPEL-7 priority=10 [epel-debuginfo] name=Extra Packages for Enterprise Linux 7 - $basearch - Debug #baseurl=http://download.fedoraproject.org/pub/epel/7/$basearch/debug mirrorlist=https://mirrors.fedoraproject.org/metalink?repo=epel-debug-7&arch=$b$ failovermethod=priority enabled=0 gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-EPEL-7 gpgcheck=1 priority=10 [epel-source] name=Extra Packages for Enterprise Linux 7 - $basearch - Source #baseurl=http://download.fedoraproject.org/pub/epel/7/SRPMS mirrorlist=https://mirrors.fedoraproject.org/metalink?repo=epel-source-7&arch=$$ failovermethod=priority enabled=0 gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-EPEL-7 gpgcheck=1 priority=10 |
Proseguiamo con
1 |
sudo nano /etc/yum.repos.d/CentOS-Base.repo |
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
1 |
sudo yum --enablerepo=epel install dkms VirtualBox-4.3 -y |
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.
1 2 3 |
sudo setenforce 0 sudo /etc/init.d/vboxdrv setup sudo setenforce 1 |
Se per qualsiasi ragione durante vboxdrv setup doveste incontrare l’errore seguenteYour 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)
1 |
export KERN_DIR=/usr/src/kernels/*kernel_in_uso* |
Proseguiamo con l’installazione dell’Extension Pack per VirtualBox
1 2 3 |
cd /tmp wget http://dlc-cdn.sun.com/virtualbox/4.3.20/Oracle_VM_VirtualBox_Extension_Pack-4.3.20-96996.vbox-extpack sudo VBoxManage extpack install Oracle_VM_VirtualBox_Extension_Pack-*.vbox-extpack |
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.
1 |
sudo yum install httpd php php-devel php-gd php-common php-soap -y |
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
1 |
sudo nano /etc/httpd/conf/httpd.conf |
Nel file dobbiamo sostituire alla linea Listen 80 che troverere nella sezione seguente
1 2 3 4 5 6 7 8 9 10 11 12 13 |
[...] # # Listen: Allows you to bind Apache to specific IP addresses and/or # ports, instead of the default. See also the # directive. # # Change this to Listen on specific IP addresses as shown below to # prevent Apache from glomming onto all bound IP addresses. # #Listen 12.34.56.78:80 Listen 80 [...] |
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
1 |
sudo semanage port -a -t http_port_t -p tcp 7443 |
E autorizziamo anche php-soap ad aprire la propria porta di default 18083
1 2 |
sudo setsebool -P httpd_can_network_connect=1 sudo semanage port -a -t http_port_t -p tcp 18083 |
Controlliamo l’avvenuto inserimento con
1 |
sudo semanage port -l | grep http |
come nello specchietto qua sottohttp_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
1 2 |
sudo chkconfig --levels 235 httpd on sudo service httpd restart |
Se dovesse apparire l’erroreJob 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
1 2 |
sudo firewall-cmd --permanent --zone=public --add-port=7443/tcp sudo firewall-cmd --reload |
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
1 |
ifconfig | grep inet |
vi verrà presentato un riepilogo delle schede di rete collegate tipo il seguenteinet 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
1 2 |
sudo useradd vbuser sudo passwd vbuser |
Scegliete una password e annotatevela per dopo, se doveste incappare inPASSWORD ERRATA: La password non supera il controllo del dizionario - Si basa su un termine di dizionario
oppurePASSWORD 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
1 |
sudo usermod -a -G vboxusers vbuser |
Vi consiglio di collegarvi almeno una volta come tale utente al fine di assicurarvi della corretta creazione della cartella home, potete farlo anche con
1 2 |
su --login vbuser exit |
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
1 2 3 4 5 6 |
cd /tmp wget http://sourceforge.net/projects/phpvirtualbox/files/phpvirtualbox-4.3-1.zip unzip phpvirtualbox-4.3-1.zip sudo mv phpvirtualbox-4.3-1 /var/www/html/phpvirtualbox sudo cp /var/www/html/phpvirtualbox/config.php-example /var/www/html/phpvirtualbox/config.php sudo chcon -Rv --type=httpd_sys_content_t /var/www/html |
Configuriamo phpVirtualBox
1 |
sudo nano /var/www/html/phpvirtualbox/config.php |
e inseriamo al posto di vbox e pass
1 2 3 4 |
[...] var $username = 'vbuser'; var $password = 'password_scelta'; [...] |
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
1 |
sudo nano /etc/default/virtualbox |
e inseriamoci utente e posizione del file di log
1 2 |
VBOXWEB_USER=vbuser VBOXWEB_LOGFILE="/home/vbuser/vboxwebservice.log" |
Aggiungiamo l’avvio al boot di vboxweb
1 2 3 |
sudo chkconfig --levels 235 vboxweb-service on sudo /etc/init.d/vboxweb-service restart sudo service httpd restart |
Se incontrate l’erroreStarting 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
1 2 |
sudo firewall-cmd --permanent --zone=public --add-port=9000-9020/tcp sudo firewall-cmd --reload |
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
Ma soprattutto di aggiungere vbuser come proprietario con
1 |
sudo chown vbuser:vboxusers -R /VirtualMachines |
Link utili
Per la stesura mi sono fornito di diverse fonti, le più rilevanti ve le elenco qua sotto:
- https://www.liberiangeek.net/2014/09/installing-virtualbox-centos-7-headless-server-support-phpvirtualbox/
- http://wiki.centos.org/PackageManagement/Yum/Priorities
- http://wiki.centos.org/HowTos/SELinux
- http://www.rackspace.com/knowledge_center/article/install-epel-and-additional-repositories-on-centos-and-red-hat
- http://serverfault.com/questions/563872/selinux-allow-httpd-to-connect-to-a-specific-port
- http://www.howtoforge.com/managing-a-headless-virtualbox-installation-with-phpvirtualbox-centos-6.2
- https://access.redhat.com/documentation/en-US/Red_Hat_Enterprise_Linux/7/html/Security_Guide/sec-Using_Firewalls.html