== Sun Virtualbox == Appunti sparsi su Virtualbox versione 3.x. (adatto anche alla 4.x con piccole varianti) === Installazione su Debian Lenny === Sul sito di Virtualbox (www.virtualbox.org) ci sono le indicazioni su come installare il pacchetto gia` pronto di Virtualbox PUEL (Personal Use and Evaluation License) (ma dico io, vi sembra una sigla decente "PUEL"? A me fa troppo ridere) su Debian Lenny (32 e 64 bit). In pratica si tratta di aggiungere un repository e fare un aptitude install. Una volta installata, supponendo di usare sempre dei server senza interfaccia grafica, resta il problema di gestire le macchine virtuali senza interfaccia grafica, appunto. Il che non e` una tragedia, comunque. Innanzitutto, VirtualBox (e le relative VM) possono essere fatti girare da root, o anche da un utente normale, purche` esso appratenga al gruppo "vboxusers", che viene creato automaticamente dal setup di VirtualBox stesso. In questa configurazione creo un utente "virtualbox" il quale avra` il compito di fare girare la mia VM. {{{ adduser --ingroup vboxusers virtualbox }}} Sulla macchina server, per potermi collegare remotizzando la interfaccia di Virtualbox, devo ricordarmi di installare il pacchetto {{{xauth}}}. A questo punto, posso fare login in ssh da un pc con installato Linux e con X, usando lo username appena creato. Siccome vorrei poter lanciare l'interfaccia grafica di Virtualbox, usando come schermo quello del mio PC con X, dovro` ridirigere opportunamente lo schermo. Facendo ssh al server con il parametro "-X" si ridirige una sessione X11 sul proprio PC, quindi e` sufficiente usare il comando: {{{ ssh virtualbox@server -X }}} Seguito dal comando per lanciare l'interfaccia grafica di Virtualbox, che e` {{{ VirtualBox }}} Se mi dice che non puo` trovare lo schermo, e` probabile che manchi il programma "xauth" sul server. In questo caso per esempio si puo` installarlo installando il pacchetto {{{xbase-clients}}}. Ora e` possibile configurare una macchina virtuale usando l'interfaccia grafica, che e` molto comoda. Una volta finito, si potra` lanciare la macchina virtuale da command line. === Configurazione di una VM === Per poter accedere alla console delle VM in assenza dell'interfaccia grafica sul server, la soluzione piu` comoda offerta da Virtualbox e` quella di usare il protocollo RDP. Quando si crea una VM, alla voce della configurazione video, sara` sufficiente abilitare il "Remote Display" scegliendo una porta diversa per ogni VM. Una volta fatto questo, avviare la VM da console di testo sul server, con il comando: {{{ VBoxManage startvm "nome della VM" -type vrdp }}} Sara` ora possibile connettersi al suo video usando un client RDP, puntando all' IP del server (e NON quello della VM) sulla porta indicata prima in configurazione. === Comandare una VM da console di testo === Da una console di testo e` facile avviare, fermare o sospendere una VM usando il comando {{{VboxManage}}}. Per avviare una VM: {{{ VBoxManage startvm "nome della VM" -type vrdp }}} Per sospendere una VM (salva lo stato sul disco e permette di tornare, usando il comando di avvio indicato sopra, esattamente dove si era quando si e` sospesa la VM) {{{ VBoxManage controlvm "nome della VM" savestate }}} Per arrestare una VM usando una procedura graceful per fermare il sistema guest anziche` spegnere alla brutta, si puo` simulare la pressione del tasto di accensione. Questo sulle macchina moderne genera una evento ACPI che induce il sistema operativo a fare uno shutdown. Questo sistema funziona con i sistemi che gestiscono tale segnale, ovviamente. Linux (moderno) e Windows XP funzionano. {{{ VBoxManage controlvm "nome della VM" acpipowerbutton }}} Uno spegnimento secco (non e` carino) si ottiene con {{{ VBoxManage controlvm "nome della VM" poweroff }}} === Lanciare e fermare una VM al boot/shutdown dell' host === Per lanciare una VM e fermarla (sospendendola) durante l'avvio e lo shutdown della macchina host, mi sono accrocchiato questo SCHIFOSO script da mettere in /etc/init.d e linkare opportunamente in /etc/rc2.d e /etc/rc6.d. Lo script si chiama /etc/init.d/vbox-guest e contiene: {{{ #!/bin/bash # start and stop virtualbox virtual machines # disgusting script by Kurgan ### BEGIN INIT INFO # Provides: vbox-guest # Required-Start: $remote_fs $syslog vboxdrv # Required-Stop: $remote_fs $syslog vboxdrv # Default-Start: 2 3 4 5 # Default-Stop: 0 1 6 # Short-Description: Start and Stop Virtualbox Virtual Machines # Description: Debian init script for VirtualBox Virtual Machines ### END INIT INFO PATH=/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin DAEMON="/usr/bin/VBoxManage" NAME="VboxVM" DESC="VirtualBox Virtual Machines" USER="virtualbox" test -x $DAEMON || exit 0 . /lib/lsb/init-functions set -e case "$1" in start) log_daemon_msg "Starting $DESC" "$NAME" su - $USER -c ' VBoxManage startvm "nome della VM" -type vrdp ' log_end_msg $? ;; stop) log_daemon_msg "Stopping $DESC" "$NAME" su - $USER -c ' VBoxManage controlvm "nome della VM" savestate ' log_end_msg $? ;; *) echo "Usage: $0 {start|stop}" >&2 exit 1 ;; esac exit 0 }}} Notare il nome utente dell'utente che possiede le VM (la variabile USER) che nel caso va messo a posto. Ovviamente se avete piu` di una VM potete mettere piu` righe con VboxManage una per ogni VM. Lo so che fa schifo, ma funziona. Una volta creato lo script e reso eseguibile per root, occorre renderlo parte della procedura di avvio e shutdown con il comando {{{insserv vbox-guest}}} === Backup delle VM === E qui sono dolori, perche` tirare a indovinare vuole dire scoprire che il restore non funziona quando e` troppo tardi. Premesso che devo ancora leggere un sacco di documentazione, e` chiaro che non e` possibile copiare i files di una VM in esecuzione, si otterrebbe una porcheria incoerente (file system del guest corrotto). La soluzione banale, se si ha tempo e si puo` mettere il guest offline, e` quella di fermare il guest, copiare tutto quanto (dischi, impostazioni delle VM, eccetera) e riavviare la VM. Una cosa del tipo: {{{ VBoxManage controlvm "nome della VM" acpipowerbutton tar czf backup.tgz /home/virtualbox/ VBoxManage startvm "nome della VM" -type vrdp }}} Alternativamente, dovrebbe essere possibile sospendere la VM, backupparla e riavviarla, senza attendere lo shutdown e il boot del guest. Non sono certo che questo non possa potenzialmente dare problemi se si dovesse poi migrare la VM da un host a un altro, perche` pare che VirtualBox sia molto rognoso con la migrazione degli stati salvati e degli snapshot {{{ VBoxManage controlvm "nome della VM" savestate tar czf backup.tgz /home/virtualbox/ VBoxManage startvm "nome della VM" -type vrdp }}} Con le versioni nuove (4.x) di Virtualbox e` stato introdotto il comando "vboxmanage clonevm" che consente di creare cloni delle VM. Puo` essere usato come sistema di backup, sempre con le macchine ferme o sospese, mai in esecuzione. Un esempio di script: {{{ # salvo e fermo la VM VBoxManage controlvm "nome della VM" savestate # faccio un clone della VM nel percorso di backup, con il nome specificato in "--name" vboxmanage clonevm "nome della VM" --name "nome della VM backup" --basefolder /path/del/backup # riavvio la VM VBoxManage startvm "nome della VM" -type vrdp }}} Alla fine del clone, e` necessario fare un bel tgz del clone stesso e cancellarlo, perche` altrimenti al prossimo giro il clone non riesce in quanto esiste gia` un clone con quel nome in quel percorso. Idealmente, quindi, dopo aver fermato-clonato-riavviato le varie VM, si procede al tar, e poi alla eliminazione dei cloni stessi, per poter rifare i cloni la prossima volta. Notare che anche se non registro la VM clonata in Virtualbox, il suo disco (clonato) si registra comunuqe, quindi devo de-registrarlo per poterlo cancellare e rifare. Notare anche che con l'attuale versione di Virtualbox il comando per de-registrarlo riporta un errore anche se poi in effetti lo deregistra correttamente. Che ciofeca di sistema. {{{ # deregistro il disco della VM senza pero` cancellarlo fisicamente (usando il nome del file vdi): vboxmanage closemedium disk /path/del/backup/completo/file_disco.vdi # tar della VM con cancellazione automatica dei files di origine mentre creo il tar tar czf /path/del/backup/nome_vm.tgz /path/del/backup/nome della vm/ --remove-files }}} Alternativamente ancora, ma e` tutto da provare, dovrebbe essere possibile fare uno snapshot senza fermare la VM, poi salvare tutto escluso lo snapshot (il quale e` attivamente modificato dal fatto che il guest gira) e al momento del restore, fare a meno dello snapshot, restorando quindi una VM che e` come se fosse stata resettata, quindi ha in effetti potenzialmente perso qualche dato, ma il vantaggio di questo sistema e` che il backup e` stato fatto con la macchina guest ancora in funzione, quindi senza interruzione del servizio. Questo sistema pone due limiti: * 1- lo snapshot viene perso, quindi in effetti vi e` potenzialmente corruzione dei dati * 2- fatto lo snapshot e il backup, devo "eliminare" lo snapshot, con {{{VBoxManage snapshot discard}}} (con gli appositi parametri), ma questa operazione non la posso fare se la VM e` accesa, quindi devo comunque fare una micro-interruzione, magari con un savestate, poi un discard, e poi riavviare. === Script di backup con savestate e clone === Questo e` uno script che ho messo assieme che fa il savestate e il clone. Come sempre e` una ciofeca, e come sempre va adattato alla configurazione specifica. {{{ #!/bin/bash # questo script fa il backup delle VM di virtualbox creandone dei cloni # dentro a /backupdisk e poi targrzippandoli. Alla fine cancella i cloni. # fermo le VM e faccio i cloni, poi riavvio le VM nel minor tempo possibile. # Per ogni VM devo ripetere la procedura. vboxmanage controlvm "" savestate vboxmanage clonevm "" --name "-backup" --basefolder /backupdisk/virtualbox vboxmanage startvm "" -type vrdp # deregistro i dischi dei cloni che tanto non servono a una cippa. # Questo non cancella i files, cosa che NON voglio, ma si limita a fare si` che virtualbox # si dimentichi della loro esistenza. Ovviamente una riga uguale per ogni VM. vboxmanage closemedium disk /backupdisk/virtualbox/-backup/-backup.vdi # targzippo i cloni, tenendone due copie precendenti. Prima ruoto le copie vecchie, non si sa mai. savelog -l -c 2 /backupdisk/virtualbox/*.tgz # poi targzippo i cloni. (una riga per ogni VM) tar czf /backupdisk/virtualbox/.tgz /backupdisk/virtualbox/-backup --remove-files # Ora ho i files targzippati e se voglio li posso copiare da qualche parte, tipo su un disco usb o altro. # copio i cloni in uno share nfs if [ -f /mnt/not_mounted ]; then echo "Monto il disco di backup in nfs" mount -t nfs -o udp,vers=3 boh:/backup2 /mnt echo "Copio i files delle VM" cp -a /backupdisk/virtualbox/*.tgz /mnt/virtualbox-backups/ sleep 20s echo "Fine copia, smonto il disco" umount /mnt else echo "ERRORE: /mnt e` gia` montata, non posso copiare i file delle VM" fi; }}} === Drivers SATA per Windows XP === Se si vuole usare una immagine di hard disk montata su un controller SATA, occorrono i drivers della Intel per i controller Intel, denominati "RAID/​AHCI Software -​​ Intel® Matrix Storage Manager" o anche "Intel Matrix Storage Technology", da montare tramite floppy all'installazione oppure dopo aver installato. In questo caso si monta prima il disco su un controller IDE normale (sempre virtuale), si installa, poi si abilita il sata lasciando il disco sull' IDE, si installano i drivers, e poi si cambia da IDE a SATA il controller virtuale. Notare che si puo` rimuovere dal pannello di controllo - installazione applicazioni l'applicazione "Intel matrix storage manager" in quanto a noi servono solo i drivers e della fuffa non ce ne facciamo niente. I driver resteranno installati comunque. === Usare device USB su host Linux === Per poter usare dispositivi USB su host Linux e` necessario che l'utente che esegue virtualbox sia nel gruppo "vobxusers" === Link esterni === Molto interessante questa guida all'uso di virtualbox totalmente da terminale testo: http://guide.debianizzati.org/index.php/Installare_Virtualbox_su_un_server_Debian_senza_X === Problemi noti === Capita su certi kernel che vboxsvc vada al 100% o piu` di CPU. Questo puo` essere causato da un problema con il leap second. Per "sbloccarlo" e` sufficiente reimpostare l'orologio con questo pratico comando: {{{date -s "$(LC_ALL=C date)"}}}. L'effetto dovrebbe essere immediato.