随机启动或关闭VirtualBox虚拟机的控制脚本
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