VirtualBox: amministrazione da terminale
Versioni Compatibili Tutte le versioni supportate di Debian |
VirtualBox |
Sommario |
|
Introduzione
Virtualbox è un software di virtualizzazione sviluppato da Sun (ora Oracle); normalmente viene utilizzato come un normale programma dotato di interfaccia grafica, ma con qualche accorgimento è possibile installarlo e utilizzarlo anche su una macchina server dove non sia stato installato il server grafico X.org.
La configurazione della macchina host presa in esame per la guida prevede come indirizzo IP di eth0
il seguente: 192.168.0.100
.
Installazione
Dalla versione 4, VirtualBox è rilasciato con licenza GPL con alcune limitazioni (non gestisce l'USB, ad esempio), per questo sul sito del progetto viene fornito un pacchetto di estensioni proprietarie.
Per installare tale pacchetto e ottenere ulteriori informazioni si veda la guida all'installazione.
Utilizzare VirtualBox da linea di comando
VirtualBox mette a disposizione lo strumento VBoxManage
per creare e amministrare le macchine virtuali da terminale. È uno strumento molto potente e complesso e permette di gestire le proprie macchine virtuali in maniera molto dettagliata; ciononostante in questa guida vedremo solo i comandi e le opzioni principali.
Per una spiegazione dettagliata del tool consiglio di far riferimento alla User Guide di VirtualBox: http://www.virtualbox.org/manual/UserManual.html#vboxmanage
Creazione di una Virtual Machine
Creiamo innanzitutto una directory dove conservare tutte le nostre macchine virtuali. Io la creerò sotto /opt
, ma siete liberi di metterla dove meglio credete (ricordatevi di modificare il percorso nei comandi seguenti!):
# mkdir /opt/vm
Procediamo quindi a creare la nostra virtual machine di prova:
# VBoxManage createvm --name prova --basefolder /opt/vm/ --register
Analizziamo il comando seguente:
createvm
indica a VBoxManage di creare una nuova virtual machine--name
consente di specificare il nome della nuova virtual machine. Consiglio di usare nomi senza spazi o caratteri strani--basefolder
permette di specificare la directory dove sarà creata la virtual machine. All'interno di questa directory sarà automaticamente creata una directory avente il nome che abbiamo assegnato alla virtual machine. Si noti che a meno di non indicare un percorso assoluto tutti i file e le cartelle saranno creati all'interno di~/.Virtualbox
.--register
permette di importare in VirtualBox il file XML contenente le specifiche della virtual machine
Ora modifichiamo la configurazione della nostra nuova virtual machine:
# VBoxManage modifyvm prova --memory 1024MB --acpi on --boot1 dvd --boot2 disk --nic1 bridged --bridgeadapter1 eth0 --ostype Windows2003 --usb on
Le modifiche che abbiamo introdotto nella nostra virtual machine sono le seguenti:
--memory
specifica in MB la dimensione della RAM da assegnare (almeno a partire dalla versione 4.1 è necessario indicare solo la dimensione omettendo quindi l'unità di misura, cioè MB).--acpi
abilita o disabilita la modalità ACPI--boot1
specifica che il primo dispositivo di boot è nel nostro caso un DVD--boot2
specifica che il secondo dispositivo di boot è nel nostro caso l'hard disk virtuale--nic1
indica che la prima interfaccia di rete virtuale utilizzerà la modalità bridge--bridgeadapter1
indica l'interfaccia di rete del nostro server Debian che verrà usata dalla virtual machine--ostype
permette di specificare il tipo di sistema virtuale che installeremo. Per un elenco si dia il comandoVBoxManage list ostypes
--usb
abilita o disabilita le porte USB
Ogni volta che, attraverso il parametro modifyvm
apportate delle modifiche alla configurazione della vostra virtual machine, queste vengono registrate nel file XML creato in precedenza.
Ora preoccupiamoci di creare un hard disk virtuale per la nostra virtual machine:
# VBoxManage createhd --filename /opt/vm/prova/prova.vdi --size 10000 --register (l'opzione register non è più supportata in questo contesto almeno dalla versione 4.1)
Piccola spiegazione:
--filename
specifica la directory dove creare il disco virtuale--size
indica la dimensione del disco in MB
Installiamo quindi un controller IDE nella nostra Virtual Machine:
VBoxManage storagectl "prova" --name "IDE Controller" --add ide --controller ICH6
Infine modifichiamo la virtual machine collegandole il disco virtuale che abbiamo appena creato con uno dei seguenti due comandi:
# VBoxManage modifyvm prova -hda /opt/vm/prova/prova.vdi
oppure:
VBoxManage storageattach "prova" --storagectl "IDE Controller" --port 0 --device 0 --type hdd --medium "/opt/vm/prova/prova.vdi"
Possiamo collegare alla nostra macchina un massimo di 3 hard disk virtuali (hda
, hdb
, hdd
). hdc
è riservato per il CD/DVD.
Arrivati a questo punto dobbiamo montare un'immagine ISO o un CD/DVD nel nostro lettore CD/DVD virtuale, in modo di poter installare il nostro sistema operativo virtuale. In questo esempio monterò un'immagine ISO:
# VBoxManage openmedium dvd /home/ferdy/w2003.iso (nota: almeno dalla versione 4.1 questo comando non funziona ed è superfluo) # VBoxManage storageattach "prova" --storagectl "IDE Controller" --port 1 --device 0 --type dvddrive --medium "/home/ferdy/w2003.iso"
Poiché il terminale viene bloccato fino a che la macchina resta in esecuzione si consiglia di eseguire i comandi in screen; per avviare la macchina virtuale digitare:
# VBoxHeadless --startvm prova
In caso di necessità è possibile arrestare la macchina con uno dei seguenti due comandi:
VBoxManage controlvm prova poweroff
equivale a togliere la spina, mentre
VBoxManage controlvm prova savestate
Salva prima lo stato della macchina sul disco e poi la spegne. Il primo metodo può essere usato quando all'atto dell'installazione la macchina virtuale si avvia, ma per un qualche motivo non si riesce ad accederci da remoto; nel caso l'installazione sia già in fase avanzata o addirittura terminata il secondo metodo è da preferire.
Terminata l’installazione del sistema operativo, il DVD può essere rimosso dalla Virtual Machine col comando:
# VBoxManage storageattach "prova" --storagectl "IDE Controller" --port 1 --device 0 --type dvddrive --medium none
Qualora l’immagine DVD non sia più necessaria, esiste la possibilità di de-registrarla dal database di VirtualBox:
# VBoxManage closemedium dvd "/home/ferdy/w2003.iso"
Importazione di una Virtual Machine
Se abbiamo già una virtual machine creata in precedenza, possiamo importarla all'interno della nostra installazione di VirtualBox per poi avviarla. Per importare una virtual machine esistente si utilizzi il comando:
# VBoxManage registervm /opt/vm/prova2/prova2.xml
Avvio e gestione di una Virtual Machine
Arrivati a questo punto possiamo avviare la nostra virtual machine con il comando:
# VBoxHeadless --startvm prova
Il comando VBoxHeadless
avvia la virtual machine indicata e nel contempo inizializza una sessione VRDP Server (Virtual Remote Desktop Protocol). Purtroppo però, pur essendo il comando suggerito dalla User Guide di VirtualBox, ha il difetto di bloccare la sessione di terminale fino allo spegnimento della macchina virtuale. Per questo motivo consiglio di avviare una virtual machine con il comando alternativo:
# VBoxHeadless --startvm prova &
che non sempre funziona, oppure:
# VBoxManage startvm prova --type vrdp
dagli effetti identici al primo, ma senza che la nostra shell sia resa inutilizzabile.
Collegamento alla VM da Windows XP
Aprite "Connessione Desktop Remoto" e digitate l'indirizzo IP del vostro server Debian: si aprirà la console della macchina virtuale che avete avviato.
Comandi utili di "Connessione Desktop Remoto"
ALT+PGSU
: Passa da un programma all'altro da sinistra verso destra.ALT+PGGIU
: Passa da un programma all'altro da destra verso sinistra.ALT+INS
: Passa da un programma all'altro nell'ordine in cui sono stati aperti.ALT+HOME
: Visualizza il menù Start.CTRL+ALT+INTERR
: Passa da una finestra alla modalità schermo intero e viceversa.CTRL+ALT+FINE
: Visualizza la finestra di dialogo Protezione di Windows.ALT+CANC
: Visualizza il menù Windows.CTRL+ALT+SEGNO MENO (-) del tastierino numerico
: Copia negli Appunti del computer remoto la finestra attiva del computer client (esegue la stessa funzione della combinazione di tasti ALT+STAMP in un computer locale).CTRL+ALT+SEGNO PIÙ (+) del tastierino numerico
: Copia negli Appunti del computer remoto l'intera schermata del computer client (esegue la stessa funzione del tasto STAMP in un computer locale).CTRL+ALT+freccia DESTRA
: Consente di spostarsi al di fuori dei controlli di Desktop remoto su un controllo nel programma host, ad esempio un pulsante o una casella di testo. Utile quando i controlli di Desktop remoto sono incorporati in un altro programma (host).CTRL+ALT+freccia SINISTRA
: Consente di spostarsi al di fuori dei controlli di Desktop remoto su un controllo nel programma host, ad esempio un pulsante o una casella di testo. Utile quando i controlli di Desktop remoto sono incorporati in un altro programma (host).- La combinazione
CTRL+ALT+CANC
ha sempre effetto sul desktop del computer locale. Per inviare la combinazioneCTRL+ALT+CANC
al computer remoto, è necessario premereCTRL+ALT+FINE
.
Collegamento alla VM da Linux
Aprite un terminale e digitate:
$ rdesktop -a 16 192.168.0.100
Si aprirà la console della macchina virtuale che avete avviato.
Arresto della VM
Per arrestare la virtual machine si usi il comando:
# VBoxManage controlvm prova savestate
Avvio automatico di una Virtual Machine
Per avviare una virtual machine come demone al boot di Debian sono sufficienti pochi passi.
Innanzitutto creiamo un file per il nostro script di boot:
# nano /etc/init.d/provavm
e inseriamoci questo codice:
#! /bin/sh ### BEGIN INIT INFO # Provides: VirtualBox - VM di Prova # Required-Start: vboxdrv # Required-Stop: vboxdrv # Default-Start: 2 3 4 5 # Default-Stop: S 0 1 6 # Description: VirtualBox Virtual Machine ### END INIT INFO # Author: Ferdinando Bassi per Debianizzati.org # Do NOT "set -e" # PATH should only include /usr/* if it runs after the mountnfs.sh script PATH=/usr/sbin:/usr/bin:/sbin:/bin # # DA CAMBIARE E DA ADATTARE # # Name given to the virtual machine VM_NAME="prova" # Name of this file, excluding /etc/init.d/ THIS_FILE=provavm # Username to run as RUNAS_USERNAME=root # # FINE SEZIONE DA MODIFICARE # DESC="VirtualBox - ${VM_NAME}" DAEMON=/usr/bin/VBoxVRDP DAEMON_ARGS="-startvm \"${VM_NAME}\"" PIDFILE=/var/run/$THIS_FILE.pid SCRIPTNAME=/etc/init.d/$THIS_FILE # Exit if the package is not installed [ -x "$DAEMON" ] || exit 0 # Read configuration variable file if it is present [ -r /etc/default/$THIS_FILE ] && . /etc/default/$THIS_FILE # Load the VERBOSE setting and other rcS variables [ -f /etc/default/rcS ] && . /etc/default/rcS # Define LSB log_* functions. # Depend on lsb-base (>= 3.0-6) to ensure that this file is present. . /lib/lsb/init-functions # # Function that starts the daemon/service # do_start() { # Return # 0 if daemon has been started # 1 if daemon was already running # 2 if daemon could not be started #start-stop-daemon --start --quiet --pidfile $PIDFILE --exec $DAEMON --test > /dev/null \ #|| return 1 #start-stop-daemon --start --quiet --pidfile $PIDFILE --exec $DAEMON -- \ #$DAEMON_ARGS \ #|| return 2 # Add code here, if necessary, that waits for the process to be ready # to handle requests from services started subsequently which depend # on this one. As a last resort, sleep for some time. su $RUNAS_USERNAME -c "VBoxManage startvm ${VM_NAME} --type vrdp" } # # Function that stops the daemon/service # do_stop() { # Return # 0 if daemon has been stopped # 1 if daemon was already stopped # 2 if daemon could not be stopped # other if a failure occurred start-stop-daemon --stop --quiet --retry=TERM/30/KILL/5 --pidfile $PIDFILE --name $THIS_FILE RETVAL="$?" [ "$RETVAL" = 2 ] && return 2 # Wait for children to finish too if this is a daemon that forks # and if the daemon is only ever run from this initscript. # If the above conditions are not satisfied then add some other code # that waits for the process to drop all resources that could be # needed by services started subsequently. A last resort is to # sleep for some time. su $RUNAS_USERNAME -c "VBoxManage controlvm ${VM_NAME} savestate" start-stop-daemon --stop --quiet --oknodo --retry=0/30/KILL/5 --exec $DAEMON [ "$?" = 2 ] && return 2 # Many daemons don't delete their pidfiles when they exit. rm -f $PIDFILE return "$RETVAL" } # # Function that sends a SIGHUP to the daemon/service # do_reload() { # # If the daemon can reload its configuration without # restarting (for example, when it is sent a SIGHUP), # then implement that here. # # start-stop-daemon --stop --signal 1 --quiet --pidfile $PIDFILE --name $NAME echo "Reload not supported" return 0 } case "$1" in start) [ "$VERBOSE" != no ] && log_daemon_msg "Starting $DESC" "$THIS_FILE" do_start case "$?" in 0|1) [ "$VERBOSE" != no ] && log_end_msg 0 ;; 2) [ "$VERBOSE" != no ] && log_end_msg 1 ;; esac ;; stop) [ "$VERBOSE" != no ] && log_daemon_msg "Stopping $DESC" "$THIS_FILE" do_stop case "$?" in 0|1) [ "$VERBOSE" != no ] && log_end_msg 0 ;; 2) [ "$VERBOSE" != no ] && log_end_msg 1 ;; esac ;; #reload|force-reload) # # If do_reload() is not implemented then leave this commented out # and leave 'force-reload' as an alias for 'restart'. # #log_daemon_msg "Reloading $DESC" "$NAME" #do_reload #log_end_msg $? #;; *) #echo "Usage: $SCRIPTNAME {start|stop|restart|reload|force-reload}" >&2 echo "Usage: $SCRIPTNAME {start|stop}" >&2 exit 3 ;; esac :
Rendiamo eseguibile lo script appena creato:
# chmod 755 /etc/init.d/provavm
e creiamo i link alle directory rcX.d
:
# update-rc.d provavm defaults 90 90
Da questo momento possiamo gestire il servizio con i soliti comandi:
# /etc/init.d/provavm start|stop
Installazione delle Guest Addictions
Il pacchetto Guest Addictions contiene i driver per l'hardware virtuale emulato da VirtualBox e, se installato, permette di migliorare stabilità e prestazioni della nostra virtual machine.
Anche qui si faccia riferimento alla guida all'installazione
Salvare uno snapshot di una Virtual Machine
Anche da linea di comando è possibile lavorare con gli snapshot di una macchina virtuale. Vediamo come.
- Salvare uno snapshot:
# VBoxManage snapshot prova take prova1 --description descrizione
- Cancellare uno snapshot:
# VBoxManage snapshot prova discard prova1
- Ripristinare lo snapshot precedente:
# VBoxManage snapshot prova discardcurrent --state
- Saltare l'ultimo snapshot e ripristinare lo snapshot precedente:
# VBoxManage snapshot prova discardcurrent --all
Aggiunta di una seconda Virtual Machine
Nel caso volessimo avere più di una Virtual Machine sullo stesso server fisico, occorrerà ripetere per ogni macchina virtuale le operazioni descritte fino a qui.
In più sarà necessario indicare a VirtualBox la porta RDP su cui mettere in ascolto ogni altra Virtual Machine diversa dalla prima, tenendo a mente che ad ogni porta può corrispondere solo una macchina virtuale. Poichè di default VRDP si pone in ascolto sulla porta 3389 (a questa porta risponderà la prima Virtual Machine installata), impostiamo come porta per la nostra seconda Virtual Machine la porta successiva:
# VBoxManage modifyvm "SecondaVM" --vrdp on --vrdpport 3390 --vrdpauthtype null --vrdpmulticon on
In questa maniera otterremo due macchine virtuali, entrambe avviabili al boot del server; la prima in ascolto sulla porta 3389, la seconda in ascolto sulla porta 3390 all'indirizzo IP del nostro server.