Programmation » Script de démarrage/arrêt VirtualBox
Script de démarrage/arrêt VirtualBox
Publié le 05/10/2009 @ 23:11:48,
Par rfrComme j'avais besoin d'un script de démarrage pour mes machines virtuelles, j'ai écris quelques petits trucs qui pourraient vous être utile donc je partage.
Tout d'abord, voici le script, à installer dans /etc/init.d:
#!/bin/sh
### BEGIN INIT INFO
# Provides: vboxcontrol
# Required-Start: $network $local_fs $remote_fs
# Required-Stop: $network $local_fs $remote_fs
# Default-Start: 2 3 4 5
# Default-Stop: 0 1 6
# Short-Description: start VirtualBox Virtual Machines
### END INIT INFO
CFGFILE=/etc/virtualbox/vms
startvm()
{
echo -n "\tStarting vm [$1:$2]..."
VBoxManage modifyvm "$1" --vrdp on --vrdpport $2 1> /dev/null 2>&1
VBoxManage startvm "$1" --type vrdp 1> /dev/null 2>&1
echo "done."
}
stopvm()
{
echo -n "\tStopping vm [$1:$2]..."
VBoxManage controlvm "$1" acpipowerbutton 1> /dev/null 2>&1
/usr/bin/wpshutdown $2 360
if [ "$?" = "0" ] ; then echo "done."; else echo "failed."; fi
}
case "$1" in
start)
echo "Starting VirtualBox Virtual Machines:"
while read vm; do
vmname=`echo $vm | cut -d: -f1`
vmport=`echo $vm | cut -d: -f2`
startvm "$vmname" $vmport
done < $CFGFILE
echo "done."
;;
stop)
echo "Stopping VirtualBox Virtual Machines:"
while read vm; do
vmname=`echo $vm | cut -d: -f1`
vmport=`echo $vm | cut -d: -f2`
stopvm "$vmname" $vmport
done < $CFGFILE
echo "done."
;;
status)
VBoxManage list runningvms
;;
*)
echo "$0 (start|stop|status)"
esac
Un script assez simple qui fait appel à un fichier de configuration (/etc/virtualbox/vms) qui contient une ligne par machine virtuelle à démarrer/arrêter. Le format est le suivant:
Nom_de_la_machine:Port_VRDP
Au démarrage, chaque machine sera donc démarrée en mode VRDP sur le port 'Port_VRDP'. 'Port_VRDP' doit donc être UNIQUE pour chaque vm.
Exemple:
Windows XP SP3:3389
Domain Controller DC2:3390
Pour vérifier que la machine est bien arrêtée au "stop", j'utilise une petite application qui teste pendant une période de temps donnée si un port tcp est toujours "ouvert" ou non (mode LISTEN y compris). J'ai appelé ce petit utilitaire "wpshutdown" pour "Wait Port Shutdown".
En voici les sources:
/*
* main.c
*
* Created on: 5 oct. 2009
* Author: rfr
*/
#include <stdio.h>
#include <stdlib.h>
#include <errno.h>
#include <time.h>
#include <string.h>
int is_port_listening(char *port) {
FILE *ports;
int found = 0;
char buffer[160];
ports = fopen("/proc/net/tcp", "r");
if (!ports) {
fprintf(stderr, "error: is /proc filesystem available?\n");
exit(2);
}
while (!feof(ports))
{
int i;
if (fgets(buffer, 160, ports)) {
i=0;
size_t b_len = strlen(buffer);
for(;(i < b_len) && (buffer[i] != ':') ; i++);
i++;
for(;(i < b_len) && (buffer[i] != ':') ; i++);
if ((i < b_len) && (buffer[i] == ':') && !strncmp(port, buffer+i+1, 4)) {
found = 1;
}
}
}
fclose(ports);
return found;
}
int main(int argc, char *argv[]) {
if (argc < 2) {
printf("Usage: %s <tcp port> [timeout]\n", argv[0]);
return 2;
}
long port = strtol(argv[1], (char **) NULL, 10);
if (errno == EINVAL || errno == ERANGE) {
printf("error: argument is not a port number: %s\n", argv[1]);
return 2;
}
if (!(port > 0 && port <= 65535 )) {
printf("error: argument is not a valid port number: %s\n", argv[1]);
return 2;
}
long timeout = 30;
if (argc > 2) {
timeout = strtol(argv[2], (char**)NULL, 10);
if (timeout == 0) {
printf("error: invalid timeout value: %s\n", argv[2]);
return 2;
}
}
char hexport[5];
sprintf(hexport, "X", (unsigned int) port);
int failed = 0;
time_t initial = time(NULL);
while(is_port_listening(hexport)) {
fwrite(".", 1, 1, stdout); fflush(stdout);
if ((time(NULL) - initial) >= timeout)
{
failed = 1;
break;
}
sleep(1);
}
return failed;
}
Pour compiler ce code, un simple "gcc -o wpshutdown source.c" suffira. Ne pas oublier de copier wpshutdown dans le répertoire /usr/bin.
Quelques petites notes:
1) Les devices "tap" sont configurée par la méthode normale dans le fichier "/etc/network/interfaces"
Exemple:
auto tap0
iface tap0 inet manual
tunctl_user rfr
auto tap1
iface tap1 inet manual
tunctl_user rfr
Pour que cela fonctionne, il faut que le package "uml-utilities" soit installé. Il est utile aussi d'intaller le package "bridge-utils" pour configurer l'interface bridge utilisée par les interfaces tapX.
2) L'arrêt par ACPI ne fonctionne pas par défaut sous Windows Server 2003. Pour que le script fonctionne, il faut faire ceci:
1. Start / Run / gpedit.msc
2. Drill into Computer Configuration / Windows Settings / Security Settings / Local Policies / Security Options. Find the entry named "Shutdown: Allow system to be shut down without having to log on". Double click on it, change it to "Enabled".
3. Drill into Computer Configuration / Administrative Templates / System. Find the entry named "Display Shutdown Event Tracker". Double click on it, change it to "Disabled".
Crédit: http://www.proxmox.com/forum/showthread.php?p=2560#poststop
Voilà, circuler, il n'y a plus rien à voir ...
Dernière édition: 05/10/2009 @ 23:13:26
Tout d'abord, voici le script, à installer dans /etc/init.d:
#!/bin/sh
### BEGIN INIT INFO
# Provides: vboxcontrol
# Required-Start: $network $local_fs $remote_fs
# Required-Stop: $network $local_fs $remote_fs
# Default-Start: 2 3 4 5
# Default-Stop: 0 1 6
# Short-Description: start VirtualBox Virtual Machines
### END INIT INFO
CFGFILE=/etc/virtualbox/vms
startvm()
{
echo -n "\tStarting vm [$1:$2]..."
VBoxManage modifyvm "$1" --vrdp on --vrdpport $2 1> /dev/null 2>&1
VBoxManage startvm "$1" --type vrdp 1> /dev/null 2>&1
echo "done."
}
stopvm()
{
echo -n "\tStopping vm [$1:$2]..."
VBoxManage controlvm "$1" acpipowerbutton 1> /dev/null 2>&1
/usr/bin/wpshutdown $2 360
if [ "$?" = "0" ] ; then echo "done."; else echo "failed."; fi
}
case "$1" in
start)
echo "Starting VirtualBox Virtual Machines:"
while read vm; do
vmname=`echo $vm | cut -d: -f1`
vmport=`echo $vm | cut -d: -f2`
startvm "$vmname" $vmport
done < $CFGFILE
echo "done."
;;
stop)
echo "Stopping VirtualBox Virtual Machines:"
while read vm; do
vmname=`echo $vm | cut -d: -f1`
vmport=`echo $vm | cut -d: -f2`
stopvm "$vmname" $vmport
done < $CFGFILE
echo "done."
;;
status)
VBoxManage list runningvms
;;
*)
echo "$0 (start|stop|status)"
esac
Un script assez simple qui fait appel à un fichier de configuration (/etc/virtualbox/vms) qui contient une ligne par machine virtuelle à démarrer/arrêter. Le format est le suivant:
Nom_de_la_machine:Port_VRDP
Au démarrage, chaque machine sera donc démarrée en mode VRDP sur le port 'Port_VRDP'. 'Port_VRDP' doit donc être UNIQUE pour chaque vm.
Exemple:
Windows XP SP3:3389
Domain Controller DC2:3390
Pour vérifier que la machine est bien arrêtée au "stop", j'utilise une petite application qui teste pendant une période de temps donnée si un port tcp est toujours "ouvert" ou non (mode LISTEN y compris). J'ai appelé ce petit utilitaire "wpshutdown" pour "Wait Port Shutdown".
En voici les sources:
/*
* main.c
*
* Created on: 5 oct. 2009
* Author: rfr
*/
#include <stdio.h>
#include <stdlib.h>
#include <errno.h>
#include <time.h>
#include <string.h>
int is_port_listening(char *port) {
FILE *ports;
int found = 0;
char buffer[160];
ports = fopen("/proc/net/tcp", "r");
if (!ports) {
fprintf(stderr, "error: is /proc filesystem available?\n");
exit(2);
}
while (!feof(ports))
{
int i;
if (fgets(buffer, 160, ports)) {
i=0;
size_t b_len = strlen(buffer);
for(;(i < b_len) && (buffer[i] != ':') ; i++);
i++;
for(;(i < b_len) && (buffer[i] != ':') ; i++);
if ((i < b_len) && (buffer[i] == ':') && !strncmp(port, buffer+i+1, 4)) {
found = 1;
}
}
}
fclose(ports);
return found;
}
int main(int argc, char *argv[]) {
if (argc < 2) {
printf("Usage: %s <tcp port> [timeout]\n", argv[0]);
return 2;
}
long port = strtol(argv[1], (char **) NULL, 10);
if (errno == EINVAL || errno == ERANGE) {
printf("error: argument is not a port number: %s\n", argv[1]);
return 2;
}
if (!(port > 0 && port <= 65535 )) {
printf("error: argument is not a valid port number: %s\n", argv[1]);
return 2;
}
long timeout = 30;
if (argc > 2) {
timeout = strtol(argv[2], (char**)NULL, 10);
if (timeout == 0) {
printf("error: invalid timeout value: %s\n", argv[2]);
return 2;
}
}
char hexport[5];
sprintf(hexport, "X", (unsigned int) port);
int failed = 0;
time_t initial = time(NULL);
while(is_port_listening(hexport)) {
fwrite(".", 1, 1, stdout); fflush(stdout);
if ((time(NULL) - initial) >= timeout)
{
failed = 1;
break;
}
sleep(1);
}
return failed;
}
Pour compiler ce code, un simple "gcc -o wpshutdown source.c" suffira. Ne pas oublier de copier wpshutdown dans le répertoire /usr/bin.
Quelques petites notes:
1) Les devices "tap" sont configurée par la méthode normale dans le fichier "/etc/network/interfaces"
Exemple:
auto tap0
iface tap0 inet manual
tunctl_user rfr
auto tap1
iface tap1 inet manual
tunctl_user rfr
Pour que cela fonctionne, il faut que le package "uml-utilities" soit installé. Il est utile aussi d'intaller le package "bridge-utils" pour configurer l'interface bridge utilisée par les interfaces tapX.
2) L'arrêt par ACPI ne fonctionne pas par défaut sous Windows Server 2003. Pour que le script fonctionne, il faut faire ceci:
1. Start / Run / gpedit.msc
2. Drill into Computer Configuration / Windows Settings / Security Settings / Local Policies / Security Options. Find the entry named "Shutdown: Allow system to be shut down without having to log on". Double click on it, change it to "Enabled".
3. Drill into Computer Configuration / Administrative Templates / System. Find the entry named "Display Shutdown Event Tracker". Double click on it, change it to "Disabled".
Crédit: http://www.proxmox.com/forum/showthread.php?p=2560#poststop
Voilà, circuler, il n'y a plus rien à voir ...
Dernière édition: 05/10/2009 @ 23:13:26
To die is a time consuming activity, it often takes a lifetime (but some are faster than others ... though)
Script de démarrage/arrêt VirtualBox
Publié le 05/10/2009 @ 23:17:21,
Par jimalexpMerci de partager. Je garde ça au chaud sur mon 'dur.