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:

# 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:

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.

# 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 "<nomeVM>" savestate
vboxmanage clonevm "<nomeVM>" --name "<nomeVM>-backup" --basefolder /backupdisk/virtualbox
vboxmanage startvm "<nomeVM>" -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/<nomeVM>-backup/<nomeVM>-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/<nomeVM>.tgz /backupdisk/virtualbox/<nomeVM>-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"

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.

VirtualBox (last edited 2017-01-03 13:48:42 by Kurgan)