ESXi的虚拟机开机自启动功能,如果虚拟机不可用的话是没法实现开机自启动的,比如主机的开机速度快而连的存储开机慢。

可以设定开机一段时间内检测状态并开机。

脚本结合crond定时执行,能做到虚拟机vms定时开机关机,后台定时检测虚拟机停止就自动开机,让虚拟机一直运行。

思路

1.检测虚拟机是否已开机

2.如果虚拟机状态开机则不执行任何操作,退出;否则开机打开电源

3.用crond定时执行检测脚本

具体操作

esxcli vm process list                              # 利用esxcli列出ESXi服务器上VMs(运行状态的)
vim–cmd vmsvc/getallvms |grep <vm name>  # 获取出vmid来,开机命令会用到
vim-cmd vmsvc/power.on <vmid>  # 执行开机

开机检测

vi /vmfs/volumes/datastore222/startVM.sh
注:之所以要在volume上创建脚本是因为如果直接在/etc等目录创建后重启就没了。

通过vim-cmd vmsvc/getallvms获取虚拟机名称与编号。

比如我的虚拟机名称是’Server-2016’,vmid是18,#是方便调试的注释。

前50分钟每5分钟检测一次,检测到开机后退出,根据自己需求修改:

 

#!/bin/sh
 
#后面的数字为虚拟机编号
for vm in 18 83 86
do
{
for i in {1..11}  
do  
#vim-cmd vmsvc/getallvms |grep <vm name>
#vim-cmd vmsvc/power.getstate <vmid>
#vim-cmd vmsvc/power.on <vmid>
vim-cmd vmsvc/power.getstate $vm|grep 'Powered on'
ret=$?
if [ $ret == 0 ]
then
#echo $vm' is running,do nothing..'
exit 0
else
#echo $vm' is stoped,starting..'
vim-cmd vmsvc/power.on $vm
#echo 'Done.'
fi
sleep 5m;  
done
}&
done

最后要加上执行权限 chmod 744 startVM.sh

修改/etc/rc.local.d/local.sh实现重启也能自动添加计划任务:

加入这一行/vmfs/volumes/datastore222/startVM.sh

后台一直运行

1.创建计划任务脚本:

vi /vmfs/volumes/datastore222/test.sh
注:之所以要在volume上创建脚本是因为如果直接在/etc等目录创建后重启就没了。

比如我的虚拟机名称是’Server-2016’,vmid是18,#是方便调试的注释,简单的脚本是这样:

 

#!/bin/sh
#vim-cmd vmsvc/getallvms |grep <vm name>
#vim-cmd vmsvc/power.getstate <vmid>
#vim-cmd vmsvc/power.on <vmid>
esxcli vm process list|grep 'Server-2016'
ret=$?
if [ $ret == 0 ]
then
#echo 'Server-2016 is running,do nothing..'
exit 0
else
#echo 'Server-2016 is stoped,starting..'
vim-cmd vmsvc/power.on 18
#echo 'Done.'
fi

别忘了最后要加上执行权限 chmod 744 test.sh

2.修改/etc/rc.local.d/local.sh实现重启也能自动添加计划任务:

 

chmod +w /var/spool/cron/crontabs/root
/bin/kill $(cat /var/run/crond.pid)
/bin/echo '*/10 * * * * /vmfs/volumes/datastore222/test.sh' >> /var/spool/cron/crontabs/root
crond
exit 0

定时任务请补充下crontab的知识。

 

补充:

1、控制虚拟机开关机

To power on a virtual machine from the command line:

List the inventory ID of the virtual machine with the command:

 

vim-cmd vmsvc/getallvms |grep <vm name>

Note: The first column of the output shows the vmid.

Check the power state of the virtual machine with the command:

 

vim-cmd vmsvc/power.getstate <vmid>

Power-on the virtual machine with the command:

 

vim-cmd vmsvc/power.on <vmid>

关机就是把 power.on 改为 power.off 就可以了.

2、shell中特殊变量含义
$0:
执行脚本的名字
$*和$@:
将所有参数返回
$#:
参数的个数
$_:
代表上一个命令的最后一个参数
$$:
代表所在命令的PID
$!:
代表最后执行的后台命令的PID
$?:
代表上一个命令执行是否成功的标志,如果执行成功则$? 为0,否则不为0