Eccoci di nuovo a parlare di virtualizzazione utilizzando il software Oracle VM VirtualBox. Nel precedente articolo avevamo visto come installare e configurare una macchina virtuale (VM) Windows XP su sistema operativo host Linux Fedora 14 a 64 bit, in lingua italiana, con desktop Gnome. Avevamo largamente sfruttato la comoda interfaccia grafica messa a disposizione dal programma.
Spesso però i server Linux non hanno un ambiente desktop e sono gestiti da remoto sfruttando il protocollo SSH. Per fortuna VirtualBox rende disponibile un front-end alternativo, denominato VBoxHeadless, che non produce alcun output visibile sul sistema host, ma consente di connettersi alle macchine virtuali attraverso il protocollo RDP (Remote Desktop Protocol). Prima di procedere potrebbe esservi utile la lettura di Utilizzare il Desktop Remoto di Microsoft con Linux.
Di seguito ripercorreremo le tappe del precedente articolo: installazione del software VirtualBox, creazione di una macchina virtuale Windows XP (poco cambierebbe se fosse Windows 7 o Windows Server 2008) ed infine installazione del sistema operativo guest. Non approfondiremo aspetti già trattati in dettaglio, quindi, se non l'avete fatto, consiglio per lo meno una lettura veloce di Windows dentro Linux: la virtualizzazione con VirtualBox.
Installiamo VirtualBox
Immaginiamo di accedere da remoto al nostro server Fedora 14 tramite SSH con un account utente non privilegiato. Naturalmente per l'installazione dovremo poter assumere i privilegi di root. Tra i prerequisiti ricordo brevemente l'aggiornamento, consigliato, del kernel e la necessaria presenza degli header del kernel medesimo per l'installazione dei moduli vboxdrv, vboxnetflt, vboxnetadp. Per facilitare futuri aggiornamenti, inoltre, risulterà utile il pacchetto dkms, mentre in questo caso non sono necessarie le librerie grafiche Qt e SDL.
$ yum install kernel kernel-devel kernel-headers dkms
Dovremo sicuramente installare, se assenti dal sistema, i pacchetti GNU compiler e GNU Make:
$ yum install gcc make
A questo punto posizioniamoci in una directory di lavoro e preleviamo dal sito del produttore l'rpm corrispondente alla nostra distribuzione: Fedora 14 64 bit.
$ cd /home/ermanno/vbox $ wget http://download.virtualbox.org/virtualbox/4.0.4/VirtualBox-4.0-4.0.4_70112_fedora14-1.x86_64.rpm
Calcoliamo il checksum SHA256 del file appena scaricato:
$ sha256sum VirtualBox-4.0-4.0.4_70112_fedora14-1.x86_64.rpm
e confrontiamolo con quello fornito dal sito, onde evitare possibili corruzioni o manipolazioni. Infine procediamo con l'installazione:
$ rpm -ivh VirtualBox-4.0-4.0.4_70112_fedora14-1.x86_64.rpm
Virtualbox Extension Pack
Sin qui non ci sono sostanziali differenze con la procedura già analizzata, ma ora dobbiamo discostarcene per occuparci dell'Extension Pack. Infatti dalla versione 4.0 il software è stato scomposto in un pacchetto base, rilasciato con licenza GNU General Public License V2, ed un Extension Pack di cui sono disponibili solo i binari, rilasciato con licenza VirtualBox Personal Use and Evaluation License (PUEL). Lo scopo delle estensioni è introdurre alcune funzionalità aggiuntive, tra queste prenderemo in considerazione solo il VirtualBox Remote Desktop Protocol (VRDP). Altro non è che l'implementazione di Oracle all'interno del proprio prodotto del protocollo RDP di Microsoft. Preleviamo, dunque, il corrispondente file:
$ wget http://download.virtualbox.org/virtualbox/4.0.4/Oracle_VM_VirtualBox_Extension_Pack-4.0.4-70112.vbox-extpack
ed installiamolo:
$ VBoxManage extpack install Oracle_VM_VirtualBox_Extension_Pack-4.0.4-70112.vbox-extpack
Abbiamo fatto ricorso al comando VBoxManage, già fugacemente menzionato nel precedente articolo, che rappresenta il vero e proprio pilastro della gestione del software tramite riga di comando. Per familiarizzare con le numerose opzioni digitiamo:
$ VBoxManage --help
A questo punto, prima di lasciare i panni di root, aggiungiamo l'utente non privilegiato con cui abbiamo fatto il login e con cui presumibilmente vogliamo gestire la macchina virtuale, al gruppo vboxusers.
$ usermod -a -G vboxusers ermanno $ exit
Creiamo la VM
Ora come utente non privilegiato creiamo la nuova macchina virtuale che chiameremo winxp.
$ VBoxManage createvm --name "winxp" --ostype WindowsXP --register Virtual machine 'winxp' is created and registered. UUID: bc2b1ac7-5766-4ebd-8faf-3d4c7b025eb6 Settings file: '/home/ermanno/VirtualBox VMs/winxp/winxp.vbox'
Nella creazione, createvm
, abbiamo usato due ulteriori opzioni --ostype
e --register
. La prima, specificando il tipo di sistema operativo, ci permette di selezionare alcune opzioni predefinite per non partire proprio da zero. La seconda ci consente di registrare la VM, operazione indispensabile, che altrimenti dovremmo successivamente eseguire con il comando VBoxManage registervm
.
L'output del comando fornisce alcuni dettagli che è utile analizzare. Innanzitutto possiamo osservare che alla macchina virtuale viene assegnato un identificativo univoco, UUID. Questo può essere utilizzato al posto del nome descrittivo, winxp, anche se risulta alquanto scomodo. Inoltre ci viene segnalato che il file di configurazione, denominato winxp.vbox, è stato creato nella directory VirtualBox VMs/winxp presente all'interno della home dell'utente. Se per curiosità diamo un'occhiata al file noteremo che, utilizzando il formato XML, riporta tutte le opzioni da noi scelte in fase di configurazione. A mano a mano che procederemo esso verrà aggiornato con le nuove caratteristiche. Sconsiglio di editare a mano il file, anche se sarebbe in linea di principio possibile, meglio lasciar fare a VBoxManage.
Ora inseriamo qualche opzione di configurazione ad hoc:
VBoxManage modifyvm "winxp" --memory 256 --acpi on --boot1 dvd --nic1 bridged --bridgeadapter1 eth0
Abbiamo modificato, modifyvm
, la macchina virtuale aggiungendo alcuni parametri di immediata interpretazione. Per completezza però analizziamoli velocemente: --memory
imposta la quantità di RAM assegnata al sistema guest, mentre --acpi
attiva/disattiva l'Advanced Configuration and Power Interface. Volendo fare il boot da CD/DVD per poter installare Windows XP abbiamo specificato come primo dispositivo, --boot1
, il valore dvd. Da ultimo abbiamo impostato la scheda di rete scegliendo una configurazione con bridge ed eseguendo il bridging sull'interfaccia eth0 dell'host. Se volessimo più schede potremmo inserire i parametri per nic2, nic3 etc..
Ricordo la possibilità di adottare altri tipi di configurazione, tra cui il predefinito NAT, --nic1 nat
.
Passiamo ora alla creazione del disco fisso virtuale al quale corrisponderà un file con estensione .vdi, selezioniamo un taglio pari a 10 GB:
$ VBoxManage createhd --filename "winxp.vdi" --size 10000
Aggiungiamo una controller IDE:
$ VBoxManage storagectl "winxp" --name "IDE Controller" --add ide --controller PIIX4
Impostiamo il disco fisso winxp.vdi, appena creato, come primo disco della macchina virtuale:
$ VBoxManage storageattach "winxp" --storagectl "IDE Controller" --port 0 --device 0 --type hdd --medium "winxp.vdi"
A questo punto creiamo un'immagine ISO del sistema operativo Windows XP che chiameremo winxp.iso, e trasferiamola via scp sul server. Per comodità utilizziamo la medesima directory di lavoro vista il precedenza. Colleghiamo il file winxp.iso in modo che la VM lo veda come un cd inserito nel lettore CD/DVD e possa così effettuare il boot da quest'ultimo:
$ VBoxManage storageattach "winxp" --storagectl "IDE Controller" --port 0 --device 1 --type dvddrive --medium /home/ermanno/vbox/winxp.iso
Avvio della VM
Prima di lanciare la nostra macchina virtuale apportiamo ancora qualche piccolo ritocco. Sappiamo che ci collegheremo da remoto utilizzando il protocollo VRDP e che per impostazione predefinita il server VRDP accetterà connessioni sulla porta TCP 3389. Potrebbe essere utile, per alcune considerazioni successive, utilizzare una porta diversa ad esempio la 5000:
$ VBoxManage modifyvm "winxp" --vrde on $ VBoxManage modifyvm "winxp" --vrdeport 5000
È giunto il momento della verità: dobbiamo avviare la VM. Possiamo farlo in due modi, il primo ricorrendo all'onnipresente VBoxManage e specificando con l'opzione --type
l'adozione del frontend headless invece di quello grafico:
$ VBoxManage startvm "winxp" --type headless
Il secondo metodo, da preferire per un debug degli errori più accurato, prevede l'utilizzo di VBoxHeadless. In questo caso il server VRDP verrà abilitato di default anche se non lo si è specificato nella configurazione della VM:
$ VBoxHeadless --startvm "winxp"
Supponendo di non aver ricevuto alcun errore all'avvio possiamo procedere con l'installazione del sistema guest.
Una piccola nota a margine: se invece di un sistema Windows volessimo installare Linux potrebbe essere sufficiente una console ssh per gestirlo. In tal caso il server VRDP risulterebbe inutile:
$ VBoxHeadless --startvm "nome_vm" --vrde=off
Nella prossima parte dell'articolo vedremo come installare il sistema ospite, come migliorare la sicurezza della nostra installazione e tutti i comandi per gestire la macchina virtuale.
Installiamo il sistema ospite
Il primo problema da affrontare è l'accesso alla macchina virtuale. Per forza di cose ci sarà necessario un programma client RDP. Se il nostro pc è dotato di un sistema Windows (XP o successivo) tra il software di base troviamo già "Connessione desktop remoto" che fa' al caso nostro. Se invece usiamo Linux sarà necessario installare il client open source rdesktop.
$ yum install rdesktop
Possiamo ora collegarci dal nostro pc utilizzando il numero IP o l'hostname del server e specificando la porta:
$ rdesktop -a 16 -g 1024x768 server.miodominio.it:5000
le opzioni aggiuntive servono solo a specificare una profondità del colore limitata a 16 bit ed una geometria del desktop pari a 1024x768.
Se tutto funziona a dovere ci troveremo di fronte alla schermata blu d'installazione di Windows XP e potremo procedere come di consueto. Per ulteriori approfondimenti relativi alla post-installazione, in particolare Guest Additions, vi rimando al precedente articolo.
Penso che qualcuno di voi abbia già storto il naso per il tipo di licenza dell'Extension Pack, che potrebbe non essere assolutamente adatta agli scopi per cui è stata installata la macchina virtuale headless. Se malgrado tutto avete proseguito la lettura, posso proporre un paio di soluzioni per aggirare il problema. Nel caso dei sistemi Microsoft il server RDP è già integrato ed è quindi possibile configurarlo, testarlo e poi disinstallare l'Extension Pack. Per questo ho preferito specificare una porta alternativa per il server VRDP.
Nel caso di Windows XP è possibile attivarlo con tasto destro su Risorse Del Computer, selezionando Proprietà e poi Connessione Remota ed aggiungendo la spunta alla casella Consenti agli utenti di connettersi in modo remoto al computer, eventualmente scegliendo anche gli utenti autorizzati. Attenzione che a questo punto per l'accesso da remoto dovremo collegarci al sistema guest e non più all'host. Supponendo di aver impostato un indirizzo IP 11.22.33.44 per il guest, stabiliamo la connessione con:
$ rdesktop -a 16 -g 1024x768 11.22.33.44:3389
Per disinstallare l'Extension Pack basta il comando:
$ VBoxManage extpack uninstall "Oracle VM VirtualBox Extension Pack"
In alternativa sarebbe possibile creare e configurare una macchina virtuale Windows su un host locale avendo cura di abilitare il servizio RDP. Successivamente trasferirla sull'host remoto effettuandone l'importazione. Purtroppo lo spazio a disposizione non ci permette di approfondire l'argomento.
Alcune considerazioni sulla sicurezza
Nella procedura che abbiamo seguito la connessione al server VRDP non richiede alcuna autenticazione il che, salvo trovarci in ambienti operativi particolarmente sicuri, non è una buona cosa. Oltre al momento dell'installazione, pensate al richio di lasciare per dimenticanza una sessione di Windows aperta. Chiunque collegandosi prima del lock automatico potrebbe avere accesso al nostro sistema.
Meglio ricorrere alla libreria VBoxAuth che, per impostazione predefinita, si appoggia al sistema di gestione delle utenze dell'host. In particolare su Linux opererà tramite PAM. In tal modo, previa comunicazione delle proprie credenziali d'accesso, ciascun utente presente sull'host, anche non corrispondente a quello con cui gira la VM, potrà collegarsi ad essa.
Un'altra utile libreria VBoxAuthSimple consente invece di astrarre l'autenticazione dal particolare sistema operativo, utilizzando credenziali inserite nella sezione "extradata" del file di configurazione. Per abilitarla digitiamo:
$ VBoxManage setproperty vrdeauthlibrary "VBoxAuthSimple"
successivamente agiamo sulla VM:
$ VBoxManage modifyvm "winxp" --vrdeauthtype external
le opzioni possibili sono null, external, guest. La prima non prevede autenticazione, la seconda è quella da noi utilizzata, mentre la terza è ancora in fase di test.
Generiamo ora una password criptata mediante l'utility resa disponibile da VirtualBox:
$ VBoxManage internalcommands passwordhash "ilmiosegreto" Password hash: 8a1e4ae229785796fec419d0011605584a1ee493814578a311ff057bb692ba9c
aggiungiamo utente e password alla sezione extradata:
$ VBoxManage setextradata "winxp" "VBoxAuthSimple/users/admin" 8a1e4ae229785796fec419d0011605584a1ee493814578a311ff057bb692ba9c
Per la connessione ora saremo obbligati a fornire le nostre credenziali:
rdesktop -a 16 -g 1024x768 -u admin -p ilmiosegreto server.miodominio.it:5000
Comandi utili per la gestione
Di seguito vediamo i principali comandi che ci permettono di gestire la/le VM installate sul nostro server. Innanzitutto possiamo ottenere l'elenco di quelle registrate:
$ VBoxManage list vms
Se volessimo la lista delle macchine virtuali attive:
$ VBoxManage list runningvms
Per visualizzare le caratteristiche di una specifica macchina:
$ VBoxManage showvminfo "winxp"
Per fermare la VM "staccando il cavo di alimentazione":
$ VBoxManage controlvm "winxp" poweroff
per una chiusura del sistema controllata:
VBoxManage controlvm "winxp" acpipowerbutton
per farlo invece salvando lo stato su disco:
VBoxManage controlvm "winxp" savestate
per resettarla:
$ VBoxManage controlvm "winxp" reset
per metterla in pausa e risvegliarla:
$ VBoxManage controlvm "winxp" pause $ VBoxManage controlvm "winxp" resume
Ovviamente la lista delle possibili opzioni sarebbe ancora lunga, in caso di necessità potete consultare da console l'help dei comandi stessi oppure, per maggiori approfondimenti, il manuale disponibile on-line.
In chiusura, come già fatto nel precedente articolo, vi ricordo che abbiamo mosso solo i primi passi nel mondo di VirtualBox ricco di numerose altre caratteristiche come importazione ed esportazione di VM, snapshots, condivisioni host/guest, supporto per dischi virtuali di terzi ad esempio VMware VMDK o Microsoft VHD. Per nostra fortuna la dettagliata documentazione fornita da produttore rappresenta una miniera inesauribile di informazioni.