前言

在家庭环境中,考虑到省电问题(服务器晚上也挺吵的),购买了小米的智能插座,设置了一个定时开关插座任务。(9:00开启23:00关闭)
关于服务器的通电自动开机,在dell poweredge r530的BIOS里就能设置,处于安全考虑我还设置了通电后60秒的延迟开机。(在米家app自己有时会手残误操作)
但,这仅仅只解决了自动通断电和自动开机的问题,如果esxi上的虚拟机在定时断电之前没有关机的话,一定程度上可能会造成数据丢失、系统文件损毁等问题。
由于VMware esxi并没有提供定时关机的设置,只能通过脚本来实现。

实验目的:
让服务器可以按照以下时间流程自动运行:
09:00 小米插座自动通电
09:01 自动开机
09:06 自动向esxi写入定时关机系统计划任务(预计时间)
22:40 关闭全部正在运行的虚拟机
22:45 正常关机
23:00 小米插座自动断电

实验环境:
硬件:dell poweredge r530
OS:esxi 7.0 u2

一、启用esxi的ssh连接

登录esxi管理界面,然后如图启用ssh连接。

182-1-1.png

二、设置开机自动脚本

在esxi的shell命令行中不支持cron命令,只能修改计划任务文件(/var/spool/crontab/root),但由于这个文件每次重启后会被自动重置,所以我们需要设置开机自动向计划任务文件里添加定时关机。
我们只需要修改(/etc/rc.local.d./local.sh),在[exit 0]这一行之前添加如下的脚本,使其每次开机都自动添加定时任务。

1.用vim文本编辑打开/etc/rc.local.d./local.sh

vi /etc/rc.local.d./local.sh

2.在[exit 0]这一行之前添加如下的脚本并退出保存:

#关闭cron进程(关闭进程后修改计划任务root文件)
/bin/kill $(cat /var/run/crond.pid)

#向/var/spool/crontab/root里添加关闭虚拟机、关机的计划任务
/bin/echo '40 13 * * * /vmfs/volumes/datastore1/vm-shutdown.sh' >> /var/spool/cron/crontabs/root
/bin/echo '45 13 * * * /vmfs/volumes/datastore1/esxi-shutdown.sh' >> /var/spool/cron/crontabs/root

#重启cron进程(将加载修改后的root文件)
/usr/lib/vmware/busybox/bin/busybox crond

注:

  1. [#] 符号后为注释,并非命令。
  2. 40 13 、45 13 处表示任务执行时间,格式为[分] [时] [日] [月份] [星期],由于esxi的系统时间采用的是UTC时间(国际标准时间),而中国是UTC+8,所以想要在北京时间22:40时关闭虚拟机的话,就只需要用22-8算出UTC时间为14,任务执行时间填写为40 14 、45 14 就可以了。(由于博主是在日社畜,命令使用的是日本时间,国内的小伙伴请自行替换)
  3. datastore1处为esxi的本地存储的名称,请按实际情况自行替换。
  4. vm-shutdown.sh、esxi-shutdown.sh处分别为关闭虚拟机、关机脚本的名称。可自行命名定义。
  5. 关于vi命令的使用方法,请另行谷歌、百度查找。

三、保存开机自动命令设置

由于/etc/rc.local.d./local.sh文件重启后会丢失,所以需要手动执行一次下面的命令。(local.sh文件每次更改后想要永久保存设置的话,就需要手动执行一次。)

/sbin/auto-backup.sh

四、esxi关于关闭虚拟机命令的使用方法以及注意事项

由于esxi的特性,每次重启后系统文件都会被重置,如果把脚本存放在这些地方就需要每次开机后手动再创建一次脚本。但/vmfs/volumes/datastore1/目录里的文件不会被重置。所以我们需要在这个目录下创建关闭虚拟机和关机两个脚本。在此之前我们需要了解一下esxi关于关闭虚拟机命令的使用方法以及注意事项。在本次实验中将会用到以下命令:

#查询现有的虚拟机一览,可以查询到VMID
vim-cmd vmsvc/getallvms

#关闭虚拟机电源(等同于拔插头,无需VMware tools的配合)
#例:vim-cmd vmsvc/power.off 1
vim-cmd vmsvc/power.off [VMID]

#关闭虚拟机(系统级别正常关机,需要VMware tools的配合)
#例:vim-cmd vmsvc/power.shutdown 1
vim-cmd vmsvc/power.shutdown [VMID]

#关闭esxi主机电源。
/sbin/poweroff

以下是相关命令,感兴趣的小伙伴们可以尝试一下。

#查询虚拟机的电源状态。(开机、关机)
#例:vim-cmd vmsvc/power.getstate 1
vim-cmd vmsvc/power.getstate [VMID]

#打开虚拟机电源(开机)
#例:vim-cmd vmsvc/power.on 1
vim-cmd vmsvc/power.on [VMID]

#重启虚拟机(系统级别正常重启,需要VMware tools的配合)
#例:vim-cmd vmsvc/power.reboot 1
vim-cmd vmsvc/power.reboot [VMID]

#显示虚拟机构成信息
#例:vim-cmd vmsvc/get.summary 1
vim-cmd vmsvc/get.summary [VMID]

五、创建关闭虚拟机、关机的脚本

1.获取需要自动关机的虚拟机VMID

vim-cmd vmsvc/getallvms

2.创建关闭虚拟机脚本文件

vi /vmfs/volumes/datastore1/vm-shutdown.sh

3.向脚本文件添加命令并保存

#!/bin/sh

#关闭虚拟机(有安装VMware tools的虚拟机使用power.shutdown,没有的就只能使用power.off来进行强制关机。)
vim-cmd vmsvc/power.shutdown 2
vim-cmd vmsvc/power.shutdown 3
vim-cmd vmsvc/power.shutdown 4
vim-cmd vmsvc/power.off 5

4.创建关机脚本文件

vi /vmfs/volumes/datastore1/esxi-shutdown.sh

5.向脚本文件添加命令并保存

#!/bin/sh

#关闭esxi主机电源
/sbin/poweroff

6.给关闭虚拟机、关机的脚本添加可执行权限

chmod +x /vmfs/volumes/datastore1/vm-shutdown.sh
chmod +x /vmfs/volumes/datastore1/esxi-shutdown.sh

注:

  1. [#] 符号后为注释,并非命令。
  2. datastore1处为esxi的本地存储的名称,请按实际情况自行替换。
  3. vm-shutdown.sh、esxi-shutdown.sh处分别为关闭虚拟机、关机脚本的名称。可自行命名定义。注意要和/etc/rc.local.d./local.sh文件里填入的文件名一致。
  4. 关于vi命令的使用方法,请另行谷歌、百度查找。

六、使关闭虚拟机、关机的脚本生效

到第五部分为止,已经完成了大部分设置,但脚本还暂时未生效。以下分两种方法介绍如何使脚本生效。

1.关机重启生效法

通过esxi管理界面手动重启,并再次启用ssh后输入以下命令:

cat /var/spool/cron/crontabs/root

会输出如下结果,可以看到成功添加了定时关机命令(输出结果可能会有变动,请按照实际情况判断。)

#min hour day mon dow command
1    1    *   *   *   /sbin/tmpwatch.py
1    *    *   *   *   /sbin/auto-backup.sh
0    *    *   *   *   /usr/lib/vmware/vmksummary/log-heartbeat.py
*/5  *    *   *   *   /bin/hostd-probe.sh ++group=host/vim/vmvisor/hostd-probe/stats/sh
00   1    *   *   *   localcli storage core device purge
*/10 *    *   *   *   /bin/crx-cli gc
40 13 * * * /vmfs/volumes/datastore1/vm-shutdown.sh
45 13 * * * /vmfs/volumes/datastore1/esxi01-shutdown.sh

2.手动命令生效法

在esxi启用了ssh的情况输入以下命令(请按照第二部分设置的代码,自行变更以下命令):

/bin/kill $(cat /var/run/crond.pid)
/bin/echo '40 13 * * * /vmfs/volumes/datastore1/vm-shutdown.sh' >> /var/spool/cron/crontabs/root
/bin/echo '45 13 * * * /vmfs/volumes/datastore1/esxi-shutdown.sh' >> /var/spool/cron/crontabs/root
/usr/lib/vmware/busybox/bin/busybox crond
cat /var/spool/cron/crontabs/root

会输出如下结果,可以看到成功添加了定时关机命令(输出结果可能会有变动,请按照实际情况判断。)

#min hour day mon dow command
1    1    *   *   *   /sbin/tmpwatch.py
1    *    *   *   *   /sbin/auto-backup.sh
0    *    *   *   *   /usr/lib/vmware/vmksummary/log-heartbeat.py
*/5  *    *   *   *   /bin/hostd-probe.sh ++group=host/vim/vmvisor/hostd-probe/stats/sh
00   1    *   *   *   localcli storage core device purge
*/10 *    *   *   *   /bin/crx-cli gc
40 13 * * * /vmfs/volumes/datastore1/vm-shutdown.sh
45 13 * * * /vmfs/volumes/datastore1/esxi01-shutdown.sh

到此为止,已经完成了ESXI7.0下的定时关闭虚拟机并自动关机的目的,感兴趣小伙伴可以自行尝试一下。如果有什么问题,请在下方留言。

Last modification:March 17, 2022
如果觉得我的文章对你有用,请随意赞赏