随机启动或关闭VirtualBox虚拟机的控制脚本
2013-05-07 16:48:22 阿炯

本站赞助商链接,请多关照。 VirtualBox下所创建的虚拟机是归创建用户的资产,其它用户无权管理,当然我们日常的操作是以变通而非特权用户的身份进行操作的,那么如何让普通用户所创建的一系列虚拟机随系统启动而启动、关闭而关闭呢?

当控制多台虚拟机时,要写在脚本控制的方式,那么如何让脚本在系统启动时开启,系统关闭时让运行的虚拟机也正常关闭呢?当然最好是与'/etc/init.d'目录的控制脚本一样,接受'start/stop'参数来控制。

-------------------------------
For Red Hat
在Red Hat/CentOS上,将其按启动脚本规范后,并不能按预期启动。只能寄生在系统其它随系统启动或关闭的服务里,这里选中了ssh服务,在ssh控制脚本的'start'函数末尾:
/bin/su hto -c "/home/hto/bin/vmcontrol.pl start"

在'stop'函数末尾:
/bin/su hto -c "/home/hto/bin/vmcontrol.pl stop"

'hto'为这些虚拟机的属主用户。

#!/usr/bin/perl
# Written by hto
$\="\n";
use Switch;
use POSIX qw(strftime);

my $pro='/usr/bin/VBoxManage';
#需要开启的虚拟机别名
my @vms=('prouter','pcentos','scentos','pdebian');

#简单的日志记录
chdir($ENV{PWD});
open(LOG,">>$0.log") || die "could not open log file $0.log:$!";

print LOG strftime("%Y-%m-%d %H:%M:%S\n", localtime(time));

#处理传入的参数
my $arg=shift @ARGV;
chomp($arg);

switch ($arg){
 case 'start' {bootvm()}
 case 'stop' {haltvm()}
 else {print LOG 'Please use start/stop to control this script!'}
}
#虚拟机启动函数
sub bootvm{
foreach (@vms){
 print LOG "We will start the $_,wait a moment...\n";
 my @rs = ("$pro","startvm","$_","--type","headless");
 if(system(@rs)){
  print LOG "start vm cmd @rs failed: $?";
 }
 #暂停几秒,让系统的负载尽可能平衡些
 sleep(16);
}
}
#虚拟机关闭函数
sub haltvm{
foreach (@vms){
 print LOG "We will stop the $_\n";
 my @rs = ("$pro","controlvm","$_","savestate");
 if(system(@rs)){
  print LOG "stop vm cmd @rs failed: $?";
 }
}
}
#结束时关闭日志句柄
END{
 close(LOG);
}

-------------------------------
For Debian 将启动脚本做成服务随机启动或关闭

#!/usr/bin/perl
### BEGIN INIT INFO
# Provides:             vmcontrol
# Required-Start:       $remote_fs $syslog
# Required-Stop:        $remote_fs $syslog
# Default-Start:        2 3 4 5
# Default-Stop:
# Short-Description:    For control VirtualBox vm
### END INIT INFO
# Written by hto
$\="\n";
use Switch;
use POSIX qw(strftime);
my $su='/bin/su hto -c ';
#需要开启的虚拟机别名
my @vms=('router');

#简单的日志记录
chdir($ENV{PWD});
open(LOG,">>$0.log") || die "could not open log file $0.log:$!";

print LOG strftime("%Y-%m-%d %H:%M:%S\n", localtime(time));

my $arg=shift @ARGV;
chomp($arg);

switch ($arg){
 case 'start' {bootvm()}
 case 'stop' {haltvm()}
 else {print 'Please use start/stop to control this script!'}
}

sub bootvm{
foreach (@vms){
 print LOG "We will start the $_,wait a moment...\n";
 my $cmd = qq("/usr/bin/VBoxManage startvm $_ --type headless");
 my $fullcmd=$su.$cmd;
 print qx($fullcmd);
 #暂停几秒
 sleep(8);
}
}

sub haltvm{
foreach (@vms){
 print LOG "We will stop the $_";
 my $cmd = qq("/usr/bin/VBoxManage controlvm $_ acpipowerbutton");
 my $fullcmd=$su.$cmd;
 print qx($fullcmd);
}
}

#结束时关闭日志句柄
END{
 close(LOG);
}

-------
将其做成系统服务:insserv -v -d vmcontrol