本文由 简悦 SimpRead 转码, 原文地址 anby.org

前言在家庭环境中,考虑到省电问题(服务器晚上也挺吵的),购买了小米的智能插座,设置了一个定时开关插座任务。(9:00 开启 23:00 关闭)关于服务器的通电自动开机,在 dell poweredge …

在家庭环境中,考虑到省电问题(服务器晚上也挺吵的),购买了小米的智能插座,设置了一个定时开关插座任务。(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 连接。

182-1-1.png

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

  1. 用 vim 文本编辑打开

1
vi /etc/rc.local.d./local.sh
  1. 在 exit 0 这一行之前添加如下的脚本并退出保存:

1
2
3
4
5
6
7
8
9
#关闭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 文件每次更改后想要永久保存设置的话,就需要手动执行一次。)

1
/sbin/auto-backup.sh

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

1
2
3
4
5
6
7
8
9
10
11
12
13
#查询现有的虚拟机一览,可以查询到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

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

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
#查询虚拟机的电源状态。(开机、关机)
#例: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

1
vim-cmd vmsvc/getallvms
  1. 创建关闭虚拟机脚本文件

1
vi /vmfs/volumes/datastore1/vm-shutdown.sh
  1. 向脚本文件添加命令并保存

1
2
3
4
5
6
7
#!/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
  1. 创建关机脚本文件

1
vi /vmfs/volumes/datastore1/esxi-shutdown.sh
  1. 向脚本文件添加命令并保存

1
2
3
4
#!/bin/sh

#关闭esxi主机电源
/sbin/poweroff
  1. 给关闭虚拟机、关机的脚本添加可执行权限

1
2
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 后输入以下命令:

1
cat /var/spool/cron/crontabs/root

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

1
2
3
4
5
6
7
8
9
#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
  1. 手动命令生效法

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

1
2
3
4
5
/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

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

1
2
3
4
5
6
7
8
9
#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 下的定时关闭虚拟机并自动关机的目的,感兴趣小伙伴可以自行尝试一下。如果有什么问题,请在下方留言。