Guida ai comandi di VirtualBox
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 comandoinsserv 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.
# 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.